Android:使用Context.startService和PendingIntent.getService启动服务

时间:2012-02-05 20:54:17

标签: android android-intent android-context android-pendingintent

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. 启动服务
  3. 你为什么要用另一个呢?

2 个答案:

答案 0 :(得分:19)

确实没有区别。

具体来说,Context方法用于直接启动它,因为PendingIntent通常与一个通知一起使用,以便在点击它时触发此意图,该意图被延迟直到用户点击它(通常)。然而;你通常不会直接发送PendingIntent,因为那不是它的用途。

PendingIntent是一个待处理的待处理意图,意味着它的 NOT 现在应该发生,但在不久的将来。而对于Intent,它会在当时发送。

如果PendingIntent在使用时没有挂起,那么它不再是PendingIntent而且它实际上是一个Intent。 完全击败目的

答案 1 :(得分:1)

PendinIntents非常适用于小部件。由于正在运行的窗口小部件的布局不属于您的代码,而是在系统的控制之下,因此您无法直接将click侦听器分配给接口元素。相反,你为这些元素(如按钮)分配一个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()在intent中添加额外的信息,这样服务就可以获得任何所需的信息来完成它的工作。