android - 如何将小部件从 targetSdkVersion 25 迁移到 26?
问题描述
在我的应用程序中将 targetSdkVersion 更新为 26 个小部件后,我停止响应点击事件。我在网上没有找到任何解决方案。似乎只有当我们调用 PendingIntent.getActivity(...) 它才能工作并打开应用程序,但在我的应用程序中,我需要在小部件点击后进行一些后台操作。
我阅读了有关后台执行限制的信息。但没有得到它如何使它工作......所以这是我下面的代码
显现:
<receiver android:name="com.test.widget.WidgetClock" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="enter" />
<category android:name="enterAction" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_clock_provider" />
</receiver>
扩展 AppWidgetProvider 的 AppWidgetProvider:
public class WidgetClock extends AppWidgetProvider{
public RemoteViews views;
public Context context;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
this.context = context;
for (int i = 0; i < appWidgetIds.length; i++) {
//start action method:
views = new RemoteViews(context.getPackageName(), R.layout.widget_small_clock);
Intent intent = new Intent("enterAction").addCategory("enterAction");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.bEnter_Widget_small, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetIds[i], views);
}
}
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if ("enterAction".equals(action)) {
//To something...
update(context);
} else {
super.onReceive(context, intent);
}
}
public void update(Context context){
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
ComponentName thisAppWidget = new ComponentName(context.getPackageName(), WidgetSmallClock.class.getName());
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget);
onUpdate(context, appWidgetManager, appWidgetIds);
}
}
这就是我通过 MainActivity 以编程方式刷新小部件的方式。
public static void updateWidget(Context context){
Intent intent = new Intent(context,WidgetClock.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
int ids[] = AppWidgetManager.getInstance(context).getAppWidgetIds(new ComponentName(context, WidgetClock.class));
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids);
context.sendBroadcast(intent);
}
如何迁移现有代码并使此操作有效?
解决方案
推荐阅读
- django - 无法查询“ABC”:必须是“Image”实例
- symfony - Symfony 2 - 在一个实体上处理多个实体侦听器
- javascript - javascript更改背景并一键播放声音
- java - LWJGL FPS Camera rotation is limited to pixels
- python - Python:匹配文件中的多个模式
- c# - 仅当存在时,如何通过键原子更新 ConcurrentDictionary 中的值
- vuejs2 - Nuxt Ava 端到端测试存储配置
- mysql - 是双右插入符语法 >> mysqldump 的有效 MySQL
- javascript - 为什么我的 JavaScript 代码在我的 ASP.NET Web 表单页面上不起作用?
- javascript - 将一个空数组保存到 mongodb