私はAndroidの初心者です。Androidのドキュメントを読みましたが、さらに説明が必要です。誰かが正確に何であるか教えてもらえますPendingIntent
か?
18 に答える
Aは、外部アプリケーション(たとえば、ホーム画面、またはその他のサードパーティアプリケーション)にPendingIntent
与えるトークンです。これにより、外部アプリケーションは、アプリケーションの権限を使用して、事前定義されたコードを実行できます。NotificationManager
AlarmManager
AppWidgetManager
Intent
外部アプリケーションにインテントを与えると、それは独自の権限であなたを実行します。ただし、外部アプリケーションにを与えると、そのアプリケーションはアプリケーションの許可を使用してPendingIntent
実行されます。Intent
保留中のインテントは、アプリケーションプロセスが有効であるかどうかに関係なく、アプリに代わってアクションを実行するためにアプリに与えるトークンです。
ドキュメントは十分に詳細だと思います: PendingIntentdocs。
(ブロードキャストインテント、アラームのスケジュール設定)などの保留中のインテントのユースケースを考えてみてください。そうすれば、ドキュメントがより明確で意味のあるものになります。
なぜPendingIntentが必要なのですか?私は次のように考えていました
- 受信アプリケーション自体が
Intent
またはを作成できない理由 Intent
同じ目的で単純なものを使用できないのはなぜですか。
例えばIntent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
bluetoothIntent
権限のない別のアプリケーションに送信するとandroid.permission.BLUETOOTH_ADMIN
、その受信アプリケーションはでBluetoothを有効にできませんstartActivity(bluetoothIntent)
。
制限は、を使用して克服されPendingIntent
ます。受信アプリケーションでは、Bluetoothを有効にするPendingIntent
ために持っている必要はありません。ソース。android.permission.BLUETOOTH_ADMIN
私の場合、上記の回答もGoogleの公式ドキュメントPendingIntent
も、クラスの概念を理解するのに役立ちませんでした。
そして、このビデオ、Google I / O 2013、Beyond theBlueDotセッションを見つけました。このビデオでは、元グーグルの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(...)
}
}
保留中のインテントは、将来のある時点で開始されるインテントです。startActivity(Intent)
通常のインテントは、またはに渡されるとすぐに開始されStartService(Intent)
ます。
タクシーアナロジー
意図
インテントは通常、サービスを開始するために使用されます。例えば:
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
他のアプリが使用できる将来の意図。
そして、これを作成する例を次に示します。
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);
インテントとは何ですか?
インテントはAndroidの特定のコマンドであり、AndroidOSにコマンドを送信して特定のことを実行できます。実行する必要のあるアクションと考えてください。メールを送信したり、写真をメールに添付したり、アプリケーションを起動したりするなど、実行できるアクションはたくさんあります。インテントを作成する論理的なワークフローは、通常、次のとおりです。インテントを作成するb。インテントオプションの追加->例 OSに送信するインテントのタイプ、またはインテントと一緒に渡されるテキスト文字列や何かなど、そのインテントに関連付けられている属性c。インテントを実行する
実際の例:朝起きて、洗面所に行くつもりだとしましょう。私は最初に洗面所に行くことについて考えなければなりません、しかしそれは本当に私を洗面所に連れて行きません。次に、最初にベッドから出て、洗面所に歩いて行き、離して、手を洗ってから、手を拭くように脳に指示する必要があります。どこに行くのかがわかったら、コマンドを送信して開始し、体が行動を起こします。
保留中のインテントとは何ですか?
実際の例から続けて、シャワーを浴びたいが、歯を磨いて朝食を食べた後にシャワーを浴びたいとしましょう。だから私は少なくとも30〜40分までシャワーを浴びないことを知っています。私はまだ頭の中に服を準備し、階段を上ってバスルームに戻り、服を脱ぎ、シャワーを浴びる必要があると思っています。ただし、これは30〜40分が経過するまで発生しません。私は今、シャワーを浴びるという保留中の意図を持っています。30〜40分間保留中です。
これは、保留中のインテントと通常のインテントのほとんどの違いです。通常のインテントは、保留中のインテントなしで作成できますが、保留中のインテントを作成するには、最初に通常のインテントを設定する必要があります。
保留中のインテントは、別のアプリケーション(Notification Manager、Alarm Manager、または他のサードパーティアプリケーションなど)に与えるトークンです。これにより、この他のアプリケーションは、アプリケーションのアクセス許可を使用して、事前定義されたコードを実行できます。保留中のインテントを介してブロードキャストを実行するには、PendingIntent.getBroadcast()を介してPendingIntentを取得します。保留中のインテントを介してアクティビティを実行するには、PendingIntent.getActivity()を介してアクティビティを受け取ります。
PendingIntent
基本的に、別のオブジェクトをラップするIntent
オブジェクトです。次に、そのアプリに操作を実行する権利を付与している外部アプリケーションに渡すことができます。つまり、自分のアプリのプロセスから実行されたかのようにインテントを実行します(同じ権限とID)。セキュリティ上の理由から、暗黙的ではなく、常に明示的なインテントをPendingIntentに渡す必要があります。
PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
保留中のインテントは、将来実行するアクションを指定します。これにより、将来のインテントを別のアプリケーションに渡し、そのアプリケーションが、最終的にインテントが呼び出されたときにアプリケーションがまだ存在しているかどうかに関係なく、アプリケーションと同じ権限を持っているかのようにそのインテントを実行できるようになります。
これは、外部アプリケーションに与えるトークンであり、外部アプリケーションがアプリケーションの権限を使用して、事前定義されたコードを実行できるようにします。
外部アプリケーションにインテントを指定し、そのアプリケーションが指定したインテントを送信/ブロードキャストすると、外部アプリケーションは独自の権限でインテントを実行します。ただし、代わりに、独自の権限を使用して作成した保留中のインテントを外部アプリケーションに与えると、そのアプリケーションは、アプリケーションの権限を使用して、含まれているインテントを実行します。
保留中のインテントを介してブロードキャストを実行するには、PendingIntent.getBroadcast()を介してPendingIntentを取得します。保留中のインテントを介してアクティビティを実行するには、PendingIntent.getActivity()を介してアクティビティを受け取ります。
実行したいインテントアクションですが、後で実行します。氷の上にインテントを置くことを考えてください。インテントが必要な理由は、アプリケーションの有効なコンテキストからインテントを作成して起動する必要があるためですが、技術的にアプリケーションのコンテキスト外にあるため、アクションを実行するときにインテントが使用できない場合があります( 2つの一般的な例は、NotificationまたはBroadcastReceiverからアクティビティを起動することです。
たとえば、(別のアクティビティまたはサービスの内部から)実行するコンテキストがあるときにアクティビティを起動するために使用するPendingIntentを作成することにより、アプリケーションの一部を起動するために、そのオブジェクトを外部の何かに渡すことができます。あなたに代わって。
保留中のインテントは、プロセスが終了した後でも、アプリケーションが機能するための手段を提供します。保留中のインテントを作成したアプリケーションが強制終了された後でも、そのインテントは実行できることに注意することが重要です。インテントとそれを使用して実行するターゲットアクションの説明。このクラスのインスタンスは、getActivity(Context、int、Intent、int)、getBroadcast(Context、int、Intent、int)、getService(Context、int、Intent、int);で作成されます。返されたオブジェクトを他のアプリケーションに渡して、後でユーザーに代わって説明したアクションを実行できるようにすることができます。
別のアプリケーションにPendingIntentを付与することにより、他のアプリケーションが自分自身であるかのように(同じ権限とIDで)指定した操作を実行する権利をアプリケーションに付与することになります。そのため、PendingIntentの作成方法に注意する必要があります。たとえば、多くの場合、指定するベースインテントでは、コンポーネント名が独自のコンポーネントの1つに明示的に設定され、最終的にそこに送信され、他の場所には送信されません。
保留中のインテント自体は、システムが保持するトークンへの参照であり、トークンの取得に使用された元のデータを記述しています。これは、所有するアプリケーションのプロセスが強制終了された場合でも、PendingIntent自体がそれを与えられた他のプロセスから引き続き使用できることを意味します。作成中のアプリケーションが後で同じ種類のPendingIntent(同じ操作、同じIntentアクション、データ、カテゴリ、コンポーネント、および同じフラグ)を再取得する場合、それがまだ有効である場合、同じトークンを表すPendingIntentを受け取ります。したがって、cancel()を呼び出して削除します。
簡単な言葉で、
1.実行するインテントおよびターゲットアクションの説明。最初にインテントを作成し、次に実行する特定のJavaクラスをインテントに渡す必要があります。
2.クラスアクションクラスであるJavaクラスは、PendingIntent.getActivity、PendingIntent.getActivities(Context、int、Intent []、int)、PendingIntent.getBroadcast(Context、int、Intent、int)、およびPendingIntentによって呼び出すことができます。 getService(Context、int、Intent、int); ここでは、ステップ1からのインテントが表示され
ます。3。次の点に注意してください...別のアプリケーションにPendingIntentを与えることにより、指定した操作を実行する権利がアプリケーションに付与されます。
それは私が長い間読んだ後に学んだことです。
保留中のインテントは、許可を得て実行するために外部アプリに与えるトークンで一般的なインテントをラップします。例:
PendingIntent
音楽アプリには通知アプリにはない許可があるため、ブロードキャストの送信を許可しなかった場合、音楽アプリの通知は音楽を再生/一時停止できREAD_EXTERNAL_STORAGE
ません。通知はシステムサービスです(つまり、外部アプリです)。
その名前が示すように..PendingIntent
あなたはそれを保留することができます(しばらくしてからそれをしてください)。それは他の意図として機能します..それはあなたに代わって実行するために他のアプリにあなたのタスクを与える方法です。
簡単な言葉で
Apending intent
は基本的に、他のアプリやサービスなどnotification manager
に渡してalarm manager
、実行するのに適切なタイミング/動作がいつであるかを処理させることを目的としています。
保留中のインテント
保留中のインテントは、別のアプリケーションで使用するように設計された通常のインテントのラッパーです。
これにより、他のアプリケーションは、アプリケーションに付与されているすべての権限を持つアプリケーションであるため、含まれているアクションを実行できます。
後で、または指定された時間間隔の後に、Activity / Service / BroadcastReceiverなどのアプリケーションコンポーネントを開く場合は、この場合、PendingIntentを送信する必要があります。これは、しばらくしてからアプリケーションのコードを実行するために別のアプリに与えた許可証のように機能します。したがって、PendingIntentは、別のプロセスの別のアプリであるAlarmManagerが必要な場合のように、プロセスの境界を超えて機能し、PendingIntentで指定されたアプリでAlarmManagerのパフォーマンスアクションを実行します。
保留中のインテントは、特定の作業を行うために他のアプリケーションにすべての許可を与えるインテントです。メインアクティビティが破棄されると、AndroidOSはそのアクティビティから権限を取り戻します。
通知でPendingIntentsに遭遇しました。だからここに簡単な説明があります:
通知のインテントを提供します。この場合、カメラキャプチャ機能を実行するアクティビティを開きます。ここで、単にIntentを渡すと、私のアプリにはマニフェストに記載されているこの権限がありますが、NotificationManagerにはこの権限がありません。このため、NotificationManagerにはそのための権限がないため、アクションは機能しません。
ただし、PendingIntentを使用する場合、ここでは、NotificationManagerの代わりに私のアプリが持つ権限が使用されます。したがって、NotificationManagerにカメラ権限がなく、私のアプリにカメラ権限がある場合でも、アクティビティを開いてアプリを実行します。
注:保留中のインテントでは、最初に通常のインテントを設定する必要があります。