大佬教程收集整理的这篇文章主要介绍了android – Widget onUpdate在重启后没有在按钮点击时设置pendingIntent,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
public class TestWidget extends appwidgetprovider { static HashMap<Integer,BroadcastReceiver> br = new HashMap<>(); static void updateAppWidget(Context context,final AppWidgetManager appWidgetManager,final int appWidgetId) { context = context.getApplicationContext(); final RemoteViews views = new RemoteViews(context.getPackagename(),R.layout.@R_618_9214@widget); BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context,Intent intent) { views.setTextViewText(R.id.appwidget_text,Math.random() + ""); appWidgetManager.updateAppWidget(appWidgetId,views); } }; br.put(appWidgetId,broadcastReceiver);//to unregister later Intent intent = new Intent("action"); IntentFilter intentFilter = new IntentFilter("action"); context.registerReceiver(broadcastReceiver,intentFilter); PendingIntent pendingIntent = PendingIntent.getBroadcast(context,123,intent,PendingIntent.FLAG_updatE_CURRENT); views.setOnClickPendingIntent(R.id.appwidgeT_Button,pendingIntent); appWidgetManager.updateAppWidget(appWidgetId,views); } @Override public void onupdate(Context context,AppWidgetManager appWidgetManager,int[] appWidgetIds) { for (int appWidgetId : appWidgetIds) { updateAppWidget(context,appWidgetManager,appWidgetId); } } @Override public void ondeleted(Context context,int[] appWidgetIds) { for (int appWidgetId : appWidgetIds) { context.unregisterReceiver(br.get(appWidgetId)); } } }
表现:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://scheR_753_11845@as.android.com/apk/res/android" package="com.aeza.sta"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:allowBACkup="true" android:icon="@mipmap/ic_launcher" android:label="@String/app_name" android:rounDicon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <receiver android:name=".TestWidget" android:enabled="true" android:exported="false" > <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_updatE" /> <action android:name="android.intent.action.bOOT_COMPLETED" /> </intent-filter> <Meta-data android:name="android.appwidget.provider" android:resource="@xml/@R_618_9214@widget_info" /> </receiver> <activity android:name=".TestWidgetConfigureActivity"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_CONfigURE" /> </intent-filter> </activity> </application> </manifest>
但是,由于appwidgetprovider是一个BroadcastReceiver,我们可以利用它,只需在点击PendingIntents中定位你的TestWidget.我们还可以在这里附加Widget ID作为Intent的额外内容,因此我们会在点击触发时更新正确的ID.例如:
Intent intent = new Intent(context,TestWidget.class); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetId); PendingIntent pendingIntent = PendingIntent.getBroadcast(context,appWidgetId,PendingIntent.FLAG_updatE_CURRENT); views.setOnClickPendingIntent(R.id.appwidgeT_Button,pendingIntent);
请注意,我们还将appWidgetId用于PendingIntent的requestCode.为每个Widget实例使用不同的PendingIntent非常重要,以免错误的Widget实例使用错误的附加内容进行更新.使用已经独特的Widget ID可以让我们轻松完成.
然后我们覆盖TestWidget的onReceive()方法,并检查Intent的动作以确定这是我们的点击广播,还是从系统广播的普通Widget事件.在上面的示例中,我们没有设置操作,因此我们只需在此处检查null.但是,您当然可以指定一个操作字符串,在某些情况下最好这样做;例如,如果您的Widget中有多个按钮,并且需要区分其点击广播.
@Override public void onReceive(Context context,Intent intent) { if (intent.getAction() == null) { int appWidgetId = intent.getIntextra(AppWidgetManager.EXTRA_APPWIDGET_ID,-1); if (appWidgetId != -1) { updateWidgetText(context,Math.random() + ""); } } else { super.onReceive(context,intent); } }
在上面,你可以看到,如果我们发现它不是我们的,我们将广播传递给超级方法.然后,appwidgetprovider的onReceive()将检查Intent,并按照惯例委托给相应的事件方法.
除了是一个稳定的解决方案之外,这种方法还有另外一个结果,即不需要为每个Widget实例创建,注册和注销单独的BroadcastReceiver实例.虽然我们添加了一个onReceive()方法,但我们可以删除所有动态的BroadcastReceiver代码,因此我们的TestWidget类仍然@R_182_10584@.
public class TestWidget extends appwidgetprovider { @Override public void onReceive(Context context,Intent intent) { if (intent.getAction() == null) { int appWidgetId = intent.getIntextra(AppWidgetManager.EXTRA_APPWIDGET_ID,-1); if (appWidgetId != -1) { updateWidgetText(context,Math.random() + ""); } } else { super.onReceive(context,intent); } } static void updateWidgetText(Context context,int appWidgetId,String newText) { RemoteViews views = new RemoteViews(context.getPackagename(),R.layout.@R_618_9214@widget); views.setTextViewText(R.id.appwidget_text,newText); AppWidgetManager.geTinstance(context).updateAppWidget(appWidgetId,views); } static void updateAppWidget(Context context,final int appWidgetId) { RemoteViews views = new RemoteViews(context.getPackagename(),R.layout.@R_618_9214@widget); Intent intent = new Intent(context,TestWidget.class); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetId); PendingIntent pendingIntent = PendingIntent.getBroadcast(context,appWidgetId); } } }
以上是大佬教程为你收集整理的android – Widget onUpdate在重启后没有在按钮点击时设置pendingIntent全部内容,希望文章能够帮你解决android – Widget onUpdate在重启后没有在按钮点击时设置pendingIntent所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。