IntentとPendingIntentの違い


96

私はいくつかの記事を読みましたが、どちらも同じことをしているようで、そのようにサービスを開始することの違いは何だろうと思っていました。

Intent intent = new Intent(this, HelloService.class);
startService(intent);

またはそのように:

Calendar cal = Calendar.getInstance();
Intent intent = new Intent(this, MyService.class);
PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent); 

読んだとおり、サービスでパラメーターSTART_STICKYを返す場合、これら2つは同じことを行います。


違いはありません。何があると思いますか?前者の場合は「今」開始し、後者の場合は後の時間/データ用にスケジュールするだけです。
Squonk 2014年

回答:


149

意図

Androidインテントは、インテントを運ぶオブジェクトです。つまり、アプリケーションの内部または外部の1つのコンポーネントから別のコンポーネントへのメッセージです。インテントは、アプリケーションの3つのコアコンポーネント(Activities、Services、BroadcastReceivers)の間でメッセージをやり取りできます。

インテント自体は、インテントオブジェクトであり、パッシブなデータ構造です。実行される操作の抽象的な説明を保持します。

たとえば、メールクライアントを起動してメールを送信する必要があるアクティビティがあるとします。これを行うには、アクティビティがACTION_SEND適切なセレクターとともにアクションとともにインテントをAndroidインテントリゾルバーに送信します。

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:")); // only email apps should handle this

指定されたチューザーは、ユーザーが電子メールデータの送信方法を選択するための適切なインターフェイスを提供します。

明示的な意図

// Explicit Intent by specifying its class name
   Intent i = new Intent(this, TargetActivity.class);
   i.putExtra("Key1", "ABC");
   i.putExtra("Key2", "123");

// Starts TargetActivity
   startActivity(i);

暗黙の意図

// Implicit Intent by specifying a URI
   Intent i = new Intent(Intent.ACTION_VIEW, 
   Uri.parse("http://www.example.com"));

// Starts Implicit Activity
   startActivity(i); 

保留中の意図

PendingIntentは、外部アプリケーション(NotificationManager、AlarmManager、Home Screen AppWidgetManager、またはその他のサードパーティアプリケーションなど)に付与するトークンです。これにより、外部アプリケーションはアプリケーションの権限を使用して、事前定義されたコードを実行できます。

PendingIntentを別のアプリケーションに与えることにより、他のアプリケーションが自分自身であるかのように(同じ権限とIDで)、指定した操作を実行する権利をそのアプリケーションに付与します。そのため、PendingIntentの作成方法には注意が必要です。たとえば、提供する基本インテントでは、コンポーネント名を独自のコンポーネントの1つに明示的に設定して、最終的に他のどこにも送信されないようにする必要があります。

保留中のインテントの例:http : //android-pending-intent.blogspot.in/

出典:AndroidインテントAndroidペンディングインテント

お役に立てれば。


25

PendingIntentはのラッパーですIntent。を受け取った外部アプリは、によってラップされPendingIntentているコンテンツを認識していません。外国のアプリの使命は、いくつかの条件が満たされたときにインテントを所有者に送り返すことです(例:スケジュール付きのアラーム、クリックによる通知...)。条件は所有者によって指定されますが、外部アプリによって処理されます(例:アラーム、通知)。IntentPendingIntent

外部アプリがアプリにインテントを送信した場合、その外部アプリがインテントのコンテンツを知っていることを意味します。外部アプリがインテントを送信することを決定すると、アプリはいくつかの条件を満たすためにインテントを処理する必要があります=>アプリはシステムのパフォーマンスリソースを取得します。


4

別の単純な違い:

  • アプリが強制終了されるとすぐに、通常の意図は消えます。

  • 保留中の意図が死ぬことはありません。アラームサービス、位置情報サービス、またはその他のサービスで必要とされる限り、それらは存続します。


1

AlarmManagerを介して定期的にサービスを開始する

アクティビティと同様に、Androidシステムはリソースを節約するためにいつでもサービスのプロセスを終了できます。このため、単にTimerTaskサービスでa を使用して、定期的に実行されるようにすることはできません。

したがって、サービスの正しいスケジューリングにはAlarmManagerクラスを使用します。

更新:

したがって、2つの間に実際の違いはありません。しかし、あなたはサービスの実行かどうかを確認したいかどうか、あなたのためとして使用するかを決めることができますに応じて、元の保証はありませんし、ため、後でそれがあります。

詳細については、AndroidServicesをご覧ください。


2
これは、サービスを直接開始することと、アラームを使用してサービスを開始することの「違いは何ですか」というOPの質問に実際には答えません。また、記事のコードはOPが投稿したものとほとんど同じであるため、OPはおそらくあなたがリンクしている記事を見たことがあるでしょう。
Squonk 2014年

AlarmManagerからサービスを開始するほうが安全で、アクティビティから開始するよりも殺される可能性が低いということですか?間違っていると思います。説明していただけますか?@VedPrakash。さらに、サービスを開始する意図を作成するときに渡すコンテキストのほうが重要だと思います。activity(this)のコンテキストではなく、application(getApplicationContext())のコンテキストを使用する方が安全です。
パースカプール2014

@ Eu.Dr。X ...タスクを実行するたびにトリガーされるアラームマネージャーを使用することをお勧めします。なぜですか?サービスを使用すると、ある時点でサービスが閉じられ、特定の時間に更新がスキップされる可能性があるためです(不明)。コンテキストの疑いがある場合は、絶対に使用しないでgetApplicationContext()ください。厳密に必要な場合は使用しないでください。読むときは、call-activity-context-or-application-context(stackoverflow.com/questions/7298731/…)を呼び出してください。
私の神

1

機能的には違いはありません。

PendingIntentの意味は、後で他のアプリケーションが自分自身であるかのようにそれを使用できる他のアプリケーションにそれを処理できることです。ドキュメントからの関連する説明は次のとおりです。

PendingIntentを別のアプリケーションに与えることにより、他のアプリケーションが自分自身であるかのように(同じ権限とIDで)、指定した操作を実行する権利をそのアプリケーションに付与します。そのため、PendingIntentの作成方法には注意が必要です。たとえば、提供する基本インテントでは、コンポーネント名を独自のコンポーネントの1つに明示的に設定して、最終的に他のどこにも送信されないようにする必要があります。

PendingIntent自体は、システムが保持するトークンへの参照であり、トークンの取得に使用された元のデータを記述しています。

したがって、PendingIntentは、元のIntent(PendingIntentの作成に使用された)を表すデータへの参照にすぎません。


4
機能的に違いはないと言うのは間違っています。両方の機能が同じである場合、なぜ最初に2つあるのですか?PendingIntentは、それを渡すコンポーネント(通知を作成するコンポーネント)と同じ権限を持つリモートコンポーネント(NotificationManagerのような)によって実行されるという最も重要な違いです。
Aniket Thakur 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.