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.test_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://schemas.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/test_Widget_info" /> </receiver> <activity androID:name=".TestWidgetConfigureActivity"> <intent-filter> <action androID:name="androID.appWidget.action.APPWidget_CONfigURE" /> </intent-filter> </activity> </application></manifest>解决方法 在appwidgetprovider中动态注册broadcastReceivers是一个不稳定的解决方案. appwidgetprovider本身是一个broadcastReceiver,并且在应用程序清单中静态注册的实例意味着相当短暂.
但是,由于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中有多个按钮,并且需要区分其点击广播.
@OverrIDepublic 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类仍然非常简短.
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.test_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.test_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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)