主页启动器强制停止后未收到Android AppWidget的按钮单击事件
Posted
技术标签:
【中文标题】主页启动器强制停止后未收到Android AppWidget的按钮单击事件【英文标题】:Android AppWidget's button click event not received after home launcher force stop 【发布时间】:2016-06-05 09:56:02 【问题描述】:我有一个应用小部件,点击事件可以在我的提供商的onUpdate()
中接收。
但是,当我尝试强制关闭主启动器时,单击事件会丢失。
我什至在所有onEnabled()
、onReceived()
...等中都设置了断点:连接似乎丢失了。
因此,如何“重新连接”按钮事件?
WidgetProvider 扩展 AppWidgetProvider
:
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
Log.d(TAG, "onUpdate()");
Log.d(TAG, "isLoading: " + CONSTANT.isLoading);
// update each of the widgets with the remote adapter from updateService
// Get all ids
ComponentName thisWidget = new ComponentName(context, ScoreWidgetProvider.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
// Build the intent to call the service
Intent intent = new Intent(context.getApplicationContext(), UpdateWidgetService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds);
// Update the widgets via the service
context.startService(intent);
// super.onUpdate(context, appWidgetManager, appWidgetIds);
UpdateWidgetService 扩展Service
:
@Override
public void onStart(Intent intent, int startId)
Log.i(TAG, "Called");
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
int[] appWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS);
for (int i = 0; i < appWidgetIds.length; ++i)
// Here we setup the intent which points to the StackViewService which will
// provide the views for this collection.
Intent remoteViewsIntent = new Intent(this.getApplicationContext(), ScoreWidgetRemoteViewsService.class);
remoteViewsIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetIds[i]);
// When intents are compared, the extras are ignored, so we need to embed the extras
// into the data so that the extras will not be ignored.
remoteViewsIntent.setData(Uri.parse(remoteViewsIntent.toUri(Intent.URI_INTENT_SCHEME)));
RemoteViews rv = new RemoteViews(this.getApplicationContext().getPackageName(), R.layout.widget_layout);
rv.setRemoteAdapter(appWidgetIds[i], R.id.score_list, remoteViewsIntent);
// Set the empty view to be displayed if the collection is empty. It must be a sibling
// view of the collection view.
rv.setEmptyView(R.id.score_list, R.id.empty_view);
// Bind the click intent for the refresh button on the widget
final Intent refreshIntent = new Intent(this.getApplicationContext(), ScoreWidgetProvider.class);
refreshIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
refreshIntent.setAction(ScoreWidgetProvider.REFRESH_ACTION);
final PendingIntent refreshPendingIntent = PendingIntent
.getBroadcast(this.getApplicationContext(), 0, refreshIntent, PendingIntent.FLAG_UPDATE_CURRENT);
rv.setOnClickPendingIntent(R.id.btn_refresh, refreshPendingIntent);
appWidgetManager.updateAppWidget(appWidgetIds[i], rv);
// stopSelf();
super.onStart(intent, startId);
【问题讨论】:
启动服务 OnUpdate !你可以在服务上做你的工作 ***.com/questions/26108355/… 我的小部件包含列表视图,因此它已经具有扩展 RemoteViewsService 的类。所以我需要在服务上写另一个? 从我编辑的代码中,我尝试启动一项服务。但是当我强制关闭启动器时,刷新按钮仍然不起作用。 我想知道您是否需要将要更新的 appWidgetIds 添加到待处理的意图中以使其工作。 (在您的情况下,所有 appwidgetids,因为您为每个小部件重复使用相同的 pendingintent)***.com/questions/3570146/… 【参考方案1】:确保您在 onStart
函数中使用了正确的上下文。在代码的onStart
部分中查看getApplicationContext
,传入错误类型的上下文可能会导致错误。以下是更多信息的链接:Context。
【讨论】:
以上是关于主页启动器强制停止后未收到Android AppWidget的按钮单击事件的主要内容,如果未能解决你的问题,请参考以下文章
无法识别启动活动:升级到 Android Studio 4.0 后未找到默认活动