进程、服务守护防杀的实现,对于每一位开发者来讲,都是一部与某系统、某卫士、某助手、某管家、某大师斗争的血泪史。
咱们经常使用的进程守护的套路无外乎如下几种,大部份内容摘录自Never-say-Never的博客java
套路一.提升进程的优先级数值
对于Service被系统回收,通常作法是经过提升优先级能够解决,在AndroidManifest.xml文件中对于intent-filter能够经过android:priority = “1000”这个属性设置最高优先级,1000是最高值,若是数字越小则优先级越低。android
套路二.改变进程等级
Android中的进程是托管的,当系统进程空间紧张的时候,会依照优先级自动进行进程的回收。Android将进程分为6个等级,它们按优先级顺序由高到低依次是:shell
1.前台进程( FOREGROUND_APP)
2.可视进程(VISIBLE_APP )
3.次要服务进程(SECONDARY_SERVER )
4.后台进程 (HIDDEN_APP)
5.内容供应节点(CONTENT_PROVIDER)
6.空进程(EMPTY_APP)markdown
咱们能够用 setForeground(true) 来设置 Service 的优先级。app
1.若是service正在调用onCreate,onStartCommand或者onDestory方法,那么用于当前service的进程则变为前台进程以免被killed。
2.若是当前service已经被启动(start),拥有它的进程则比那些用户可见的进程优先级低一些,可是比那些不可见的进程更重要,这就意味着service通常不会被killed.
3.若是客户端已经链接到service
(bindService),那么拥有Service的进程则拥有最高的优先级,能够认为service是可见的。
4.若是service能够使用startForeground(int,
Notification)方法来将service设置为前台状态,那么系统就认为是对用户可见的,并不会在内存不足时killed。
5.若是有其余的应用组件做为Service,Activity等运行在相同的进程中,那么将会增长该进程的重要性。eclipse
套路三.设置 android:persistent属性为true
<application android:name="com.test.Application" android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" <span style="color:#ff0000;"> android:persistent="true"</span> android:theme="@style/AppTheme" > </application>
这个属性设置后,的确发现优先级提升很多,或许是至关于系统级的进程,可是仍是没法保证存活ide
套路四.onDestory方法内调用广播,重启Service
当service执行了onDestory的时候,发送一个自定义的广播,当收到广播的时候,从新启动servicethis
@Override public void onDestroy() { Intent sevice = new Intent(this, MainService.class); this.startService(sevice); super.onDestroy(); }
可是当使用相似于360卫士和腾讯管家等第三方应用或是在setting里-应用-强制中止时,APP进程可能就直接被干掉了,onDestroy方法都进不来,因此仍是没法保证存活spa
套路五.监听系统广播判断Service状态
经过系统的一些广播,好比:手机重启、界面唤醒、应用状态改变等等监听并捕获到,而后判断咱们的Service是否还存活,记得加权限.net
<receiver android:name="com.dbjtech.acbxt.waiqin.BootReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.USER_PRESENT" /> <action android:name="android.intent.action.PACKAGE_RESTARTED" /> <action android:name="com.dbjtech.waiqin.destroy" /> </intent-filter> </receiver>
在BroadcastReceiver中:
@Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { System.out.println("手机开机了...."); startUploadService(context); } if (Intent.ACTION_USER_PRESENT.equals(intent.getAction())) { startUploadService(context); } }
这个方法监听多了会致使Service很混乱,带来诸多麻烦
套路六.将APK安装到/system/app成为系统级应用
使用ROOT过的手机
1.把代码编写好后,打包导出apk,copy到手机SD卡根目录下。
2.手机链接eclipse,cmd: adb shell
3.切换root模式,输入:su (若是root过就不会有错误)
4.设置System为读写权限:mount –o remount rw /system (System默认为只读,没法写入,这一步很关键)
5.cd到sd卡跟目录下,确认是否有咱们拷贝到sd卡根目录下的apk(通常都是 storage/sdcard0)
shell@android :/ # cd storage/sdcard0
6.最后,咱们要把apk拷贝到 /System/app中