android – 服务不是使用PendingIntent在应用程序小部件中的Oreo上启动的
作者:互联网
我正在使用Android应用小部件.我正在创建一个PendingIntent对象,并在RemoteViews#setOnClickPendingIntent()方法中使用它.这是未决的意图:
// The below code is called in the onUpdate(Context, AppWidgetManager, int[]) method of the AppWidgetProvider class.
// Explicit intent
Intent intent = new Intent(context, MyService.class);
intent.setAction(MY_ACTION);
intent.putExtra(EXTRA_KEY, VALUE);
// Create the pending intent
PendingIntent pendingIntent = PendingIntent.getService(context, appWidgetId, intent, 0);
// 'views' is a RemoteViews object provided by onUpdate in the AppWidgetProvider class.
views.setOnClickPendingIntent(R.id.root_layout, pendingIntent);
上面的代码在Android Oreo之前按预期工作.但是,在Android Oreo中,如果将应用程序从最近的位置移除,它将不再启动该服务. (不再有效). Oreo的后台执行限制中是否排除了PendingIntents?
出于测试目的,我用getForegroundService替换了getService,但仍未启动Service.这两种方法都在日志中显示以下消息:
W/ActivityManager: Background start not allowed: service Intent { act=com.example.myapp.MY_ACTION flg=0x10000000 cmp=com.example.myapp/com.example.myapp.MyService bnds=[607,716][833,942] (has extras) } to com.example.myapp/com.example.myapp.MyService from pid=-1 uid=10105 pkg=com.example.myapp
为什么服务没有启动,即使使用getForegroundService?我在运行Android 8.1.0的Nexus 6P上进行了测试.
解决方法:
如您所知,应用小部件不计入PendingIntent背景白名单.我不知道为什么 – 它似乎与通知启动的PendingIntent相提并论.也许这是一个问题,通知是一个系统的事情,而应用程序小部件是一个主屏事件.无论如何,你可以:
>使用getForegroundService(),或者使用
>尝试使用显式Intent的getBroadcast(),并使用BroadcastReceiver启动JobIntentService,如果您不想引发通知(作为前台服务需要)
根据您的症状,您似乎已经超过了我认为的错误:应该有一种方法可以从getService()切换到getForegroundService()而无需重新启动. :-)我会尝试运行一些实验,如果我能重现问题就会提出问题.
标签:android-appwidget,android,android-service,android-widget,android-8-1-oreo 来源: https://codeday.me/bug/20191005/1854921.html