【问题标题】:Android onStartCommand flagsAndroid onStartCommand 标志
【发布时间】:2017-01-17 14:39:16
【问题描述】:

我有一个简单的服务:

public class TestService extends Service {

final String LOG_TAG = "myLogs";

public void onCreate() {
    super.onCreate();
    Log.d(LOG_TAG, "TestService onCreate");
}

public void onDestroy() {
    super.onDestroy();
    Log.d(LOG_TAG, "TestService onDestroy");
}

public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(LOG_TAG, "TestService onStartCommand")
    readFlags(flags);
    MyRun mr = new MyRun(startId);
    new Thread(mr).start();
    return START_REDELIVER_INTENT;
}

public IBinder onBind(Intent arg0) {
    return null;
}

void readFlags(int flags) {
    switch (flags) {
        case START_FLAG_REDELIVERY:
            Log.d(LOG_TAG, "START_FLAG_REDELIVERY");
            break;
        case START_FLAG_RETRY:
            Log.d(LOG_TAG, "START_FLAG_RETRY");
            break;
        default:
            Log.d(LOG_TAG, "Flag: " + flags);
    }
}

class MyRun implements Runnable {

    int startId;

    public MyRun(int startId) {
        this.startId = startId;
        Log.d(LOG_TAG, "Run#" + startId + " create");
    }

    public void run() {
        Log.d(LOG_TAG, "Run#" + startId + " start");
        try {
            TimeUnit.SECONDS.sleep(15);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        stop();
    }

    void stop() {
        Log.d(LOG_TAG, "Run#" + startId + " end, stopSelfResult("
                + startId + ") = " + stopSelfResult(startId));
    }
}

如果我理解正确,标记 START_REDELIVER_INTENT 应该尽快重新启动我的服务,因为有足够的可用内存。 但是(我已经在 3 台设备(4.1.2、4.4.2 和 6.0.1)上检查过)当我终止 proc 时,服务仅在其中 1 台(4.1.2)上重新启动:

 D/myLogs: TestService onCreate
 D/myLogs: TestService onStartCommand
 D/myLogs: START_FLAG_REDELIVERY
 D/myLogs: MyRun#1 create
 D/myLogs: MyRun#1 start
 D/myLogs: MyService onDestroy
 D/myLogs: MyRun#1 end, stopSelfResult(1) = true

另外两个设备有什么问题? 其他标志也有同样的问题,例如START_STICKY - 服务进程永久终止。

【问题讨论】:

  • 这些设备的品牌和型号是什么?一些制造商已经设置了限制,不允许服务留在后台,比如华为

标签: android service


【解决方案1】:

覆盖 onLowMemory() 方法并将 Log.d 标记也放在那里,它会告诉您操作系统何时会在资源紧缩时尝试停止服务。

START_REDELIVER_INTENT- 告诉系统在崩溃后重新启动服务,并重新传递崩溃时存在的意图。崩溃可能是因为资源不足。

如果资源紧缩没有发生,操作系统不会停止您的活动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 2012-12-20
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多