3 回答
TA贡献1804条经验 获得超8个赞
您可以使用startForeground()在前台运行服务。
前台服务是一种被认为是用户积极了解的服务,因此不适合当内存不足时被系统杀死的服务。
但是请记住,前台服务必须为状态栏提供一条通知(在此处阅读),并且除非该服务被停止或从前台中删除,否则不能取消该通知。
注意:这仍然不能绝对保证在内存极低的情况下不会终止该服务。这只会使其被杀的可能性降低。
TA贡献1784条经验 获得超2个赞
最近,我对您遇到的同样问题感到困惑。但是现在,我找到了一个很好的解决方案。首先,您应该知道,即使您的服务已被OS杀死,您的服务的onCreate方法也将在短时间内被OS调用。因此,您可以使用onCreate方法执行以下操作:
@Override
public void onCreate() {
Log.d(LOGTAG, "NotificationService.onCreate()...");
//start this service from another class
ServiceManager.startService();
}
@Override
public void onStart(Intent intent, int startId) {
Log.d(LOGTAG, "onStart()...");
//some code of your service starting,such as establish a connection,create a TimerTask or something else
}
“ ServiceManager.startService()”的内容为:
public static void startService() {
Log.i(LOGTAG, "ServiceManager.startSerivce()...");
Intent intent = new Intent(NotificationService.class.getName());
context.startService(intent);
}
但是,此解决方案仅适用于您的服务被GC终止的情况。有时我们的服务可能会被程序管理器的用户终止。在这种情况下,您的职业将被杀死,并且您的服务将永远不会被实例化。因此,您的服务无法重新启动。但是好消息是,当PM终止您的服务时,它将调用您的onDestroy方法。因此我们可以使用该方法来做些事情。
@Override
public void onDestroy() {
Intent in = new Intent();
in.setAction("YouWillNeverKillMe");
sendBroadcast(in);
Log.d(LOGTAG, "onDestroy()...");
}
字符串“ YouWillNeverKillMe”是一个自定义操作。此方法最重要的是,在发送广播之前不要添加任何代码。由于系统不会等待onDestroy()的完成,因此必须尽快发送广播。然后在manifast.xml中注册一个接收者:
<receiver android:name=".app.ServiceDestroyReceiver" >
<intent-filter>
<action android:name="YouWillNeverKillMe" >
</action>
</intent-filter>
</receiver>
最后,创建一个BroadcastReceiver,并使用onReceive方法启动服务:
@Override
public void onReceive(Context context, Intent intent) {
Log.d(LOGTAG, "ServeiceDestroy onReceive...");
Log.d(LOGTAG, "action:" + intent.getAction());
Log.d(LOGTAG, "ServeiceDestroy auto start service...");
ServiceManager.startService();
}
希望这对您有所帮助,请原谅我那可怜的英语。
- 3 回答
- 0 关注
- 581 浏览
添加回答
举报