如果没有可见的UI组件,我一直在想是否有办法阻止Android杀死应用程序进程。
例如,有一个Service
执行一些重要的工作。开发者不希望通过startForeground
显示任何通知,因此,根据http://developer.android.com/guide/components/processes-and-threads.html,该流程将具有服务流程级别。因此,如果系统将承受巨大的内存压力,那么android将很有可能停止服务。
我心中有一个疯狂的想法。根据该页面,如果
,该流程将具有前景流程级别它托管
BroadcastReceiver
执行其onReceive()
方法。
如果开发人员使用onReceive()
永不停止的服务和广播接收器启动单独的流程,该怎么办?
代码看起来像这样。例如,开发人员有一个IntentService
和一个BroadcastReceiver
,可以处理单独的流程:
<service
android:name=".MyService"
android:process=":myprocess">
</service>
<receiver
android:name=".MyReceiver"
android:process=":myprocess">
<intent-filter>
<action android:name="MY_ACTION" />
</intent-filter>
</receiver>
BroadcastReceiver
看起来像这样:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// block main thread
try {
Thread.sleep(5000);
} catch (InterruptedException e) {}
// run this receiver again
Intent intent = new Intent();
intent.setAction(MY_ACTION);
context.sendBroadcast(intent);
}
}
所以,这里发生的是开发人员阻止onReceive
方法,以便进程保持在前台。线程休眠5秒,因为10秒延迟将导致ANR(根据http://developer.android.com/reference/android/content/BroadcastReceiver.html)。据我所知,这里阻止UI线程没有危险,因为接收器在一个单独的进程上工作。然后接收器向自己发送一个新的广播,这个过程永远不会停止,直到开发人员在运行时通过PackageManager
禁用接收器。
同时,开发人员通过IntentService
电话与startService
进行互动。 IntentService
适用于后台线程,因此它不会受MyReceiver
。
那么,如果内存运行不足,是否会阻止Android杀死进程和服务?当然,我不打算在我的申请中实施,但我很好奇,如果这样做有用。
答案 0 :(得分:1)
在Thread.sleep()
中使用onReceive()
也可以获得ANR。 <{1}}必须在10秒后返回,否则你的进程会获得ANR并被杀死。
有两种方法可以确保您的流程不被杀死:
首先是你提到的onReceive()
。除非您修改AOSP,否则会附带一条您无法隐藏的通知。
第二种方法仅适用于构建固件。您可以在startForeground()
android:persistant="true"
属性
对于常规应用,最好的方法是使用AndroidManifest.xml
来显着降低被杀的可能性,并让Android在被杀时自动重启您的服务。为了确保它再次启动,您可以使用AlarmManager。