我有一个小部件。完成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上非常有效。

09-27 12:12