Android PendingIntentとは何ですか?


回答:


892

Aは、PendingIntentあなたが外国出願に与えることをトークンである(例えばNotificationManagerAlarmManager、ホーム画面AppWidgetManager、または他のサードパーティアプリケーション)、コードの事前に定義された部分を実行するために、アプリケーションのアクセス許可を使用する外国出願することができます

外部アプリケーションにインテントを与えるIntentと、独自の権限で実行されます。ただし、外部アプリケーションにを与えるとPendingIntent、そのアプリケーションはIntentアプリケーションの権限を使用して実行します。


3
通知を除いて、pendingIntentsを使用して他にどこを見たことがありますか?私は通知だけがそれを使用するのを見たと思います...
Android開発者

4
@Johnny_D:つまり、コンポーネント名が独自のクラスの1つを明確に参照する絶対名である明示的なインテントを作成することを意味します。そうしないと、インテントが別のアプリケーションに送信され、そのインテントがアプリケーションの許可の下で実行されるため、問題が発生する可能性があります。
Lie Ryan

3
@LieRyan、ここでのアプリケーション許可は、マニフェストで指定する許可ですか?例えば。インターネット許可?
Diffy 2014年

2
この「アクセス許可の引き渡し」は、セキュリティ面で本当に悪いことではないでしょうか。私はいくつかの権限を与えたアプリケーションAを持っています。次に、より少ない権限を使用するアプリケーションBがあります。アプリケーションAがアプリケーションBでPendingIntentを介して何かを開始できる場合(Aからのすべてのアクセス許可を一時的にBに許可する)、Bはそのアクセス許可で舞台裏でできることは何もできないのですか?たとえば、Aにはユーザーの連絡先を読み取る権限がありますが、Bにはありません。AがPendingIntentをBに送信すると、Bは連絡先を読み取り、悪意のある操作(サーバーへの送信など)を実行できます。
ティアゴ

6
@ティアゴ:あなたの場合、特権アプリケーションAがアプリケーションBに保留インテントを与え、Bが連絡先データを読みたいときにそれを送信できるようにします。ユーザーがBに提供したい連絡先データをユーザーに尋ね、Bだけにそのデータを提供するのはAの責任です。Pending Intentは特権エスカレーションメカニズムであり、特権エスカレーションメカニズムと同じように、大きな力には大きな責任が伴います。ユーザーが選択した連絡先データに対してアプリケーションBが信頼できるかどうかを判断するのは、ユーザーの責任です。
リーライアン

48

保留中のインテントは、アプリケーションプロセスが有効かどうかに関係なく、アプリに代わってアクションを実行するためにアプリに付与するトークンです。

ドキュメントは十分に詳細だと思います: Pending Intent docs

(ブロードキャストインテント、アラームのスケジュール)などの保留中のインテントのユースケースを考えてみてください。ドキュメントがより明確で意味のあるものになります。


Intentは、他のアプリに代わってアクションを実行するためのトークンの一種でもあると思います。保留中のインテントとインテントの唯一の違いは、アプリケーションプロセスの寿命ですか?
CopsOnRoad 2018年

40

私の場合、上記の回答も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が他のアプリに与える権限については何も教えてくれません。
CopsOnRoad

35

なぜPendingIntentが必要なのですか?私は次のように考えていました

  1. 受信側アプリケーション自体がIntentまたはを作成できない理由
  2. Intent同じ目的でシンプルを使用できない理由。

例えばIntent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

bluetoothIntent権限のない別のアプリケーションに送信するとandroid.permission.BLUETOOTH_ADMIN、その受信アプリケーションはでBluetoothを有効にできませんstartActivity(bluetoothIntent)

を使用すると、この制限を克服できPendingIntentます。PendingIntent受信側のアプリケーション、必要性は持っていないandroid.permission.BLUETOOTH_ADMINのBluetoothを有効にします。ソース


3
あなたのbluetoothIntentの例は本当に価値があります。ありがとう
ニックス2015年

1
@Kiran-受信アプリケーションがBluetoothをオンにできる場合(保留中のインテントを使用)、そのアプリがマニフェストにこのアクセス許可を含めなかったのはなぜですか?これは、電話をかけることができるアプリを作っているようなものですが、この電話をかけるために他のアプリから保留中のインテントを送って欲しいので、許可CALL_PHONEを含めていません。これはあなたが言いたいことですか?
CopsOnRoad 2018年

1
@CopsOnRoad PendingIntentの受信アプリは、あらゆる要求を受信し、要求者に代わって要求を実行する一般的なアプリケーションにすることができます。その役割は単なる仲介者であるため、すべての権限がありません。この種の仲介者アプリの例は、通知マネージャーです。これは、権限を所有することなく、通知から目的のアプリを起動できます。
Xiao-Feng Li

21

ペンディングインテントは、将来のある時点で開始されるインテントです。通常のインテントは、startActivity(Intent)またはに渡されるとすぐに開始されStartService(Intent)ます。


13

他のアプリが使用できる将来の意図。
そして、これは作成するための例です:

Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);

8
「将来」または他のアプリで使用できるインテントの何が特別であるかを実際に説明しないため、反対票を投じる
Vic

@ WhereDatApp.comそれはアントワーヌドサンテグジュペリによって言われ、ルイスガランティエールによって翻訳されました;)
Choletski

@Choletskiおかげで、私は👍翻訳知りませんでした
オデッドBreiner

13

タクシーのアナロジー

意図

インテントは通常、サービスの開始に使用されます。例えば:

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

11

PendingIntentは、別のアプリケーション(通知マネージャー、アラームマネージャー、その他のサードパーティアプリケーションなど)に付与するトークンです。これにより、この他のアプリケーションはアプリケーションの権限を使用して、事前定義されたコードを実行できます。保留中のインテントを介してブロードキャストを実行するには、PendingIntent.getBroadcast()を介してPendingIntentを取得します。保留中のインテントを介してアクティビティを実行するには、PendingIntent.getActivity()を介してアクティビティを受け取ります。


7

インテントとは何ですか?

インテントはAndroidの特定のコマンドで、Android OSにコマンドを送信して特定のことを行うことができます。それを、実行する必要があるアクションのように考えてください。電子メールの送信、電子メールへの写真の添付、アプリケーションの起動など、実行できる多くのアクションがあります。インテントを作成する論理的なワークフローは、通常、次のとおりです。インテントを作成するb。インテントオプションを追加->例 OSに送信するインテントのタイプ、またはテキスト文字列やインテントと一緒に渡される何かなど、そのインテントに関連付けられている属性c。インテントを実行する

実際の例:朝起きて、トイレに行くつもりだとしよう。私は最初に洗面所に行くことについて考えなければならないでしょう、しかしそれは本当に私を洗面所に連れて行ってくれません。次に、最初にベッドから出るように脳に伝え、次に洗面所まで歩いて放してから、手を出して手を洗ってから、手を拭いてください。どこに行くかわかったら、コマンドを送信して開始し、体が行動します。

保留インテントとは何ですか?

実生活の例から続けて、シャワーを浴びたいが、歯を磨いて朝食を食べた後でシャワーを浴びたいとしましょう。ですから、少なくとも30〜40分間はシャワーを浴びないことを知っています。私はまだ頭の中で服を準備する必要があり、次に階段を上ってバスルームに戻り、次に服を脱ぎ、シャワーを浴びます。ただし、これは30〜40分が経過するまで発生しません。シャワーを浴びるつもりです。30〜40分間保留中です。

これが保留インテントと通常インテントの違いです。通常のインテントはペンディングインテントなしで作成できますが、ペンディングインテントを作成するには、まずレギュラーインテントをセットアップする必要があります。


私はシンプルで例がとても好きで、その言葉でかなりよく理解しました。
Josema

この投稿があなたに役立つことをうれしく思いますJosema
Narendra Motwani

これは、上記のShakeeb Ayazの説明とまったく同じです。誰が誰からコピーしたの?:)
likejudo

5

PendingIntent基本的には、別のIntentオブジェクトをラップするオブジェクトです。次に、そのアプリに操作を実行する権限を付与する外部アプリケーションに渡すことができます。つまり、独自のアプリのプロセスから実行されたかのようにインテントを実行します(同じ権限とID)。セキュリティ上の理由から、暗黙的ではなく常に明示的なインテントをPendingIntentに渡す必要があります。

 PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
                    PendingIntent.FLAG_CANCEL_CURRENT);

4

簡単な言語で、
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を別のアプリケーションに与えることにより、指定した操作を実行する権利を付与します。

それは私が長い読書の後に学んだことです。


3

PendingIntentは、一般的なインテントを、外部アプリに付与して許可を得て実行するトークンでラップします。たとえば:

音楽アプリに通知PendingIntentアプリがREAD_EXTERNAL_STORAGE許可していない権限があるため、ブロードキャストの送信を許可しなかった場合、音楽アプリの通知は音楽を再生/一時停止できません。通知はシステムサービスです(つまり、外部アプリです)。


素晴らしい例!
likejudo

2

その名前が示唆するように.. PendingIntent

あなたはそれを保留することができます(しばらくしてから)。それは他の意図と同じように機能します。それはあなたに代わって実行するために他のアプリにあなたのタスクを与える方法です。


1
これの実際の例を挙げられますか?
CopsOnRoad 2018年

0

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()を呼び出して削除します。


0

保留中のインテントは、特定の作業を行うために他のアプリケーションにすべての権限を提供するインテントです。メインアクティビティが破棄されると、Android OSはそれから許可を取り戻します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.