使进程和服务不被杀死的思考

总结来说,使进程和服务不被杀死有俩种方法:
1.使用守护进程,即有俩个进程,当其中一个被kill后,另一个进程会来拉起,俩个进程互相守护不被kill。极光推送和微信这类app就是用的这样的方法,这也是实用性最高的方法,我还没有时间深入研究,暂且不表。

2.将app内置到/system/app目录下,此为系统应用目录,拥有很高的权限,用户在没root的情况下是卸载不了的,同时在配置文件的application下,加上android:persistent=”true”,如下:

<application android:name="app"
                 android:persistent="true"
                 android:label="@string/fdd"
                 android:icon="@drawable/ic_launcher">
         ...
    </application>

设置后app提升为系统核心级别,任何情况下不会被kill掉, settings->applications里面也会屏蔽掉stop操作。


以上是保护进程不被kill的俩种方法,下面说服务不被kill的方法:

如果你的app没有使用任何方法来维持,你还想维持你的服务不被杀死,那是不可能的,只能尽量维持,如提高服务的优先级,做到尽量维持,服务不被杀死的前提都是你的app不被kill掉,一旦你的app被kill,你的服务都很容易被杀死,而且如果你bindService了,那么你的服务会直接gg

如果你使用了我上面说的方法来维持app,那么你可以继续看下面。思路是,创建静态广播监听一些常出现的系统广播,当监听到时,再次启动你的服务,从而来达到你的服务不能被杀死的目的:
首先注册静态广播(假如你的广播名字的myReceiver),然后在里面加入你要监听的系统广播,需要注意的是,如果是新安装应用,从来都没启动过,这个时候是收不到广播的,如果程序曾经启动过一次,那么一切都正常,为了解决这个问题,需加入这个参数android:exported=”true”,在发送intent的地方加上FLAG_INCLUDE_STOPPED_PACKAGES(intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES)):

<receiver android:name=".myReceiver" >
      <intent-filter android:priority="2147483647"<!--优先级加最高-->
                     android:exported="true" >
        <!-- 系统启动完成后会调用 -->
        <action android:name="android.intent.action.BOOT_COMPLETED" />       
        <!-- 解锁完成后会调用 -->
        <action android:name="android.intent.action.USER_PRESENT" />
        <!-- 监听情景切换 -->
        <action android:name="android.media.RINGER_MODE_CHANGED" />       
      </intent-filter>
</receiver>

需要权限:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

创建广播接受者,在里面启动你的服务:

public class myReceiver extends BroadcastReceiver
{
 @Override
 public void onReceive(Context context, Intent intent)
 {
 context.startService(new Intent(context, Service.class));
 }
}

在服务内加入以下方法:

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        flags = START_STICKY;//START_STICKY是service被kill掉后自动重写创建
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        Intent localIntent = new Intent();
        localIntent.setClass(this, LoadService.class); // 销毁时重新启动Service
        this.startService(localIntent);
    }

以上!

在查相关资料时还找到了一些有趣的东西,在这里记一下:

静态广播:
可在AndroidManifest.xml中定义,不需程序启动即可接收,可用作自动启动程序

Intent.ACTION_BOOT_COMPLETED //系统启动完成
Intent.ACTION_MEDIA_MOUNTED //SD卡挂载
Intent.ACTION_MEDIA_UNMOUNTED //SD卡卸载
Intent.ACTION_USER_PRESENT//解除锁屏
ConnectivityManager.CONNECTIVITY_ACTION//网络状态变化

动态广播:
只能在代码中注册,程序适应系统变化做操作,程序运行状态才能接收到

Intent.ACTION_SCREEN_ON //屏幕亮
Intent.ACTION_SCREEN_OFF //屏幕灭
Intent.ACTION_TIME_TICK //时间变化  每分钟一次
展开阅读全文

没有更多推荐了,返回首页