Android:以巨大的延迟调度崩溃服务的重启?

时间:2011-11-08 00:09:20

标签: android service

我有一个正在运行的操作系统正在查杀 - 问题是当它杀死它并安排重启时,它被安排在一小时后重启。这项服务维护了两个用于蓝牙连接更改的接收器,这就是为什么我需要更快地重新启动而不是在“重启”状态超过一个小时。

以下是日志中的剪辑:

I/ActivityManager( 1064): No longer want com.deadbeat.bta (pid 25455): hidden #17
W/ActivityManager( 1064): Scheduling restart of crashed service com.deadbeat.bta/com.deadbeat.btalib.BTService in 3600210ms`

在这3600秒过后,它会简单地将其杀死,并在2小时后再次重新安排,依此类推。发生这种情况时,似乎没有调用onDestroy(),onCreate()和onStartCommand()。启动主要活动将成功重新启动服务,所有这些都将在几个小时内完成,直到再次开始。

当我进行更改时,这开始发生,这需要我在服务启动时传递额外内容。

这是我的onStartCommand和onCreate,如果这有帮助...

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d("BTA", ">>> onStartCommand()");
    setIntent(intent);

    Bundle extras = getIntent().getExtras();
    if (extras != null) {
        setGlobals((Globals) extras.getSerializable("Globals"));
    }
    if (getGlobals() == null) {
        Log.e("BTA", "!!! Call an ambulance!!");
    }
    Log.i(getGlobals().getLogPrefix(), ">>> Service starting up");

    setWorker(new BTAWorker(this, getGlobals()));
    getWorker().doLog("Service Worker Set and Active");

    return START_REDELIVER_INTENT;
}

@Override
public void onCreate() {
    // Create
    super.onCreate();
    Log.d("BTA", ">>> onCreate()");
    // Register BroadcastReceiver with connect and disconnect actions
    IntentFilter intentToReceiveFilter = new IntentFilter();
    intentToReceiveFilter.addAction("android.bluetooth.device.action.ACL_CONNECTED");
    intentToReceiveFilter.addAction("android.bluetooth.device.action.ACL_DISCONNECTED");
    registerReceiver(this.mIntentReceiver, intentToReceiveFilter, null, this.mHandler);
    Log.d("BTA", ">>> Bluetooth State Receiver registered");
    Log.d("BTA", ">>> Intent = " + getIntent());
}

对于我所做错的任何建议都将不胜感激。我已经搜索过了,但没有发现任何与重新启动这个长时间延迟有关的事情。父活动是否必须处于活动状态才能使START_REDELIVER_INTENT生效? (因此,当我的主要活动被清理干净时,如果不重新打开主要活动,我将无法重新启动服务?),或者还有其他事情发生了?

1 个答案:

答案 0 :(得分:3)

我完全处于同样的境地。 3M-9M ms的重启时间非常长。

我对这个问题进行了很多研究,很多次我发现startForeground可以解决所有问题。但我对这个解决方案并不满意。

在我的情况下,我使用HandlerThread来处理后台任务,解决方案是将此线程优先级THREAD_PRIORITY_BACKGROUND更改为默认值。令人讨厌的是我在官方服务示例中找到了THREAD_PRIORITY_BACKGROUND。

onStartCommand仍然没有被调用但是在我将所有内容移动到onCreate之后(onStartCommand只返回START_STICKY),现在一切正常。