android - Android Oreo+:AppWidget 点击不调用 JobIntentService.onHandleWork()
问题描述
我有一个小部件。完成 SettingsActivity 从 Internet 加载数据并将其显示在 ListView 中。这适用于 pre-Oreo 和 Oreo 设备。
但是以下两种行为不是由任何活动触发的,而是通过点击小部件本身(=背景)触发的,并且仅适用于奥利奥之前的设备:
单击 ListView 本身会打开浏览器以导航到该项目的 url。
单击 ListView 上方的按钮会打开设置活动。
但是在遇到异常之后的奥利奥
Not allowed to start service Intent
我从 IntentService 切换到 JobIntentService 因为:
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()。
知道我做错了什么吗?
解决方案
JobIntentService 不是使用 PendingIntent 处理点击的方法,因为它不会很快触发它(使用 JobIntentService 它可以接收超过一分钟或更长时间的回调......)。所以我只是用 startForegroundService 启动服务,因为当用户点击你的 RemoteView 时,它保证会调用你的服务。
PS 是的,您需要显示通知(例如 AppNameWidget 更新...),但它在 oreo 上完美运行。
推荐阅读
- odoo - Odoo 无法解析我的 xml 文件中的树视图
- android - 在应用程序中选择选项的 Android cron 任务
- sql - 应该在雪花中检索不在正确日期间隔的信息
- python - Selenium 无法添加到购物车错误
- android - Talkback 不会读取 ViewPager 中的所有片段,只读取第一个
- r - 如何从r中的ggplot中提取密度值
- excel - VBA:为什么打开随机语句失败?
- javascript - 如果它们包含完成,我是否需要在 try/catch 中包装 jest 测试
- flutter - 在下一页调用 Navigator.of().pop() 时重新加载上一页
- reactjs - onMouseMove + useState 在自定义轮播上滞后