意图与待定意图的区别

我读了一些文章。所有的服务看起来都是一样的,我想知道开始这项服务和以下的服务有什么不同:

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,那么这两个参数会做同样的事情;

62056 次浏览

Starting services regularly via AlarmManager

As with activities the Android system may terminate the process of a service at any time to save resources. For this reason you cannot simply use a TimerTask in the service to ensure that it is executed on a regular basis.

So, for correct scheduling of the Service use the AlarmManager class.

UPDATE:

所以这两者之间没有实际的区别。 但是,取决于您是否希望确保服务的执行,您可以决定使用什么,因为对于 前任没有保证,而对于 回见则是这样。

More info at 安卓服务.

在功能上,没有区别。

PendingInent 的含义是,您可以将其处理到其他应用程序,这些应用程序以后可以将其当作您自己的应用程序来使用。以下是 文件的相关解释:

通过向另一个应用程序提供 PendingInant,就等于授予了它 执行您指定的操作的权利,如同另一个 应用程序是您自己(具有相同的权限和身份) 因此,您应该小心构建 PendingInant 的方式: 几乎总是,例如,您提供的基本意图应该具有 组件名显式设置为您自己的组件之一,以确保 它最终被送到那里,而不是别的地方。

所维护的令牌的引用 描述用于检索原始数据的系统。

因此,PendingInent 只是对表示原始意图(用于创建 PendingInent)的数据的引用。

意图

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

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

例如: 假设您有一个需要启动电子邮件客户端并发送电子邮件的活动。要做到这一点,您的活动将发送一个意图与操作 ACTION_SEND,连同适当的选择器,到 Android 意图解析器:

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:")); // only email apps should handle this

The specified chooser gives the proper interface for the user to pick how to send your email data.

明显的意图

// 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);

未决意图

PendingInent 是你给 外国人应用程序(例如 NotificationManager、 AlarmManager、 Home Screen AppWidgetManager 或其他第三方应用程序)的一个令牌,它允许外部应用程序使用你的应用程序的权限来执行一段预定义的代码。

通过向另一个应用程序提供 PendingInant,就等于授予了它 执行您指定的操作的权利,如同另一个 应用程序是您自己(具有相同的权限和身份) 因此,您应该小心构建 PendingInant 的方式: 几乎总是,例如,您提供的基本意图应该具有 组件名显式设置为您自己的组件之一,以确保 it is ultimately sent there and nowhere else.

挂起意图示例: http://android-pending-intent.blogspot.in/

资料来源: Android 意图Android 未决意图

希望这个能帮上忙。

PendingIntentIntent的包装。接收 PendingIntent的外国应用程序不知道 Intent的内容,而 Intent是由 PendingIntent包装的。外国应用程序的任务是将意图发送回所有者时,一些条件得到满足(例如: 报警与时间表,或通知与点击...)。条件由所有者提供,但由外部应用程序处理(例如: 警报、通知)。

如果外国应用程序向你的应用程序发送意图,意味着外国应用程序知道意图的内容。外国应用程序决定发送意图,那么你的应用程序必须处理意图以满足一些条件 = > 你的应用程序获得系统的性能资源。

Another simple difference:

  • 一旦程序被关闭,正常意图就会消失。

  • 未决的意图永远不会消失。只要报警服务、定位服务或其他服务需要,它们就会存活。

There's another major difference between Intent and PendingIntent which is better to be aware of, otherwise your app's design might become 脆弱. The problem is well described in Android 嵌套意图 article.

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

让我们设想一个第三方服务,它执行一些工作,然后启动应用程序指定的活动作为一个意图。如果 复试活动是作为基本的 Intent提供的,那么服务只能使用它自己的上下文来启动它,这种设计有两个缺点:

  • It forces the 复试 activity to be defined as exported so it can be started using a third party context. As a result the activity can be started not only by the service it was intended for, but by any other app installed on the device.
  • 由第三方服务应用程序定义的任何活动都可以用作 复试活动,即使是非导出的活动,因为它是使用第三方上下文开始的。

Both problems can be easily solved by specifying the callback activity as PendingIntent instead.