我有一个类似的问题。一段时间后,在某些设备上,Android 会终止我的服务,甚至startForeground()也无济于事。我的客户不喜欢这个问题。我的解决方案是使用AlarmManager类来确保服务在必要时运行。我使用AlarmManager创建一种看门狗定时器。它不时检查服务是否应该运行并重新启动它。我还使用SharedPreferences来保留服务是否应该运行的标志。
创建/关闭我的看门狗定时器:
void setServiceWatchdogTimer(boolean set, int timeout)
{
Intent intent;
PendingIntent alarmIntent;
intent = new Intent(); // forms and creates appropriate Intent and pass it to AlarmManager
intent.setAction(ACTION_WATCHDOG_OF_SERVICE);
intent.setClass(this, WatchDogServiceReceiver.class);
alarmIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
if(set)
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeout, alarmIntent);
else
am.cancel(alarmIntent);
}
从看门狗定时器接收和处理意图:
/** this class processes the intent and
* checks whether the service should be running
*/
public static class WatchDogServiceReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
if(intent.getAction().equals(ACTION_WATCHDOG_OF_SERVICE))
{
// check your flag and
// restart your service if it's necessary
setServiceWatchdogTimer(true, 60000*5); // restart the watchdogtimer
}
}
}
事实上,我使用WakefulBroadcastReceiver 而不是BroadcastReceiver。我给了你 BroadcastReceiver 的代码只是为了简化它。