gpt4 book ai didi

android - onStart() 调用 startService() 有时会在 Android O 中导致异常

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:03:02 24 4
gpt4 key购买 nike

我们的应用面向 Android O。

看完Background Service Limitation ,我注意到前台应用启动服务是安全的。因此,在我们的应用程序中,我们在 Fragment 的 onStart() 方法中调用了 startService()。我们认为这没问题,因为在 this document它说当调用 onStart 时, fragment 对用户可见,当它可见时,表示此应用是前台应用。

但有时,我必须承认这种情况很少见,我们仍然会收到以下异常

java.lang.IllegalStateException: Not allowed to start service Intent { act=ACTION_DEACTIVATE cmp=com.adyxe.sync/.ClientService }: app is in background uid UidRecord{db2a697 u0a19 LAST bg:+7m30s540ms idle change:cached procs:1 seq(0,0,0)}

为什么会这样?在 onResume() 中调用 startService() 只是为了更加确定该应用现在是前台应用是否更安全?

最佳答案

首先,您可能发现了 Android 中的错误 :)

无论如何,您应该使用 JobIntentService 并将其排入队列。

这样,当应用在前台时,系统将运行您的服务,您将不会看到错误。在 Oreo 之前的版本中,无论应用前台状态如何,服务都应立即运行。

这是一个例子:

public class ExampleJobIntentService extends JobIntentService {
static final int JOB_ID = 1000;

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

@Override
public void onCreate() {
super.onCreate();
// Some initializations...
}

@Override
protected void onHandleWork(Intent work) {
// Do your stuff...
}

@Override
public boolean onStopCurrentWork() {
// return true to reschedule this service if your work failed.
return false;
}
}

然后你像这样入队:

// The intent is the one that will be received here: onHandleWork(Intent work)
ExampleJobIntentService.enqueueWork(context, intent);

像这样在 Manifest 中注册它:

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

如果您还计划在后台运行该服务,您应该在 Manifest 中为 pre-Oreo 版本添加 WAKE_LOCK 权限:

<uses-permission android:name=”android.permission.WAKE_LOCK” />

关于android - onStart() 调用 startService() 有时会在 Android O 中导致异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52157282/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com