2

Android 4.1.1 の AppWidget に非常に奇妙な問題があります。現在、音楽プレーヤー アプリケーションとそのウィジェットを開発しています。曲の変更、プレーヤーの開始および停止時にウィジェットを更新する必要があります。アプリケーションのプレイリストと同期する必要がある ListView があります。

Jelly Bean の前は、すべて正常に機能していました。私のテスト デバイスが 4.0.3 から 4.1.1 にアップグレードされた後、ウィジェットがプログラムによって強制的に更新されるたびに、Android のメッセージング ウィジェットのレイアウトが私のウィジェットに数秒間設定されます。4.1 のエミュレーターでもこのケースを確認しましたが、正常に動作します。

そのコードを使用して、ウィジェットを強制的に更新します。

AppWidgetManager man = AppWidgetManager.getInstance(applicationContext);
int[] ids = man.getAppWidgetIds(
        new ComponentName(applicationContext, MuzikLargeWidgetProvider.class));
Intent updateIntent = new Intent();
updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
applicationContext.sendBroadcast(updateIntent);

そして、これが私の onUpdate メソッドです

public void onUpdate(Context context, AppWidgetManager appWidgetManager,
        int[] appWidgetIds) {
    this.context = context;
    this.appWidgetManager = appWidgetManager;

    ComponentName thisWidget = new ComponentName(context,
            MuzikLargeWidgetProvider.class);
    int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);

    for (int appWidgetId : allWidgetIds) {
        Intent svcIntent = new Intent(context, UpdateService.class);
        svcIntent.putExtra(WidgetActions.DATA_WIDGET_ID, appWidgetId);
        context.startService(svcIntent);
    }

    super.onUpdate(context, appWidgetManager, appWidgetIds);
}

ウィジェットを更新するために、静的内部クラスであるサービス (UpdateService) を使用しています。

public static class UpdateService extends IntentService {

    public UpdateService() {
        super("UpdateService");
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    public RemoteViews buildUpdate(Context context, int widgetId) {

        final RemoteViews views = new RemoteViews(context.getPackageName(),
                R.layout.muzikwidget_large);

        return views;
    }


    @Override
    protected void onHandleIntent(Intent intent) {
        // Build the widget update
        RemoteViews updateViews = buildUpdate(this, intent.getIntExtra(WidgetActions.DATA_WIDGET_ID, 0));

        // Push update for this widget to the home screen
        ComponentName thisWidget = new ComponentName(this, MuzikLargeWidgetProvider.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(this);
        manager.updateAppWidget(thisWidget, updateViews);
    }
}

buildUpdate メソッドはさらにいくつかのこと (ウィジェットのボタンのインテントの設定、テキストビューの設定など) を行いますが、それらは私の問題とは関係ありません。Asus TF 300 TG タブレット (ルート化されていない) でこの問題が発生しています。

どんな助けでも大歓迎です。

4

1 に答える 1

2

問題は解決しました。ウィジェットを強制的に更新するために使用するコード部分を変更しました。これは機能しています:

AppWidgetManager man = AppWidgetManager.getInstance(applicationContext);
int[] ids = man.getAppWidgetIds(
        new ComponentName(applicationContext, MuzikLargeWidgetProvider.class));

for (int appWidgetId : ids) {
    Intent svcIntent = new Intent(applicationContext, UpdateService.class);
    svcIntent.putExtra(WidgetActions.DATA_WIDGET_ID, appWidgetId);
    applicationContext.startService(svcIntent);
}

Widget の onUpdate メソッドは呼び出されず、UpdateService が直接呼び出されます。sendBroadcast は時々避けるべきだと思われます。

編集

ブロードキャストを使用してウィジェットを更新する必要がある場合、これはそれを達成するための適切な方法のようです:

AppWidgetManager man = AppWidgetManager.getInstance(applicationContext);
int[] ids = man.getAppWidgetIds(
        new ComponentName(applicationContext, MuzikLargeWidgetProvider.class));
Intent updateIntent = new Intent(applicationContext, MuzikLargeWidgetProvider.class);
updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
applicationContext.sendBroadcast(updateIntent);
于 2012-10-09T14:33:01.163 に答える