我阅读了Android文档,但我仍然需要更多的说明。PendingIntent到底是什么?


当前回答

待定意图是指将在未来某个时间点启动的意图。正常的意图在传递给startActivity(intent)或StartService(intent)时立即启动。

其他回答

一个PendingIntent用一个令牌包装了一般的Intent,你给外部应用程序执行你的许可。 如:

你的音乐应用程序的通知不能播放/暂停音乐如果你 没有给PendingIntent发送广播,因为你的音乐应用 哪个通知应用程序具有READ_EXTERNAL_STORAGE权限 不喜欢。通知是一个系统服务(所以它是一个外部应用程序)。

我在通知中遇到了PendingIntents。这里有一个简单的解释:

我们想要提供一个Intent到Notification,在这种情况下,我们想要打开一个执行相机捕捉功能的Activity。这里,如果我们简单地传递Intent, NotificationManager没有这个权限,尽管我的应用程序在Manifest中声明了这个权限;因此,该动作不会工作,因为NotificationManager没有这样做的权限。

但是,如果你使用PendingIntent,这里的权限,我的应用程序将被使用而不是NotificationManager。因此,即使NotificationManager没有相机权限,而我的应用程序有,它仍然会打开活动并执行应用程序。

注意:Pending intent需要常规intent先被设置。

在我的例子中,上述答案和谷歌的官方文档都没有帮助我抓住PendingIntent类的概念。

然后我发现了这个视频,谷歌I/O 2013, Beyond Blue Dot会议。在这个视频中,前谷歌员工Jaikumar Ganesh解释了PendingIntent是什么,这让我对它有了一个大的了解。

以下是上述视频的转录(从15:24)。

待定意图是什么? 它是你的应用进程会给定位进程的一个令牌,定位进程会在感兴趣的事件发生时用它来唤醒你的应用。这基本上意味着你的应用在后台不需要一直在运行。当有趣的事情发生时,我们会叫醒你。这样可以节省很多电池。

通过下面的代码片段(包含在会话的幻灯片中),这种解释变得更加清晰。

PendingIntent mIntent = PendingIntent.getService(...);

mLocationClient.requestLocationUpdates(locationRequest, mIntent);

public void onHandleIntent(Intent intent) {   
    String action = intent.getAction();   
    if (ACTION_LOCATION.equals(action)) {       
        Location location = intent.getParcelableExtra(...)   
    }
}

为什么需要PendingIntent ?我在想

为什么接收应用程序本身不能创建Intent或 为什么我们不能使用一个简单的意图达到同样的目的。

例如:Intent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

如果我将bluetoothIntent发送到另一个没有android。permission权限的应用程序。接收应用程序不能通过startActivity(bluetoothIntent)启用蓝牙。

使用PendingIntent可以克服这个限制。对于PendingIntent,接收应用程序不需要android.permission。BLUETOOTH_ADMIN用于开启蓝牙。源。

未决意图是一个令牌,你给一些应用程序执行你的应用程序的代表,不管你的应用程序进程是否活跃。

我认为文件是足够详细的: 未决的意图文档。

只要想想Pending Intents的用例(broadcast Intents, scheduling alarms),文档就会变得更加清晰和有意义。