Intent和PendingIntent之间的差异

时间:2014-06-17 06:42:43

标签: android android-service

我阅读了一些文章,似乎都做了同样的事情,我想知道启动服务之间的区别是什么:

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;

6 个答案:

答案 0 :(得分:133)

<强>意图

Android Intent是一个携带意图的对象,即从应用程序内部或外部的一个组件到另一个组件的消息。 Intent可以在应用程序的三个核心组件之间传递消息 - 活动,服务和BroadcastReceivers。

意图本身是一个Intent对象,是一种被动数据结构。它包含要执行的操作的抽象描述。

例如:假设您有一个需要启动电子邮件客户端并发送电子邮件的活动。为此,您的Activity会将动作ACTION_SEND的Intent以及相应的选择器发送到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 INTENTS

// 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,主屏幕AppWidgetManager或其他第三方应用程序)提供的令牌,它允许外部应用程序使用您的应用程序的权限执行一段预定义的代码。

  

通过向另一个应用程序提供PendingIntent,您将授予它   有权执行您指定的操作,就像对方一样   应用程序是你自己(具有相同的权限和身份)。如   这样,你应该注意如何构建PendingIntent:   几乎总是,例如,你提供的基础Intent应该有   组件名称显式设置为您自己的组件之一,以确保   它最终被送到那里而不是其他地方。

待处理意图的示例:http://android-pending-intent.blogspot.in/

来源:Android IntentsAndroid Pending Intents

希望这有帮助。

答案 1 :(得分:21)

PendingIntentIntent的包装。收到PendingIntent的外国应用程序,不知道Intent包含的PendingIntent的内容。外国应用程序的任务是在满足某些条件时将意图发送给所有者(例如:带有计划的警报或带有点击的通知......)。条件由所有者提供,但由外国应用程序处理(例如:警报,通知)。

如果外国应用向您的应用发送意图,则表示外国应用知道该意图的内容。和外国应用程序决定发送意图然后您的应用程序必须处理意图以满足某些条件=&gt;您的应用获得系统的性能资源。

答案 2 :(得分:3)

另一个简单的区别:

  • 正常意图会在应用程序被杀后立即死亡。

  • 待定意图永远不会消亡。只要警报服务,定位服务或任何其他服务需要它们,它们就会活着。

答案 3 :(得分:1)

通过AlarmManager定期启动服务

与活动一样,Android系统可以随时终止服务流程以节省资源。因此,您不能简单地在服务中使用TimerTask来确保它定期执行。

因此,为了正确安排服务,请使用AlarmManager类。

<强>更新

所以两者之间没有实际的区别。 但是,根据您是否要确保服务的执行,您可以决定使用的内容无法保证,对于以后它是

AndroidServices的更多信息。

答案 4 :(得分:1)

在功能上,没有区别。

PendingIntent的含义是,您可以将其处理到以后可以使用它的其他应用程序,就像其他应用程序本身一样。以下是documentation

的相关说明
  

通过向另一个应用程序提供PendingIntent,您将授予它   有权执行您指定的操作,就像对方一样   应用程序是你自己(具有相同的权限和身份)。如   这样,你应该注意如何构建PendingIntent:   几乎总是,例如,你提供的基础Intent应该有   组件名称显式设置为您自己的组件之一,以确保   它最终被送到那里而不是其他地方。

     

PendingIntent本身只是对由其维护的令牌的引用   系统描述用于检索它的原始数据。

所以PendingIntent只是对代表原始Intent(用于创建PendingIntent)的数据的引用。

答案 5 :(得分:1)

IntentPendingIntent 之间还有另一个主要区别,最好注意,否则您的应用设计可能会脆弱Android Nesting Intents 文章中详细描述了该问题。

请注意,PendingIntent.send() 方法不接受 Context 实例,而是使用在意图创建期间提供的上下文。它允许第三方组件在意图创建者的上下文中执行与未决意图相关联的操作。

让我们想象一个第三方服务,它执行一些工作,然后启动由您的应用指定为意图的活动。如果 回调 Activity 作为基本 Intent 提供,则服务只能使用自己的上下文来启动它,这样的设计有两个缺点:

  • 它强制将 callback 活动定义为 exported,以便它可以使用第三方上下文启动。因此,该 Activity 不仅可以由其预期服务启动,还可以由设备上安装的任何其他应用启动。
  • 第三方服务应用定义的任何活动都可以用作回调活动,即使是未导出的活动,因为它开始使用第三方上下文。

通过将 callback 活动指定为 PendingIntent 可以轻松解决这两个问题。