开发Service时的一些总结(保活)


如何保证Service在后台长期的存活

在开发中,比较尬的事情就是你的服务在后台被莫名其妙的回收了或者kill了。怎么才能保证自己的服务能够长长久久的存在呢?这里是自己的一点总结,能够有效的保证服务的存活。这里我需要注意一下 如果用户没有给你的App添加白名单,然后用户利用系统本身的一键清理或者类似的功能时 以下的方法是没用的。这里的方法只适用于用户没有主动的去结束掉你的应用的场景。如果你想像QQ 微信等这些你可以参考下面的连接中的 (用Native进程拉活),我也是在这些文章中总结的。

参考连接

1.提高服务的优先级(priority)----就搞到最高优先级

priority 必须是整数,默认是0    范围是[-1000, 1000]

在AndroidManifest中给你的服务加上优先级例子:

这是第一步,单凭这一点是不够的,因为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中的配置

android:configChanges="keyboardHidden|orientation|screenSize|navigation|keyboard"

android:excludeFromRecents="true"

android:exported="false"

android:finishOnTaskLaunch="false"

android:launchMode="singleInstance"

android:theme="@style/sever_Them">


开发Service时的一些总结(保活)_第1张图片

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

你可能感兴趣的:(开发Service时的一些总结(保活))