文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Android O对后台Service限制怎么解决

2023-07-04 15:14

关注

本文小编为大家详细介绍“Android O对后台Service限制怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android O对后台Service限制怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

Service问题

Service没有界面,运行于后台,它会消耗设备资源,并且可能会导致不好的用户体验,例如资源占用过多,导致设备运行不流畅。为了缓解这个问题,Android O版本(Android 8.0, API 26)对后台Service强加了一些限制。注意,只是对后台Service加了限制,前台Service不受影响。

什么是前台应用

在解释后台Service的限制之前,首先需要知道什么是前台应用,什么是后台应用。

一个前台应用必须满足如下某一个条件:

前台Service和后台Service

那么前台Service和后台Service如何区分呢?

前台Service会发送一条通知,让用户察觉到有一个Service正在运行,而后台Service没有通知,用户不会察觉到有一个Service正在运行。

那么前台Service和后台Service是如何启动的呢?

对于后台Service,很简单,通过Context.startService()启动的就是后台Service。

对于前台Service呢,这个有点复杂。在Android 8.0之前,首先通过Context.startService()启动一个后台Service,然后通过Service.startForeground()发送一条通知,如此一来,后台Service就变成了前台Service。但是从Android 8.0开始,系统限制了后台app创建后台服务,所以就无法再使用之前的方法把后台Service提升到前台。

为了解决后台app无法创建前台Service问题,Android 8.0又引入了一个新方法Context.startForegroundService()来直接启动一个前台Service,但是当系统创建这个前台Service后,应用需要在5秒内调用Service.startForeground()来显示一个通知,否则系统会停止这个前台Service,并弹出ANR。

从Android 9.0开始(Android P, API 28),如果要创建前台Service,还要在AndroidManifest.xml中声明android.permission.FOREGROUND_SERVICE权限,这是一个普通的权限,系统会自动授予app。如果不这样做,会抛出异常。

下面给出一个例子,如何创建前台Service。

首先App的目标版本是Android 10(API 29),那么需要在清单文件中声明权限。

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

然后在Activity中启动前台Service,为了兼容Android 8.0之前的版本,代码应该如下

    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mIntent = new Intent(this, MyService.class);        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {            startForegroundService(mIntent);        } else {            startService(mIntent);        }    }

我们还要记得在任务完成时销毁Service,可以在Activity的onDestroy()中调用stopService(),也可以在Service中调用stopSelf()。到底调用哪种需要根据具体要求来选择。

在Service创建时,我们需要调用Service.startForeground()

    public void onCreate() {        super.onCreate();        // 发送通知,把service置于前台        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);        // 从Android 8.0开始,需要注册通知通道        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {            NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID,                    "Service notification channel", NotificationManager.IMPORTANCE_DEFAULT);            notificationManager.createNotificationChannel(notificationChannel);        }        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)                .setSmallIcon(R.mipmap.ic_launcher)                .setContentTitle("Service");        // 注意第一个参数不能为0        startForeground(666, builder.build());    }

后台Service限制

当一个app处于前台时,它可以随意创建和使用后台服务。当这个app进入后台,它只有几分钟的窗口期可以创建和使用服务。当这个窗口期结束后,系统认为这个app进入了空闲状态,此时系统会停止app的后台服务。

解决后台Service限制

官方建议使用JobScheduler替换后台Service,官方还举了一个例子,有一个图库app需要检测当前用户是否收到了来自朋友分享的图片,即使app没有运行于前台。在Android 8.0之前,可以使用后台Service来检测应用的云存储,但是这有一个问题,这个Service一起在后台运行,它会消耗资源,影响手机性能。但是从Android 8.0,使用JobScheduler替换后台Service,它会周期性启动一个任务,查询服务器,然后退出。相比于后台Service,它消耗的资源明显较少,间接提升了手机性能。

读到这里,这篇“Android O对后台Service限制怎么解决”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯