13

Context.startServiceアンドロイド:PendingIntent.getService対Context.startServiceでサービス開始

Intent intent = new Intent(context, MyService.class); 
context.startService(intent); 

PendingIntent.getService

Intent intent = new Intent(context, MyService.class); 
PendingIntent pi = PendingIntent.getService(context, 0, intent, 0); 
pi.send(); 


質問

  1. Context.startServiceとPendingIntentを使ってサービスをいつ開始しますか?
  2. なぜあなたは他のものを使用しますか?

答えて

18

実際に違いはありません。

具体的にはContextメソッドを使用して直接開始します.PendingIntentは通常、タップされたときにこのインテントを発生させる通知とともに使用され、ユーザがタップするまで(通常は)遅延します。しかしながら;通常はPendingIntentを直接送信することはありません。なぜなら、それはそれが目的ではないからです。

A PendingIntentは、そのが今起こることになっていないことを意味し、保留、保留されているテントですが、近い将来インチインテントでは、それはすぐに送信されます。

PendingIntentが使用中に保留されていない場合、PendingIntentはもはやPendingIntentではなく、実際にはIntentである。 目的を完全に破る

+0

「PendingIntent」でサービスを開始したいときがありますか? –

+2

近いうちにサービスを開始したい場合は、これが理想的なケースです。ユーザーのアカウントで利用可能な新しいアップデートを表示する通知があるとします。理想的には、サーバーへの接続を確立し、この情報をダウンロードする予定の保留中の意図があります。ユーザーが通知をすぐにタップしたとき、つまりユーザーの便宜を待っているときや、ユーザーが気にしない場合は通知をキャンセルして次の新しい更新が同じ方法で反応するようにしたいときに、この処理を実行します。 – JoxTraex

+0

すばらしい説明、ありがとう! – damluar

1

PendinIntentsはウィジェットに非常によく使用されます。実行中のウィジェットのレイアウトはコードに属していませんが、代わりにシステムの制御下にあるため、インターフェースエレメントに直接クリックリスナーを割り当てることはできません。代わりにあなたは、ユーザーがそれらに触れたときに、PendingIntentが「実行」される(ボタンなど)、それらの要素に何かPendingIntentを割り当てます。この場合、

// get the widget layout 
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.id.widget_layout); 

// prepare to listen the clicks on the refresh button 
Intent active = new Intent(context, WidgetCode.UpdateService.class); 
PendingIntent refreshPendingIntent = PendingIntent.getService(context, 0, active, 0); 
remoteViews.setOnClickPendingIntent(R.id.buttonWidgetRefresh, refreshPendingIntent); 

// send the changes to the widget 
AppWidgetManager.getInstance(context).updateAppWidget(appwidgetid, remoteViews); 

をウィジェット内のボタンは、サービスを開始します。通常は、putExtras()を使用してインテントに余分な情報を入れます。そのため、サービスは必要な情報を取得してその仕事を行います。

+0

マニフェスト にサービスを追加し、export = "true"プロパティを追加する必要があることに気付くだけです – Lior

関連する問題