3

ドキュメントにPendingIntentPendingIntent.getBroadcast()requestCodeパラメータは「現在使用されていません」と記載されています。ただし、かなり徹底的なテストを行ったところ、さまざまなrequestCodes を設定すると、プログラムの動作が明らかに変わります (また、さまざまなrequestCodes を設定することは、アラームのインテントを区別するための一般的に受け入れられているアプローチのようです)。

非常に明確に使用されているという事実は、requestCode「修正」されるリスクがあるバグですか? または、PendingIntents を区別するために使用し続けることはできますか?

背景:

onCreateメイン アクティビティで次のコードを使用してテスト アプリをセットアップします。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, MyAlarmReceiver.class);
    intent.putExtra("text", "text one");
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    Calendar time = Calendar.getInstance();
    time.setTimeInMillis(System.currentTimeMillis());
    time.add(Calendar.SECOND, 1);
    alarmMgr.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pendingIntent);

    intent = new Intent(this, MyAlarmReceiver.class);
    intent.putExtra("text", "text two");
    pendingIntent = PendingIntent.getBroadcast(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    time.setTimeInMillis(System.currentTimeMillis());
    time.add(Calendar.SECOND, 10);
    alarmMgr.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pendingIntent);

}

非常に単純な AlarmReceiver と同様に:

public class MyAlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, intent.getStringExtra("text"), Toast.LENGTH_SHORT).show();
    }

}

次に、PendingIntents にさまざまなフラグと requestCodes を設定して実験しました。結果は次のとおりです。

https://docs.google.com/spreadsheet/ccc?key=0AnqelXkzmAL0dDNYeVEyekJyRkV1VDZNVVIyQTJkdmc#gid=0

4

1 に答える 1

1

requestCode最も確実に使用されており、かなり長い間使用されています。Android のドキュメントは古くなっています。必要に応じて AOSP ソースを確認してください。

于 2013-03-29T08:14:02.273 に答える