美文网首页
Service设置startForeground不被杀死

Service设置startForeground不被杀死

作者: 失足者 | 来源:发表于2019-07-08 12:52 被阅读0次

首先Service是运行于后台进程的,这个跟运行的线程没有关系,Service是运行于UI主线程的。

先看看进程的优先级:前台进程 一 可视进程 一 服务进程 一 后台进程 一 空进程。

现在可以使用startForeground将service放到前台状态,这样低内存时,被杀死的概率会低一些;

那么得怎么实现呢,下面是个例子,和需要注意的地方:

申请服务通知权限:


FOREGROUND_SERVICE

Added in API level 28 Android 9.0

public static final String FOREGROUND_SERVICE

Allows a regular application to use Service.startForeground.

Protection level: normal

Constant Value: android.permission.FOREGROUND_SERVICE


<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

示例代码:


//这里要注意一点:hannelid必须要一致,否者服务还是一样会被杀死

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    NotificationChannel notificationChannel = mNotificationManager.getNotificationChannel("MyService");

    if (notificationChannel ==null) {

NotificationChannel channel =new NotificationChannel("MyService",

                "com.example.liyun.testservice", NotificationManager.IMPORTANCE_HIGH);

        //是否在桌面icon右上角展示小红点

        channel.enableLights(true);

        //小红点颜色

        channel.setLightColor(Color.RED);

        //通知显示

        channel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);

        //是否在久按桌面图标时显示此渠道的通知

//channel.setShowBadge(true);

        mNotificationManager.createNotificationChannel(channel);

    }

}

int notifyId = (int) System.currentTimeMillis();

NotificationCompat.Builder mBuilder =new NotificationCompat.Builder(this, "MyService");

mBuilder.setSmallIcon(R.drawable.ic_launcher_background);

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {

mBuilder.setContentTitle(getResources().getString(R.string.app_name));

}

//当id设置为0时,隐藏不显示通知,那么服务在60s后一样时会被杀死的。

//要如何隐藏通知而服务不被杀死,这个还在学习中。

startForeground(1,mBuilder.build());

最后要在onDestroy中销毁服务


stopForeground(true);

非常感谢一下这篇文章提供的学习,

参考链接:https://blog.csdn.net/lxk_1993/article/details/93870741

NotificationChannel api参考链接

附:如何保证Service不被杀死?


参考回答:

**onStartCommand方式中,返回START_STICKY或则START_REDELIVER_INTENT**

**START_STICKY**:如果返回START_STICKY,表示Service运行的进程被Android系统强制杀掉之后,Android系统会将该Service依然设置为started状态(即运行状态),但是不再保存onStartCommand方法传入的intent对象

**START_NOT_STICKY**:如果返回START_NOT_STICKY,表示当Service运行的进程被Android系统强制杀掉之后,不会重新创建该Service

**START_REDELIVER_INTENT**:如果返回START_REDELIVER_INTENT,其返回情况与START_STICKY类似,但不同的是系统会保留最后一次传入onStartCommand方法中的Intent再次保留下来并再次传入到重新创建后的Service的onStartCommand方法中

**提高Service的优先级**在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播;

**在onDestroy方法里重启Service**当service走到onDestroy()时,发送一个自定义广播,当收到广播时,重新启动service;

**提升Service进程的优先级**进程优先级由高到低:前台进程 一 可视进程 一 服务进程 一 后台进程 一 空进程可以使用startForeground将service放到前台状态,这样低内存时,被杀死的概率会低一些;

**系统广播监听Service状态**

**将APK安装到/system/app,变身为系统级应用**

**注意**:以上机制都不能百分百保证Service不被杀死,除非做到系统白名单,与系统同生共死

相关文章

网友评论

      本文标题:Service设置startForeground不被杀死

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