2

ナビゲーションアプリを持っています。ロックアップにかかる時間GPSや受信状態が悪い場合など、しばらく届かない可能性のある位置情報を取得したい。

LocationManager.requestLocationUpdates()位置情報BroadcastRecieverが利用可能になるたびに送信するように要求し、を介してタイムアウトを設定する ために使用することを計画していましたAlarmManager.set()

場所の更新が到着したら、タイムアウトをキャンセルしたいと思います。タイムアウトになったら、位置情報の更新をキャンセルしたいのですが。どちらかが起こる前に私のアプリが殺される可能性があると仮定すると、PendingIntentキャンセルしたいもののために私は失ってしまいます。

どういうわけか保存する方法はありPendingIntentますか?それで、後でタイムアウトや場所の更新をキャンセルするためにそれらを使用できますか?それとも、これについてもっと良い方法がありますか?

4

1 に答える 1

2

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 アクションのみが一致する必要があります)。

したがって、基本的に同じアクションを使用して、アラームを設定/キャンセルするインテントを作成するだけで機能します。

于 2012-10-23T06:43:20.947 に答える