欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android9.0以上当切换程序后,service在后台运行一分钟左右就自动停止的解决方案

程序员文章站 2022-06-22 08:47:24
service作为安卓四大组件之一,在开发项目中很多人都会用到,不知道大家有没有发现,在android9.0以上的系统,如果你在app启动了一个service,当你切换到另一个app时,在之前的安卓系统service还是会在运行的,但是当升级到android9.0的系统,你会发现,service在后台运行一分钟左右就会自动停止了,下面来给大家介绍一下如何使service一直在后台运行:首先我们来了解一下官方文档上android9.0默认关掉后台运行的service的原因:1、在后台运行应用会消耗设备...

service作为安卓四大组件之一,在开发项目中很多人都会用到,不知道大家有没有发现,在android9.0以上的系统,如果你在app启动了一个service,当你切换到另一个app时,在之前的安卓系统service还是会在运行的,但是当升级到android9.0的系统,你会发现,service在后台运行一分钟左右就会自动停止了,下面来给大家介绍一下如何使service一直在后台运行:

首先我们来了解一下官方文档上android9.0默认关掉后台运行的service的原因:

1、在后台运行应用会消耗设备的有限资源,如内存或者电池电量,进而影响用户的使用体验,比如说,后台任务可能会缩短设备的续航时间,或者在用户玩游戏、看视频或拍照时造成系统卡顿。

2、为了改善续航表现和用户体验,Android 在版本演进的过程中,针对后台执行进行了不同程度的限制,其中包括:

     低耗电模式和应用待机模式: 如果设备未插接电源,处于空闲状态一段时间且屏幕关闭,系统会进入低耗电或者待机模式,并对       应用行为施加相应限制;

    后台位置限制: 对后台应用获取用户当前位置的频率进行限制;

    后台服务限制: 限制应用在后台运行服务,并禁止应用通过隐藏/不可见方式调用 CPU 或网络资源;

   近期新增特性及优化项: (1) 应用待机群组: 限制非活跃应用对设备资源的调用; (2) 后台限制: 当系统检测到应用出现不良行为时,     系统会向用户询问是否要限制该应用在后台访问设备资源; (3) 省电助手功能优化。
 

解决思路:
Service启动时创建一条通知,与其绑定,这样锁屏或者后台Service都不会被暂停或杀死。

创建一个service类,在onCreate方法里执行如下代码:

    private String notificationId = "serviceid";
    private String notificationName = "servicename";
    private void showNotification(){
        notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        //创建NotificationChannel
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
            NotificationChannel channel = new NotificationChannel(notificationId, notificationName, NotificationManager.IMPORTAN                                                                                                     CE_HIGH);
            notificationManager.createNotificationChannel(channel);
        }
        startForeground(1,getNotification());
    }
    private Notification getNotification() {
        Notification.Builder builder = new Notification.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("title")
                .setContentText("text");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            builder.setChannelId(notificationId);
        }
        Notification notification = builder.build();
        return notification;
    }

注意要加上这个权限:<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>

以上方法就可以使service一直在后台运行了。
 

本文地址:https://blog.csdn.net/qq_33979657/article/details/107199459