Android O对后台Service限制详解

 更新时间:2022年11月22日 14:26:52   作者:大胃粥  
这篇文章主要为大家介绍了Android O对后台Service限制详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Service问题

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

什么是前台应用

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

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

  • 有可见的Activity。无论是resume状态还是pause状态,只要可见就行。
  • 有前台Service。
  • 有其它app连接到当前app,通过绑定Service或者使用ContentProvider。

前台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,它消耗的资源明显较少,间接提升了手机性能。

如何使用JobScheduler呢,我将在下一篇文章分享一个下载图片的案例。

参考文献

官方文档 developer.android.google.cn/about/versi…

以上就是Android O对后台Service限制详解的详细内容,更多关于Android O对后台Service限制的资料请关注脚本之家其它相关文章!

相关文章

  • Android使用文件进行数据存储的方法

    Android使用文件进行数据存储的方法

    这篇文章主要介绍了Android使用文件进行数据存储的方法,较为详细的分析了Android基于文件实现数据存储所涉及的相关概念与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • Android中实现在矩形框中输入文字显示剩余字数的功能

    Android中实现在矩形框中输入文字显示剩余字数的功能

    在矩形输入框框中输入文字显示剩余字数的功能在app开发中经常会见到,今天小编就通过实例代码给大家分享android实现输入框提示剩余字数功能,代码简单易懂,需要的朋友参考下吧
    2017-04-04
  • Android TextView 字体滚动效果

    Android TextView 字体滚动效果

    这篇文章主要介绍了Android TextView 字体滚动效果的相关资料,需要的朋友可以参考下
    2017-01-01
  • Android RollPagerView实现轮播图

    Android RollPagerView实现轮播图

    这篇文章主要介绍了Android RollPagerView实现轮播图的相关资料,这里提供实例来实现轮播图的简单实例,希望能帮助到大家,需要的朋友可以参考下
    2017-08-08
  • Android 10 启动分析之init语法详解

    Android 10 启动分析之init语法详解

    这篇文章主要为大家介绍了Android 10 启动分析之init语法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Android 自定义SurfaceView详解

    Android 自定义SurfaceView详解

    本文主要介绍Android SurfaceView自定义方法,这里对SurfaceView的基础知识做了详解,并附简单的示例代码,以便参考,有需要的小伙伴可以参考下
    2016-08-08
  • Android开发自学路线图

    Android开发自学路线图

    这篇文章主要介绍了Android开发自学路线图,本文讲解的路线图分为JAVA、Android基础、Web基础、Android项目4部份,是一个入门级学习路线图,需要的朋友可以参考下
    2015-04-04
  • Android App中使用AudioManager类来编写音频播放器

    Android App中使用AudioManager类来编写音频播放器

    这篇文章主要介绍了Android App中使用AudioManager类来编写音乐播放器的方法,文中举了一个简单的例子实现了基础的播放暂停和静音等功能,需要的朋友可以参考下
    2016-04-04
  • RecycleView实现各种尺寸图片展示

    RecycleView实现各种尺寸图片展示

    这篇文章主要为大家详细介绍了RecycleView实现各种尺寸图片展示,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Android代码检查规则Lint的自定义与应用详解

    Android代码检查规则Lint的自定义与应用详解

    本文主要介绍了Android代码检查规则Lint的自定义与应用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04

最新评论