Android AppWidgetProvider onReceive在按钮单击时未调用

11dmarpk  于 2023-11-15  发布在  Android
关注(0)|答案(1)|浏览(179)

我有一个在Android下运行的小部件,我想让它更新时,用户点击小部件上的按钮本身。
由于某些原因,在我安装小部件后单击按钮时从不调用onReceive方法。
我在AppWidgetProvider类中有一个这样的onUpdate方法:

  1. @Override
  2. public void onUpdate(Context context, AppWidgetManager appWidgetManager,
  3. int[] appWidgetIds) {
  4. super.onUpdate(context, appWidgetManager, appWidgetIds);
  5. for (int i = 0; i < appWidgetIds.length; ++i) {
  6. final RemoteViews rv =
  7. new RemoteViews(context.getPackageName(), R.layout.appwidget_provider);
  8. final Intent nextIntent =
  9. new Intent(context, TestAppWidgetProvider.class);
  10. nextIntent.setAction(TestAppWidgetProvider.NEXT_ACTION);
  11. nextIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
  12. final PendingIntent refreshPendingIntent =
  13. PendingIntent.getBroadcast(context, 0,
  14. nextIntent, PendingIntent.FLAG_UPDATE_CURRENT);
  15. rv.setOnClickPendingIntent(R.id.next, refreshPendingIntent);
  16. appWidgetManager.updateAppWidget(appWidgetIds[i], rv);
  17. }
  18. }

字符串
然后在我的on receive中,我有一个方法,看起来像:

  1. @Override
  2. public void onReceive(Context ctx, Intent intent) {
  3. super.onReceive(ctx, intent);
  4. final String action = intent.getAction();
  5. if (action.equals(PREV_ACTION)) {
  6. Toast.makeText(ctx, "Previous clicked..", Toast.LENGTH_SHORT).show();
  7. } else if (action.equals(NEXT_ACTION)) {
  8. Toast.makeText(ctx, "Next was clicked..", Toast.LENGTH_SHORT)
  9. .show();
  10. }
  11. else {
  12. Toast.makeText(ctx, "Other action..", Toast.LENGTH_SHORT).show();
  13. }
  14. }


我的manifest文件中也有这个:

  1. <receiver android:name="com.test.android.widget.TestAppWidgetProvider" >
  2. <intent-filter >
  3. <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
  4. </intent-filter>
  5. <intent-filter >
  6. <action android:name="com.test.android.widget.PREV" />
  7. </intent-filter>
  8. <intent-filter >
  9. <action android:name="com.test.android.widget.NEXT" />
  10. </intent-filter>
  11. <meta-data
  12. android:name="android.appwidget.provider"
  13. android:resource="@xml/appwidget_info" />
  14. </receiver>


在我安装小部件并单击下一步按钮后,由于某种原因,onReceive方法从未被调用。

uqdfh47h

uqdfh47h1#

修好了,结果证明是微不足道的。
这是因为在创建小部件时甚至没有调用onReceiver,所以没有设置事件侦听器。
添加了一些在onReceive中的代码(设置setOnClickPendingIntent等)到一个函数中,该函数在小部件配置活动准备好更新小部件时调用。

相关问题