PendingIntent インスタンス自体を保存する必要はありません。AlarmManager.cancel(PendingIntent 操作) のドキュメントには、
インテントが一致するアラームをすべて削除します。(filterEquals(Intent) で定義されているように) Intent がこれと一致する任意のタイプのアラームはキャンセルされます。
Intent.filterEquals(Intent) を見ると、次のように書かれています。
インテントの解決 (フィルタリング) のために、2 つのインテントが同じかどうかを判断します。つまり、アクション、データ、タイプ、クラス、およびカテゴリが同じである場合です。これは、インテントに含まれる余分なデータを比較しません。
したがって、同じアクションで PendingIntent を作成し、その新しい保留中のインテントで am.cancel() を実行するだけで、以前の保留中のインテントもキャンセルされます。
簡単なコード サンプルを次に示します。
private static final String ALARM_ACTION = "foo.bar.MY_ALARM_ACTION";
private PendingIntent getAlarmIntent() {
Intent alarmIntent = new Intent(ALARM_ACTION);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); // or whatever flag you need
return pi;
}
そして、上記の関数から返された PendingIntent を使用して am.set() を呼び出し、同じ関数から返された PendingIntent を使用して am.cancel() を呼び出すこともできます。PendingIntent が同じインスタンスであるかどうかは関係ありません。Intent.filterEquals() テストと一致する必要があります (つまり、基本的に Intent アクションのみが一致する必要があります)。
したがって、基本的に同じアクションを使用して、アラームを設定/キャンセルするインテントを作成するだけで機能します。