Android无法杀死的进程?

时间:2015-07-28 20:18:04

标签: android broadcastreceiver android-service android-broadcast

如果没有可见的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杀死进程和服务?当然,我不打算在我的申请中实施,但我很好奇,如果这样做有用。

1 个答案:

答案 0 :(得分:1)

Thread.sleep()中使用onReceive()也可以获得ANR。 <{1}}必须在10秒后返回,否则你的进程会获得ANR并被杀死。

有两种方法可以确保您的流程不被杀死:

首先是你提到的onReceive()。除非您修改AOSP,否则会附带一条您无法隐藏的通知。

第二种方法仅适用于构建固件。您可以在startForeground()

中添加android:persistant="true"属性

对于常规应用,最好的方法是使用AndroidManifest.xml来显着降低被杀的可能性,并让Android在被杀时自动重启您的服务。为了确保它再次启动,您可以使用AlarmManager。