Android 开发中遇到music的 桌面4*2小部件的更新不及时问题,尤其在重启手机,切换语言,开关机过程中等情况下尤为明显,表现在小部件界面一片空白.现在优化了一番,小部件更新的问题就解决了,方案如下:
源码里面music小部件的代码主要在src/com/android/music/MediaAppWidgetProvider.java里面
未改动之前的代码:public class MediaAppWidgetProvider extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
MusicLogUtils.i(TAG, "onUpdate");
isAppWidget = true;
defaultAppWidget(context, appWidgetIds);
// Send broadcast intent to any running MediaPlaybackService so it can
// wrap around with an immediate update.
Intent updateIntent = new Intent(context, MediaPlaybackService.class);
updateIntent.setAction(MediaPlaybackService.SERVICECMD);
updateIntent.putExtra(MediaPlaybackService.CMDNAME, MediaAppWidgetProvider.CMDAPPWIDGETUPDATE);
updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
updateIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
context.startService(updateIntent);
} //重写appWidgetProvider的onUpdate方法,此方法当小部件更新时会触发.
private void defaultAppWidget(Context context, int[] appWidgetIds) {
final Resources res = context.getResources();
final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.album_appwidget);
views.setViewVisibility(R.id.title, View.GONE);
/// M: Set default play/pause button image resource
views.setImageViewResource(R.id.control_play, R.drawable.rgk_music_btn_play);
views.setTextViewText(R.id.artist, res.getText(R.string.widget_initial_text));
linkButtons(context, views, false /* not playing */);
pushUpdate(context, appWidgetIds, views);
}
private void pushUpdate(Context context, int[] appWidgetIds, RemoteViews views) {
// Update specific list of appWidgetIds if given, otherwise default to
// all
final AppWidgetManager gm = AppWidgetManager.getInstance(context);
MusicLogUtils.i(TAG, "pushUpdate");
/// M: update app widget @{
if (appWidgetIds != null) {
4
gm.updateAppWidget(appWidgetIds, views);
} else {
gm.updateAppWidget(new ComponentName(context, this.getClass()), views);
}
/// @}
}
private boolean hasInstances(Context context) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, this.getClass()));
/// M: log appWidgetIds status @{
int widgetLength = (appWidgetIds == null ? 0 : appWidgetIds.length);
MusicLogUtils.i(TAG, "hasInstances number is " + widgetLength);
/// @}
return (widgetLength > 0);
}
void notifyChange(MediaPlaybackService service, String what) {
/// M: add QUIT_PLAYBACK status to update widget and l