1. ホーム
  2. android

[解決済み] IntentとPendingIntentの違いについて

2022-11-13 10:56:08

質問

いくつかの記事を読みました。すべて同じことをするようで、私は以下のようにサービスを開始することの違いは何ですかと疑問に思いました。

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つは同じことをするのですね。

どのように解決するのですか?

意図

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

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

例えば、メールクライアントを起動し、メールを送信する必要があるアクティビティがあるとします。これを行うには、アクティビティは次のようなアクションを持つインテントを送信します。 ACTION_SEND というアクションのIntentを、適切なchooserとともにAndroid Intent Resolverに送ります。

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 をどのように構築するかについて注意する必要があります。 たとえば、提供する基本 Intent には、ほとんど常に コンポーネント名を明示的に自分のコンポーネントに設定し、最終的にそのコンポーネントに送信されるようにします。 最終的にそこに送信され、他のどこにも送信されないようにするためです。

Pending Intent の例: http://android-pending-intent.blogspot.in/

出典: アンドロイド インテント アンドロイドの保留中のインテント

これが役立つといいのですが。