如何保证Service在后台长期的存活
在开发中,比较尬的事情就是你的服务在后台被莫名其妙的回收了或者kill了。怎么才能保证自己的服务能够长长久久的存在呢?这里是自己的一点总结,能够有效的保证服务的存活。这里我需要注意一下 如果用户没有给你的App添加白名单,然后用户利用系统本身的一键清理或者类似的功能时 以下的方法是没用的。这里的方法只适用于用户没有主动的去结束掉你的应用的场景。如果你想像QQ 微信等这些你可以参考下面的连接中的 (用Native进程拉活),我也是在这些文章中总结的。
1.提高服务的优先级(priority)----就搞到最高优先级
priority 必须是整数,默认是0 范围是[-1000, 1000]
在AndroidManifest中给你的服务加上优先级例子:
<service android:name="xxx"android:priority="1000">
这是第一步,单凭这一点是不够的,因为Android在清理的时候会按照进程的优先级来杀掉部分来回收内存,所以第二步我们需要提高咋们进程的优先级。
2.提高进程的优先级-----怎么高怎么来,要搞就搞最高。
2.1:进程的优先级划分
进程的优先级主要分为5级
1.前台进程(Foreground process)
2.可见进程(Visible process)
3.服务进程(Service process)
4.后台进程(Background process)
5.空进程(Empty process)
这里就不做具体介绍 直接上方法。
2.2:如何在适当的时候提高优先级
我这里的应对方案是 在系统锁屏时 启动一个1像素透明的Activity 这样当锁屏后 我的进程优先级从4一下就变成了高富帅的1最高优先级效果就非常的巴适.
具体方法:
1.创建一个透明的Activity。
public classSeverAcitvityextendsActivity {
@Override
protected voidonCreate(@NullableBundle savedInstanceState) {
super.onCreate(savedInstanceState);
YouMaLiveManager.getYouMaLiveManager().addActivity(this);
Window window=getWindow();
window.setGravity(Gravity.LEFT|Gravity.TOP);
WindowManager.LayoutParams params=window.getAttributes();
params.x=0;
params.y=0;
params.width=1;
params.height=1;
window.setAttributes(params);
Logger.d("透明Activity被启动");
}
@Override
protected voidonDestroy() {
Logger.d("透明Activity被销毁");
super.onDestroy();
}
}
2.AndroidManifest中的配置
<activity android:name=".ui.activity.SeverAcitvity"
android:configChanges="keyboardHidden|orientation|screenSize|navigation|keyboard"
android:excludeFromRecents="true"
android:exported="false"
android:finishOnTaskLaunch="false"
android:launchMode="singleInstance"
android:theme="@style/sever_Them">
</activity>
3.注册广播灭屏和解锁广播 当灭屏时启动透明Activity提高进程优先级到最高1.解锁后销毁透明Activity.这里有我自己的业务逻辑,可以忽略。
private voidinitBroadcastReceiver() {
finalIntentFilter filter =newIntentFilter();
//屏幕灭屏广播
filter.addAction(Intent.ACTION_SCREEN_OFF);
//屏幕解锁广播
filter.addAction(Intent.ACTION_USER_PRESENT);
mBatInfoReceiver=newBroadcastReceiver() {
@Override
public voidonReceive(finalContext context, finalIntent intent) {
String action = intent.getAction();
if(Intent.ACTION_SCREEN_OFF.equals(action)) {
Intent go_SeverAcitvity =newIntent(context,SeverAcitvity.class);
go_SeverAcitvity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(go_SeverAcitvity);
Logger.d("灭屏");
}else if(Intent.ACTION_USER_PRESENT.equals(action)) {
// Logger.d("屏幕解锁");
isGonView=true;
//销毁透明Activity
YouMaLiveManager.getYouMaLiveManager().finishActivity();
//我自己的业务逻辑
Intent go_star =newIntent(context,MovenmentStarActivity.class);
go_star.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(go_star);
}
}
};
registerReceiver(mBatInfoReceiver,filter);
}
通过以上方法可以保证应用在后台的长期存活。这里还有一个方法 就是让服务在通知栏里弹出一个通知这样可以将优先级提高到2 但这样会让用户有所感知上面的参考文章中有提到解决方案。
4.让服务自己拉活
在服务的onStartCommand方法中returnService.START_STICKY; 这样在系统允许的情况下回自动拉活 这个需要App有自启权限 大部分用户不会主动设置 所以基本无用。
以上就是自己的一点小结 再次贴出参考的文章
http://blog.csdn.net/u011622280/article/details/52311344
网友评论