首页 > 解决方案 > Android Oreo+:AppWidget 点击不调用 JobIntentService.onHandleWork()

问题描述

我有一个小部件。完成 SettingsActivity 从 Internet 加载数据并将其显示在 ListView 中。这适用于 pre-Oreo 和 Oreo 设备。

但是以下两种行为不是由任何活动触发的,而是通过点击小部件本身(=背景)触发的,并且仅适用于奥利奥之前的设备:

但是在遇到异常之后的奥利奥

Not allowed to start service Intent

我从 IntentService 切换到 JobIntentService 因为:

来自 developer.android.com:

IntentService 受这些限制 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
    }
}

在 Widget 的 RemoteViewsService 中:

remote.setOnClickPendingIntent(R.id.open, new Intent(..some-code..));

修改后的代码适用于 Pre-Oreo 设备,但在 Oreo 上单击列表视图项或按钮均无任何作用,从未调用 MyWidgetService.onHandleWork()。

知道我做错了什么吗?

标签: androidandroid-widget

解决方案


JobIntentService 不是使用 PendingIntent 处理点击的方法,因为它不会很快触发它(使用 JobIntentService 它可以接收超过一分钟或更长时间的回调......)。所以我只是用 startForegroundService 启动服务,因为当用户点击你的 RemoteView 时,它保证会调用你的服务。

PS 是的,您需要显示通知(例如 AppNameWidget 更新...),但它在 oreo 上完美运行。


推荐阅读