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

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 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

我找到解决办法了。对于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
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

最好的方法是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
  • 3 回答
  • 0 关注
  • 827 浏览

添加回答

举报

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