相关文章推荐
风流倜傥的玉米  ·  【Android 进程保活】应用进程拉活 ...·  1 月前    · 
怕考试的椰子  ·  获取用户的邮箱设置 - Microsoft ...·  3 周前    · 
近视的橙子  ·  spring 集成 kafka ...·  2 周前    · 
逆袭的热带鱼  ·  开发框架Furion之WebApi+SqlS ...·  5 天前    · 
任性的墨镜  ·  多用户系统中共享conda环境中的权限冲突。 ...·  5 天前    · 
可爱的小蝌蚪  ·  抖音视频批量采集下载 - 我不是萌新 - 博客园·  7 月前    · 
俊逸的青蛙  ·  MSBUILD ...·  7 月前    · 
光明磊落的香烟  ·  Vue项目关闭eslint校验_51CTO博 ...·  1 年前    · 
气宇轩昂的葫芦  ·  Swagger中的注解对应的springdo ...·  1 年前    · 
Code  ›  解决Android8.0之后开启service开发者社区
context
https://cloud.tencent.com/developer/article/1668368
爱搭讪的抽屉
1 年前
作者头像
Anymarvel
0 篇文章

解决Android8.0之后开启service

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > Android开发实战 > 解决Android8.0之后开启service

解决Android8.0之后开启service

作者头像
Anymarvel
发布 于 2020-07-25 16:41:22
3K 0
发布 于 2020-07-25 16:41:22
举报

解决Android8.0之后开启service时报错IllegalStateException: Not allowed to start service Intent ...

背景:

项目测试时发现的,在双击返回键关闭应用后(并未杀死后台)重新打开APP,其他手机都OK,但是8.0的手机会出现较频繁的crash。检查代码,问题锁定在重新开启应用时的startService()上。

查找资料说是Android 8.0 不再允许后台service直接通过startService方式去启动,否则就会引起IllegalStateException

原因

Android 8.0 有一项复杂功能;系统不允许后台应用创建后台服务。 因此,Android 8.0 引入了一种全新的方法,即 Context.startForegroundService(),以在前台启动新服务。 在系统创建服务后,应用有5秒的时间来调用该服务的 startForeground() 方法以显示新服务的用户可见通知。如果应用在此时间限制内未调用 startForeground(),则系统将停止服务并声明此应用为 ANR。

遇到的问题

但是目前在调用:context.startForegroundService(intent)时报如下ANR,startForegroundService()文档说明在service启动后要调用startForeground()。

android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()

完整解决步骤:

1. 添加权限

<!--android 9.0上使用前台服务,需要添加权限,此权限为级别为nomarl-->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

2. 启动server(引用启动5秒内要启动server)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        context.startForegroundService(new Intent(context, MyService.class));
    } else {
        context.startService(new Intent(context, MyService.class));
    }

然后必须在Myservice中调用startForeground():

3. Server中onCreate方法中调用startForeground()

public static final String CHANNEL_ID_STRING = "service_01";
private Notification notification;
    @Override
    public void onCreate() {
        super.onCreate();
        //适配8.0service
        NotificationManager notificationManager = (NotificationManager) MyApp.getInstance().getSystemService(Context.NOTIFICATION_SERVICE);
        NotificationChannel mChannel = null;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            mChannel = new NotificationChannel(CHANNEL_ID_STRING, getString(R.string.app_name),
                    NotificationManager.IMPORTANCE_LOW);
            notificationManager.createNotificationChannel(mChannel);
            notification = new Notification.Builder(getApplicationContext(), CHANNEL_ID_STRING).build();
            startForeground(1, notification);
}

4. 在onStart里再次调用startForeground()

@Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
 
推荐文章
风流倜傥的玉米  ·  【Android 进程保活】应用进程拉活 ( JobScheduler 拉活 | JobScheduler 使用流程 | JobService 服务 | 不同版本兼容 | 源码资源 )开发者社
1 月前
怕考试的椰子  ·  获取用户的邮箱设置 - Microsoft Graph v1.0 | Microsoft Learn
3 周前
近视的橙子  ·  spring 集成 kafka producer(KafkaTemplate) - 护花使者
2 周前
逆袭的热带鱼  ·  开发框架Furion之WebApi+SqlSugar (一)
5 天前
任性的墨镜  ·  多用户系统中共享conda环境中的权限冲突。_conda 多用户使用
5 天前
可爱的小蝌蚪  ·  抖音视频批量采集下载 - 我不是萌新 - 博客园
7 月前
俊逸的青蛙  ·  MSBUILD :错误MSB1001:未知开关: /Y-腾讯云开发者社区-腾讯云
7 月前
光明磊落的香烟  ·  Vue项目关闭eslint校验_51CTO博客_vue关闭eslint
1 年前
气宇轩昂的葫芦  ·  Swagger中的注解对应的springdoc-openapi-ui中的注解_springdoc 注解_Calvin_it的博客-CSDN博客
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号