web-dev-qa-db-ja.com

IntentとPendingIntentの違い

私はいくつかの記事を読みましたが、両方とも同じことをしているようで、そのようなサービスを開始することの違いは何ですか?

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つは同じことを行います。

89
user3629316

意図

Androidインテントは、インテントを運ぶオブジェクトです。つまり、あるコンポーネントから別のコンポーネントへのアプリケーションの内部または外部のメッセージです。インテントは、アプリケーションの3つのコアコンポーネント(アクティビティ、サービス、およびBroadcastReceivers)のいずれかの間でメッセージを通信できます。

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

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

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は、foreignアプリケーション(NotificationManager、AlarmManager、Home Screen AppWidgetManager、またはその他のサードパーティアプリケーション)に与えるトークンであり、外部アプリケーションがアプリケーションの定義済みのコードを実行する権限。

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

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

ソース: Android Intents および Android Pending Intents

お役に立てれば。

138
Siddharth_Vyas

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

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

22
HungNM2

別の簡単な違い:

  • 通常の意図は、アプリが終了するとすぐに消滅します。

  • 保留中の意図は決して死にません。アラームサービス、位置情報サービス、またはその他のサービスで必要とされる限り、それらは生き続けます。

3
Zumry Mohamed

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

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

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

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

したがって、PendingIntentは、元のIntent(PendingIntentの作成に使用された)を表すデータへの単なる参照です。

1
kupsef

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

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

そのため、サービスを正しくスケジュールするには、AlarmManagerクラスを使用します。

UPDATE:

したがって、2つの間に実際の違いはありません。ただし、サービスの実行を保証するかどうかに応じて、formerについて何を使用するかを決定できますが、後でです。

詳細は AndroidServices で。

1
My God