我有一个正在运行的操作系统正在查杀 - 问题是当它杀死它并安排重启时,它被安排在一小时后重启。这项服务维护了两个用于蓝牙连接更改的接收器,这就是为什么我需要更快地重新启动而不是在“重启”状态超过一个小时。
以下是日志中的剪辑:
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
生效? (因此,当我的主要活动被清理干净时,如果不重新打开主要活动,我将无法重新启动服务?),或者还有其他事情发生了?
答案 0 :(得分:3)
我完全处于同样的境地。 3M-9M ms的重启时间非常长。
我对这个问题进行了很多研究,很多次我发现startForeground可以解决所有问题。但我对这个解决方案并不满意。
在我的情况下,我使用HandlerThread来处理后台任务,解决方案是将此线程优先级THREAD_PRIORITY_BACKGROUND更改为默认值。令人讨厌的是我在官方服务示例中找到了THREAD_PRIORITY_BACKGROUND。
onStartCommand仍然没有被调用但是在我将所有内容移动到onCreate之后(onStartCommand只返回START_STICKY),现在一切正常。