私はAndroidの初心者です。私はAndroidのドキュメントを読みましたが、それでも説明が必要です。誰もが私にPendingIntent
とは一体何なのか教えてもらえますか?
PendingIntent
は外部アプリケーション(例えばNotificationManager
、AlarmManager
、ホームスクリーンAppWidgetManager
、または他のサードパーティアプリケーション)に渡すトークンで、は外部アプリケーションがあなたのアプリケーションの許可を使用して事前定義されたコードを実行することを可能にします。.
あなたが外部アプリケーションにIntentを与えると、それはあなた自身のパーミッションであなたのIntent
を実行します。しかし、あなたが外国のアプリケーションにPendingIntent
を与えると、そのアプリケーションはあなたのアプリケーションの許可を使ってあなたのIntent
を実行します。
インテントは、ユーザーが何らかの作業を実行するという意図を表す、Androidの標準メッセージングメカニズムです。彼らはあなたがあなたによってまたはAndroidオペレーティングシステムによって定義された他のコンポーネントと対話することを可能にします。
例:
電話番号をダイヤルするか電話に応答する
彼らは両方の方法で使用されています
1)あなたがコンポーネントを呼び出す
2)システムが何らかのイベントを通知する.
インテントを作成するための論理的なワークフローは、通常、次のとおりです。
実生活の例:朝起きて、洗面所に行くために "INTEND"としましょう。私は最初に洗面所に行くことについて考えなければならないでしょう、しかしそのことは本当に洗面所に私をつかまえません。それから私は私の脳に最初にベッドから起き上がり、それから洗面所に歩き、そして次に解放し、そして私の手を洗って行き、そして私の手を拭いて行くように言わなければならないでしょう。どこに行くのかがわかったら、コマンドを送信して私の体が行動を起こします。
PendingIntent
は将来実行するアクションを指定します。将来のIntentを別のアプリケーションに渡して、そのIntentがsame permissions as your application
を持っているかのようにそのIntentを実行できるようにします。これは、外部アプリケーションが自分のアプリケーションのアクセス許可を使用して事前定義されたコードを実行できるようにするための、外部アプリケーションに渡すトークンです。
他のアプリケーションにPendingIntent
を与えることで、あなたは他のアプリケーションがあなた自身であるかのように(同じ許可とアイデンティティを持って)あなたが指定した操作を実行する権利をそれに与えています。そのため、あなたはPendingIntent
をどのように構築するかについて注意を払うべきです:例えば、あなたが提供する基本インテントはあなた自身のコンポーネントの1つに明示的に設定されるそれは最終的にそこにそしてどこにも送られない。
それはあなたが実行したいが後で実行する意図的な行動です。氷の上に意図を置くことだと思います。必要なのは、アプリケーションで有効なContext
からインテントを作成して起動する必要があるためですが、技術的にはアプリケーションのコンテキスト外であるため、アクションを実行したいときに利用できない場合があります。 2つの一般的な例は、NotificationまたはBroadcastReceiver
から起動するために使用したいPendingIntent
を作成することです。たとえば、(別のActivityまたはService内から)Context
を使用しながらActivityを作成することによって
実際の例から続けて、シャワーを浴びたいが、歯を磨いて朝食を食べた後にシャワーを浴びたいとしましょう。だから私は少なくとも30-40分はシャワーを浴びないことを知っています。私はまだ自分の服を整え、それから階段を上がって浴室に戻り、それから脱いでシャワーを浴びる必要があることを頭の中に持っています。ただし、これは30〜40分が経過するまで起こりません。今シャワーを浴びるつもりです。 30〜40分間保留中です。
それは、ペンディングインテントとレギュラーインテントとの違いです。要するに:
通常の意図 - > DOES NOT REQUIRE PENDING INTENT TO BE MADE
保留中の意図 - > REQUIRES A REGULAR INTENT TO BE CREATED
インテントは2つのタイプ - ExplicitとImplicit
明示的意図:アプリケーションが、何らかのアクションを実行するために呼び出すコンポーネントを認識している場合
暗黙の意図:アプリケーションがどのコンポーネントが目的のアクションを正確に実行できるかを認識していない場合。例として、単にURLを表示したいと言っただけでは、システムはどのコンポーネントが意図を満たすかを決定します。
インテントについてのより明確で明確なアイデア。リンクの下に表示
Pending Intentは、アプリケーションプロセスが生きているかどうかに関係なく、無関係にに基づいてアクションを実行するためにアプリに渡すトークンです。
私はドキュメンテーションが十分に詳細であると思います: 未定インテントドキュメント 。
保留中のインテント(ブロードキャストインテント、アラームのスケジュール)などのユースケースを考えるだけで、ドキュメントがより明確で意味のあるものになります。
私の場合、上記の答えも Googleの公式ドキュメント も、PendingIntent
クラスの概念を理解するのに役立ちませんでした。
そして、私はこのビデオを見つけました、 Google I/O 2013、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);
Android.permission.BLUETOOTH_ADMIN
権限を持たない別のアプリケーションにbluetoothIntent
を送信した場合、その受信アプリケーションはstartActivity(bluetoothIntent)
でBluetoothを有効にできません。
この制限はPendingIntent
を使用することで克服されています。受信アプリケーションがPendingIntent
であれば、Bluetoothを有効にするためのAndroid.permission.BLUETOOTH_ADMIN
を持つ必要はありません。 出典 。
ペンディングインテントは将来のある時点で始まるインテントです。通常のインテントは、startActivity(Intent)
またはStartService(Intent)
に渡されるとすぐに始まります。
他のアプリが使えるという将来の意図。
そして、これを作成する例を示します。
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に乗車要求を送ります。それから彼らは先に行き、あなたに代わって彼らの運転手の一人を呼ぶでしょう。
したがって:
Uber/Lyft ------ ThirdParty which receives PendingIntent
Myself --------- Class calling PendingIntent
Taxi Driver ---- ServiceClass
PendingIntentは、他のアプリケーション(Notification Manager、Alarm Manager、その他のサードパーティ製アプリケーションなど)に渡すトークンです。これにより、この他のアプリケーションはアプリケーションの権限を使用して、事前定義されたコードを実行できます。保留インテントを介してブロードキャストを実行するには、PendingIntent.getBroadcast()を介してPendingIntentを取得します。保留中のインテントでアクティビティを実行するには、PendingIntent.getActivity()でアクティビティを受け取ります。
インテントとは何ですか?
IntentはAndroidの特定のコマンドで、Android OSにコマンドを送信して何か特別なことをさせることができます。それが起こるべき行動のようなものだと考えてください。 Eメールの送信、Eメールへの写真の添付、アプリケーションの起動など、実行できるアクションは多数あります。インテントを作成するための論理的なワークフローは、通常、次のとおりです。インテントを作成します。インテントオプションを追加 - >例OSにどのタイプのインテントを送信しているのか、またはその意図に関連付けられている属性(テキスト文字列やインテントとともに渡されるものなど)。意図を実行
実生活の例:朝目が覚めたら、トイレに行くことを「意図」しているとしましょう。私は最初に洗面所に行くことについて考える必要がありますが、それは本当に洗面所に私を取得できません。それから私は私の脳に最初にベッドから起き上がり、それから洗面所に歩き、そして次に解放し、そして私の手を洗って行き、そして私の手を拭いて行くように言わなければならないでしょう。どこに行くのかがわかったら、コマンドを送信して私の体が行動を起こします。
保留インテントとは何ですか?
実生活の例から続けて、シャワーを浴びたいが、歯を磨いて朝食を食べた後にシャワーを浴びたいとしましょう。だから私は少なくとも30-40分までシャワーを浴びないだろうことを知っています。私はまだ自分の服を整え、それから階段を上がって浴室に戻り、それから脱いでシャワーを浴びる必要があることを頭の中に持っています。しかし、これは30-40分が経過するまで起こりません。私は今シャワーを浴びる保留中の意図があります。 30〜40分間保留中です。
それは、ペンディングインテントとレギュラーインテントとの違いです。通常のインテントはPending Intentなしで作成できますが、Pending Intentを作成するには、最初に通常のインテントを設定する必要があります。
簡単な言葉では、
1。実行するインテントおよびターゲットアクションの説明。まずインテントを作成し、次に実行したい特定のJavaクラスをインテントに渡す必要があります。
2。 PendingIntent.getActivity、PendingIntent.getActivities(Context、int、Intent []、int)、PendingIntent.getBroadcast(Context、int、Intent、int)、およびPendingIntent.getService()によって、クラスアクションクラスであるJavaクラスを呼び出すことができます。 Context、int、Intent、int);ここでは、ステップ1から来ているという意図がわかります。
3。次の点に注意してください。PendingIntentを別のアプリケーションに渡すことで、指定した操作を実行する権利を付与することになります。
それは私が長い間読んだ後に学んだことです。
PendingIntent
は基本的に別のIntent
オブジェクトをラップするオブジェクトです。その後、そのアプリケーションに操作を実行する権利、つまり自分のアプリケーションのプロセスから実行されたかのようにインテントを実行する権利を付与している外部アプリケーションに渡すことができます(同じ許可とID)。セキュリティ上の理由から、暗黙的ではなく明示的な意図を常にPendingIntentに渡す必要があります。
PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntentはあなたがあなたの許可を得て実行するためにあなたが外国のアプリに与えるトークンで一般的なIntentを包みます。例えば:
あなたの音楽アプリの通知は、あなたが通知アプリが
READ_EXTERNAL_STORAGE
権限を持っているので、あなたがブロードキャストを送るためにPendingIntent
を与えなかった場合、音楽を再生/一時停止することはできません。通知はシステムサービスです(つまり、外国のアプリです)。
その名前が示すように.. PendingIntent
あなたはそれを保留することができます(しばらくしてから)。それは他の目的として機能します..それはあなたのために実行するために他のアプリケーションにあなたのタスクを与える方法です。
APending Intentは、将来実行するアクションを指定します。将来のインテントを別のアプリケーションに渡して、インテントが最終的に呼び出されたときにアプリケーションがまだ存在するかどうかにかかわらず、そのアプリケーションがそのインテントと同じ権限を持っているかのように実行できます。
これは、外部アプリケーションが自分のアプリケーションのアクセス許可を使用して事前定義されたコードを実行できるようにするための、外部アプリケーションに渡すトークンです。
あなたが外国のアプリケーションにIntentを与え、そのアプリケーションがあなたが与えたIntentを送信/ブロードキャストした場合、彼らは自分自身の許可でIntentを実行します。しかし、あなたが代わりにあなたがあなた自身の許可を使って作成した保留中のインテントを外国のアプリケーションに与える場合、そのアプリケーションはあなたのアプリケーションの許可を使って含まれているインテントを実行します。
保留インテントを介してブロードキャストを実行するには、PendingIntent.getBroadcast()を介してPendingIntentを取得します。保留中のインテントでアクティビティを実行するには、PendingIntent.getActivity()でアクティビティを受け取ります。
それはあなたが実行したい意図アクションですが、後で実行します。氷の上に意図を置くことだと思います。必要なのは、アプリケーションでは有効なコンテキストからインテントを作成して起動する必要があるためですが、技術的にはアプリケーションのコンテキストの外側にいるため、アクションを実行したいときに利用できない場合があります。 2つの一般的な例は、NotificationまたはBroadcastReceiverからActivityを起動することです。
起動に使用したいPendingIntentを作成することで、たとえば別のActivityまたはServiceの中からContextを実行することができる状態でActivityを作成し、そのオブジェクトをアプリケーションの一部を起動するために外部のものに渡すことができます。あなたに代わって。
PendingIntentは、プロセスが終了した後でも、アプリケーションが動作するための手段を提供します。 PendingIntentを作成したアプリケーションが強制終了された後でも、そのIntentを実行できることに注意することが重要です。インテントの説明とそれを使って実行するターゲットアクション。このクラスのインスタンスは、getActivity(Context、int、Intent、int)、getBroadcast(Context、int、Intent、int)、getService(Context、int、Intent、int)で作成されます。返されたオブジェクトは他のアプリケーションに渡すことができるので、後であなたが代わりにあなたが記述したアクションを実行することができます。
PendingIntentを他のアプリケーションに与えることで、あなたは他のアプリケーションがあなた自身であるかのように(同じ許可とアイデンティティで)あなたが指定した操作を実行する権利をあなたに与えることになります。そのため、PendingIntentの作成方法には注意が必要です。たとえば、基本のIntentでは、最終的にはどこにも送信されないように、コンポーネント名が明示的に自分のコンポーネントの1つに設定されます。
PendingIntent自体は、それを取得するために使用された元のデータを記述するシステムによって維持されているトークンへの単なる参照です。つまり、所有しているアプリケーションのプロセスが強制終了されても、PendingIntent自体は、それを与えられた他のプロセスから使用可能なままになります。作成アプリケーションが後で同じ種類のPendingIntent(同じ操作、同じIntentアクション、データ、カテゴリ、コンポーネント、同じフラグ)を再取得した場合、それがまだ有効であれば同じトークンを表すPendingIntentを受け取ります。そのため、cancel()を呼び出して削除します。
Pending Intentは、特定の作業を行うために他のアプリケーションにすべての許可を与える意図です。主な活動が破壊されると、Android OSはそこから許可を取り戻します。