回答:
Aは、PendingIntent
あなたが外国出願に与えることをトークンである(例えばNotificationManager
、AlarmManager
、ホーム画面AppWidgetManager
、または他のサードパーティアプリケーション)、コードの事前に定義された部分を実行するために、アプリケーションのアクセス許可を使用する外国出願することができます。
外部アプリケーションにインテントを与えるIntent
と、独自の権限で実行されます。ただし、外部アプリケーションにを与えるとPendingIntent
、そのアプリケーションはIntent
アプリケーションの権限を使用して実行します。
保留中のインテントは、アプリケーションプロセスが有効かどうかに関係なく、アプリに代わってアクションを実行するためにアプリに付与するトークンです。
ドキュメントは十分に詳細だと思います: Pending Intent docs。
(ブロードキャストインテント、アラームのスケジュール)などの保留中のインテントのユースケースを考えてみてください。ドキュメントがより明確で意味のあるものになります。
私の場合、上記の回答もgoogleの公式ドキュメントも、PendingIntent
クラスの概念を理解するのに役立ちませんでした。
そして、このビデオ、Google I / O 2013、Beyond the Blue Dotセッションを見つけました。このビデオでは、元グーグルのJaikumar Ganeshが何であるかを説明しPendingIntent
、それが私にこれの全体像を与えました。
以下は上記のビデオの転写です(15:24から)。
それで、保留中の意図は何ですか?
これは、アプリプロセスが位置情報プロセスに与えるトークンであり、位置情報プロセスは、関心のあるイベントが発生したときにそれを使用してアプリを起動します。つまり、これは基本的に、バックグラウンドのアプリが常に実行されている必要がないことを意味します。興味のあることが起こったら、私たちはあなたを起こします。これにより、バッテリーを大幅に節約できます。
この説明は、このコードスニペット(セッションのスライドに含まれています)を使用するとより明確になります。
PendingIntent mIntent = PendingIntent.getService(...);
mLocationClient.requestLocationUpdates(locationRequest, mIntent);
public void onHandleIntent(Intent intent) {
String action = intent.getAction();
if (ACTION_LOCATION.equals(action)) {
Location location = intent.getParcelableExtra(...)
}
}
なぜPendingIntentが必要なのですか?私は次のように考えていました
Intent
またはを作成できない理由Intent
同じ目的でシンプルを使用できない理由。例えばIntent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
bluetoothIntent
権限のない別のアプリケーションに送信するとandroid.permission.BLUETOOTH_ADMIN
、その受信アプリケーションはでBluetoothを有効にできませんstartActivity(bluetoothIntent)
。
を使用すると、この制限を克服できPendingIntent
ます。PendingIntent
受信側のアプリケーション、必要性は持っていないandroid.permission.BLUETOOTH_ADMIN
のBluetoothを有効にします。ソース。
他のアプリが使用できる将来の意図。
そして、これは作成するための例です:
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);
タクシーのアナロジー
意図
インテントは通常、サービスの開始に使用されます。例えば:
Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
startService(intent);
これは、タクシーを呼ぶときのようです。
Myself = CurrentClass
Taxi Driver = ServiceClass
保留中の意図
次のようなものを使用する必要があります。
Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
PendingIntent pi = PendingIntent.getService(parameter, parameter, intent, parameter);
getDataFromThirdParty(parameter, parameter, pi, parameter);
これで、このサードパーティがあなたに代わってサービスを開始します。実際の例えは、どちらもタクシー会社であるUberまたはLyftです。
乗車のリクエストをUber / Lyftに送信します。その後、彼らは先に進み、あなたに代わってドライバーの1人を呼び出します。
したがって:
Uber/Lyft ------ ThirdParty which receives PendingIntent
Myself --------- Class calling PendingIntent
Taxi Driver ---- ServiceClass
インテントとは何ですか?
インテントはAndroidの特定のコマンドで、Android OSにコマンドを送信して特定のことを行うことができます。それを、実行する必要があるアクションのように考えてください。電子メールの送信、電子メールへの写真の添付、アプリケーションの起動など、実行できる多くのアクションがあります。インテントを作成する論理的なワークフローは、通常、次のとおりです。インテントを作成するb。インテントオプションを追加->例 OSに送信するインテントのタイプ、またはテキスト文字列やインテントと一緒に渡される何かなど、そのインテントに関連付けられている属性c。インテントを実行する
実際の例:朝起きて、トイレに行くつもりだとしよう。私は最初に洗面所に行くことについて考えなければならないでしょう、しかしそれは本当に私を洗面所に連れて行ってくれません。次に、最初にベッドから出るように脳に伝え、次に洗面所まで歩いて放してから、手を出して手を洗ってから、手を拭いてください。どこに行くかわかったら、コマンドを送信して開始し、体が行動します。
保留インテントとは何ですか?
実生活の例から続けて、シャワーを浴びたいが、歯を磨いて朝食を食べた後でシャワーを浴びたいとしましょう。ですから、少なくとも30〜40分間はシャワーを浴びないことを知っています。私はまだ頭の中で服を準備する必要があり、次に階段を上ってバスルームに戻り、次に服を脱ぎ、シャワーを浴びます。ただし、これは30〜40分が経過するまで発生しません。シャワーを浴びるつもりです。30〜40分間保留中です。
これが保留インテントと通常インテントの違いです。通常のインテントはペンディングインテントなしで作成できますが、ペンディングインテントを作成するには、まずレギュラーインテントをセットアップする必要があります。
PendingIntent
基本的には、別のIntent
オブジェクトをラップするオブジェクトです。次に、そのアプリに操作を実行する権限を付与する外部アプリケーションに渡すことができます。つまり、独自のアプリのプロセスから実行されたかのようにインテントを実行します(同じ権限とID)。セキュリティ上の理由から、暗黙的ではなく常に明示的なインテントをPendingIntentに渡す必要があります。
PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
簡単な言語で、
1.実行するインテントおよびターゲットアクションの説明。最初にインテントを作成し、次に実行したい特定のJavaクラスをインテントに渡す必要があります。
2. PendingIntent.getActivity、PendingIntent.getActivities(Context、int、Intent []、int)、PendingIntent.getBroadcast(Context、int、Intent、int)、およびPendingIntentによって、クラスアクションクラスであるこれらのJavaクラスを呼び出すことができます。 getService(Context、int、Intent、int); ここで、ステップ1からのインテントがわかります。
。3。次の点に注意してください... PendingIntentを別のアプリケーションに与えることにより、指定した操作を実行する権利を付与します。
それは私が長い読書の後に学んだことです。
その名前が示唆するように.. PendingIntent
あなたはそれを保留することができます(しばらくしてから)。それは他の意図と同じように機能します。それはあなたに代わって実行するために他のアプリにあなたのタスクを与える方法です。
A 保留中の意図を指定し、アクションは、将来的に取ります。これにより、将来のインテントを別のアプリケーションに渡し、インテントが最終的に呼び出されたときにアプリケーションがまだ存在しているかどうかに関係なく、そのアプリケーションがアプリケーションと同じ権限を持っているかのようにそのインテントを実行できます。
これは外部アプリケーションに与えるトークンであり、外部アプリケーションがアプリケーションの権限を使用して、事前定義されたコードを実行できるようにします。
外部アプリケーションにインテントを与え、そのアプリケーションがあなたが与えたインテントを送信/ブロードキャストする場合、それらは独自の権限でインテントを実行します。ただし、代わりに、独自の権限を使用して作成した保留中のインテントを外部アプリケーションに与えると、そのアプリケーションは、アプリケーションの権限を使用して、含まれているインテントを実行します。
保留中のインテントを介してブロードキャストを実行するには、PendingIntent.getBroadcast()を介してPendingIntentを取得します。保留中のインテントを介してアクティビティを実行するには、PendingIntent.getActivity()を介してアクティビティを受け取ります。
これは、後で実行したいインテントアクションです。氷の上にインテントを置くことを考えてください。これが必要な理由は、アプリケーションの有効なコンテキストからインテントを作成して起動する必要があるためです。ただし、技術的にはアプリケーションのコンテキスト外にいるため、アクションを実行したいときにインテントを使用できない場合があります( 2つの一般的な例は、通知またはBroadcastReceiverからのアクティビティの起動です。
(別のアクティビティまたはサービス内から)コンテキストを実行しながら、たとえばアクティビティを起動するために使用するPendingIntentを作成することにより、アプリケーションの一部を起動するためにそのオブジェクトを外部のオブジェクトに渡すことができます。あなたに代わって。
PendingIntentは、プロセスが終了した後でも、アプリケーションが機能するための手段を提供します。PendingIntentを作成したアプリケーションが強制終了された後でも、そのIntentは引き続き実行できることに注意することが重要です。インテントと、それを使用して実行するターゲットアクションの説明。このクラスのインスタンスは、getActivity(Context、int、Intent、int)、getBroadcast(Context、int、Intent、int)、getService(Context、int、Intent、int)で作成されます。返されたオブジェクトを他のアプリケーションに渡して、後であなたに代わって説明したアクションを実行できるようにすることができます。
PendingIntentを別のアプリケーションに与えることにより、あたかも他のアプリケーションが自分自身であるかのように(同じ権限とIDで)、指定した操作を実行する権利を付与します。したがって、PendingIntentの作成方法には注意する必要があります。たとえば、多くの場合、たとえば、提供する基本インテントでは、コンポーネント名が独自のコンポーネントの1つに明示的に設定され、最終的にそこに送信され、他の場所には送信されないようにします。
PendingIntent自体は、システムが保持するトークンへの参照であり、トークンの取得に使用された元のデータを記述しています。つまり、その所有アプリケーションのプロセスが強制終了された場合でも、PendingIntent自体は、それを与えられた他のプロセスから引き続き使用できます。作成アプリケーションが後で同じ種類のPendingIntent(同じ操作、同じIntentアクション、データ、カテゴリ、コンポーネント、および同じフラグ)を再取得する場合、それがまだ有効であれば、同じトークンを表すPendingIntentを受け取ります。したがって、cancel()を呼び出して削除します。