【发布时间】:2018-09-02 23:50:51
【问题描述】:
我有一个日历小部件,我会在每天凌晨 12:01 自己更新它,当大小发生变化时,我不需要自动更新。我还将updatePeriodMillis 设置为0。我遇到的问题是App Widget 调用onAppWidgetOptionsChanged():
- 每次屏幕解锁时
- 每次回家
这对我来说不是问题,但问题是您可以在一瞬间看到 App Widget 正在更新。有谁知道我有什么方法可以防止这种情况发生?
这里的参考是我的 WidgetProvider 类的一部分
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action != null) {
if (action.equals(ACTION_REFRESH) || action.equals(ACTION_NEXT) || action.equals(ACTION_PREVIOUS)) {
context.sendBroadcast(new Intent(action));
}
}
Bundle extra = intent.getExtras();
if (extra != null && extra.containsKey(KEY_APP_WIDGET_ID)) {
updateAppWidget(context, AppWidgetManager.getInstance(context), extra.getInt(KEY_APP_WIDGET_ID));
}
super.onReceive(context, intent);
}
@Override
public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {
int width = Util.dp2px(newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH));
Intent broadcastIntent = new Intent(ACTION_REFRESH);
broadcastIntent.putExtra(KEY_SIZE_CHANGE, width);
context.sendBroadcast(broadcastIntent);
updateAppWidget(context, appWidgetManager, appWidgetId);
super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions);
}
private static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
int appWidgetId) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);
Intent intent = new Intent(context, WidgetService.class);
views.setRemoteAdapter(R.id.widget_calendar_container, intent);
// Buttons on widget click handlers
views.setOnClickPendingIntent(R.id.widget_refresh, getPendingSelfIntent(context, ACTION_REFRESH, appWidgetId));
views.setOnClickPendingIntent(R.id.widget_next, getPendingSelfIntent(context, ACTION_NEXT, appWidgetId));
views.setOnClickPendingIntent(R.id.widget_previous, getPendingSelfIntent(context, ACTION_PREVIOUS, appWidgetId));
// Widget Container click handler
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory(Intent.CATEGORY_LAUNCHER);
homeIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
homeIntent.setComponent(new ComponentName(context.getPackageName(), Home.class.getName()));
PendingIntent homePendingIntent = PendingIntent.getActivity(context, 0, homeIntent, 0);
views.setPendingIntentTemplate(R.id.widget_calendar_container, homePendingIntent);
// Instruct the widget manager to update the widget
appWidgetManager.updateAppWidget(appWidgetId, views);
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.widget_calendar_container);
}
【问题讨论】:
-
覆盖 onUpdate 使其不执行任何操作。如果您包括整个班级进行测试会有所帮助
-
@Kwright02 谢谢。我进一步调试它,我看到
onAppWidgetOptionsChanged()在屏幕唤醒或用户回家时被调用... -
很高兴我能帮上忙。如果还有其他问题或没有解决问题,请在此处重新评论。如果确实解决了问题,请提供您自己问题的答案,以便其他人知道如何解决此问题。
-
不,它没有解决它,但我现在知道问题实际在哪里。 @Kwright02
-
请注意,您的代码可能存在无限循环。您有一个
BroadcastReceiver重新广播刚刚收到的Intent操作,当该操作是三个值之一时(例如,ACTION_REFRESH)。您的接收器显然可以接收此类操作,因此它将接收广播,发送广播,接收它刚刚发送的广播,再次发送该广播,等等,AFAICT。这对性能没有帮助。除此之外,看看你是否可以提升WidgetService的性能。