总结来说,使进程和服务不被杀死有俩种方法:
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 //时间变化 每分钟一次