美文网首页
开发Service时的一些总结(保活)

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

作者: Android开发小白 | 来源:发表于2017-09-07 18:07 被阅读0次

    如何保证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

    相关文章

      网友评论

          本文标题:开发Service时的一些总结(保活)

          本文链接:https://www.haomeiwen.com/subject/ctnijxtx.html