我有一个小部件。完成SettingsActivity会从Internet加载数据并将其显示在ListView中。这适用于Oreo之前的设备和Oreo设备。
但是以下两种行为不是由任何活动触发的,而是由单击小部件本身(=背景)触发的,仅在Oreo之前的设备上有效:
单击ListView本身会打开浏览器以导航到该项目的url。
单击ListView上方的按钮可打开设置活动。
但是在获得像
Not allowed to start service Intent
我从IntentService切换到JobIntentService是因为:
From developer.android.com :
IntentService受这些限制的约束。
服务,因此受到新的限制
后台服务。结果,许多依赖IntentService的应用程序
定位到Android 8.0或更高版本时无法正常工作。为了这
原因,Android支持库26.0.0引入了新的
JobIntentService类,提供与以下功能相同的功能
IntentService,但在运行时使用作业而不是服务
Android 8.0或更高版本。
清单:
<service
android:name="com.example.MyWidgetService"
android:permission="android.permission.BIND_JOB_SERVICE"/>
服务内容:
public class MyWidgetService extends JobIntentService {
@Override
protected void onHandleWork(Intent intent) {
XLog.i("onHandleWork"); <-- never printed to log
}
}
在小部件的RemoteViewsService中:
remote.setOnClickPendingIntent(R.id.open, new Intent(..some-code..));
修改后的代码可在Oreo之前的设备上运行,但在Oreo上单击列表视图项或按钮均不起作用,则不会调用MyWidgetService.onHandleWork()。
知道我在做什么错吗?
最佳答案
JobIntentService不能通过PendingIntent处理点击,因为它不会在短时间内触发(使用JobIntentService可以接收一分钟或更长时间的回调...)。因此,我只是使用startForegroundService启动服务,因为可以保证在用户单击RemoteView时调用您的服务。
附言是的,您需要显示一条通知(诸如AppNameWidget更新之类的东西),但是它在oreo上非常有效。