1

Android 開発と Java は初めてで、AlarmManager を使用してウィジェットを更新しようとしていますが、ほとんどのチュートリアルで次の方法でウィジェットを更新しない理由を完全には理解できません。textview を使用してウィジェットに数値を表示し、1 秒ごとに増分し、ウィジェットが削除されると 10 ずつ減分され、すべてのウィジェットが削除されると 0 にリセットされます。

public class widget_1_1 extends AppWidgetProvider {
    private static int var1 = 0;

    public void onReceive(Context context, Intent intent)
    {
        AppWidgetManager widgetManager = AppWidgetManager.getInstance(context);
        ComponentName widgetComponent = new ComponentName(context.getPackageName(), this.getClass().getName());
        int[] widgetId = widgetManager.getAppWidgetIds(widgetComponent);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

        if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_UPDATE))
        {
            this.onUpdate(context, AppWidgetManager.getInstance(context), widgetId);
            alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime()+1000, 1000, pendingIntent);
        }
        else if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_DELETED))
        {
            // one widget deleted
            var1-=10;
        }
        else if (intent.getAction().equals(AppWidgetManager.ACTION_APPWIDGET_DISABLED))
        {
            // last widget deleted
            alarmManager.cancel(pendingIntent);
            var1=0;
        }
    }

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
    {
         var1++;
        // Code to update widget by calling appWidgetManager.updateAppWidget here
    }
}

上記の方法に何か問題がありますか?私が見るすべてのチュートリアルでは、クラスでプライベート静的最終文字列 alarmAction = "com.elison.widget1.ALARM_ACTION" または同様の文字列を使用し、それを使用して PendingIntent を取得します。私はその利点が何であるかを理解していません.なぜ上記の簡単な方法ではないのですか?

public void onReceive(Context context, Intent intent)
{
    // Some code
    Intent enable = new Intent(alarmAction);
    intent.setClass(context, WYDAppWidgetProvider_4_1.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, enable, 0);
    // Some tutorials use PendingIntent.FLAG_UPDATE_CURRENT instead of 0 in 4th parameter
    // more code
}
4

1 に答える 1

0

コードの唯一の問題はPendingIntent、WIDGET_UPDATE アクションかどうかをチェックする if ステートメント内に作成する必要があることです。AlarmManagerもう1つは、繰り返しアラームマネージャーを使用しているため、毎回作成する必要がないことです。widgetIdまた、配列を毎回手動で抽出する場合は、if ステートメントにも含める必要があります。

于 2013-06-17T07:26:00.007 に答える