为了账号安全,请及时绑定邮箱和手机立即绑定

Android8.0:java.lang.IllegalStateException:

/ 猿问

Android8.0:java.lang.IllegalStateException:

尚方宝剑之说 2019-07-22 15:46:59

Android8.0:java.lang.IllegalStateException:

在应用程序启动时,应用程序启动应该执行某些网络任务的服务。在针对API级别26之后,我的应用程序无法在后台的Android8.0上启动服务。

由以下原因引起:java.lang.IllegalStateException:不允许启动服务意图{CMP=my.app.tt/com.my.service}:APP处于后台uid UidRecord{90372b1 u0a136 CEM空闲进程:1 seq(0,0,0)}

据我所知,它涉及:背景执行限制

如果针对Android8.0的应用程序试图在不允许创建后台服务的情况下使用该方法,startService()方法将引发IllegalStateException。

"在不允许的情况下-这到底是什么意思?以及如何解决它。我不想把我的服务设置为“前景”


查看完整描述

3 回答

?
收到一只叮咚

允许的情况是一个临时白名单,后台服务的行为与AndroidO之前相同。

在某些情况下,后台应用程序会在临时白名单上放置几分钟。当应用程序在白名单上时,它可以不受限制地启动服务,并且它的后台服务被允许运行。当应用程序处理用户可以看到的任务时,它会被放置在白名单上,例如:

  • 处理高优先级的FireBaseCloud消息传递(FCM)消息.
  • 接收广播,如SMS/MMS消息。
  • 从通知中执行PendingIntent。
  • 在VPN应用程序将自己提升到前台之前启动VpnService。

资料来源:https:/developer.android.com/About/Versions/Oreo/Backplan.html

因此,换句话说,如果后台服务不符合白名单要求,则必须使用新的JobScheduler..它基本上与后台服务相同,但它被周期性地调用,而不是在后台连续运行。

如果使用的是IntentService,则可以更改为JobIntentService。见@Kosev‘s回答如下.


查看完整回答
反对 回复 2019-07-22
?
忽然笑

我找到解决办法了。对于8.0前的设备,您只需使用startService(),但对于后置7.0设备,您必须使用startForgroundService()..下面是启动服务的代码示例。

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

在服务类中,请添加以下代码以进行通知:

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

其中O是Android版本26。


查看完整回答
反对 回复 2019-07-22
?
拉风的咖菲猫

最好的方法是JobIntentService它对OREO使用新的JobScheduler,如果不可用,则使用旧的服务。

在您的舱单中声明:

<service android:name=".YourService"
         android:permission="android.permission.BIND_JOB_SERVICE"/>

在您的服务中,您必须将onHandleIntent替换为onHandleWork:

public class YourService extends JobIntentService {

    public static final int JOB_ID = 1;

    public static void enqueueWork(Context context, Intent work) {
        enqueueWork(context, YourService.class, JOB_ID, work);
    }

    @Override
    protected void onHandleWork(@NonNull Intent intent) {
        // your code
    }}

然后,您可以从以下方面开始您的服务:

YourService.enqueueWork(context, new Intent());


查看完整回答
反对 回复 2019-07-22

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信