美文网首页
Android8.0 Not allowed to start

Android8.0 Not allowed to start

作者: baby_honour | 来源:发表于2019-08-15 10:26 被阅读0次

    原文:https://www.cnblogs.com/Sharley/p/10248384.html

    参考:https://cloud.tencent.com/developer/article/1443931

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

    Android 8.0 不再允许后台service直接通过startService方式去启动,否则就会引起IllegalStateException。而网上给出的解决方式大多是这样的:

        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():

    @Override
    public void onCreate() {
        super.onCreate();
        startForeground(1,new Notification());
    }
    

    使用上面代码之后应用可能会报出RemoteServiceException: Bad notification for startForeground: java.lang.RuntimeException: invalid ch...

        public static final String CHANNEL_ID_STRING = "service_01";
    
        @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 notification = new Notification.Builder(getApplicationContext(), CHANNEL_ID_STRING).build();
                startForeground(1, notification);
            }
       }
    

    不过不过这样的话,状态栏会有一个xxx正在运行的通知,体验不太好,如果某项任务完成后,最好主动stop掉。

    总结
    • startService抛异常不是看调用的APP处于何种状态,而是看Servic所在APP处于何种状态,因为看的是UID的状态,所以这里重要的是APP而不仅仅是进程状态
    • 不要通过Handler延迟太久再startService,否则可能会有问题
    • 应用进入后台,60s之后就会变成idle状态,无法start其中的Service,但是可以通过startForegroundService来启动
    • Application里面不要startService,否则恢复的时候可能有问题
    • startForGround 要及时配合startForegroundService,否则会有各种异常。

    相关文章

      网友评论

          本文标题:Android8.0 Not allowed to start

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