我已经阅读了Android文档,但我仍需要更多的解释。那么,PendingIntent
到底是什么?
PendingIntent
是一个令牌,您可以将其提供给其他应用程序(例如NotificationManager
、AlarmManager
、主屏幕 AppWidgetManager
或其他第三方应用程序),它允许其他应用程序使用您的应用程序权限来执行预定义的代码。
如果您向其他应用程序提供了一个意图(Intent),它将使用自己的权限执行您的Intent
。但是,如果您向其他应用程序提供了一个PendingIntent
,该应用程序将使用您的应用程序权限执行您的Intent
。
例如:Intent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
如果我将bluetoothIntent
发送到另一个没有权限android.permission.BLUETOOTH_ADMIN
的应用程序,则该接收应用程序无法使用startActivity(bluetoothIntent)
启用蓝牙。
使用PendingIntent
克服了这个限制。通过PendingIntent
,接收应用程序不需要具有android.permission.BLUETOOTH_ADMIN
即可启用蓝牙。来源。
一个Pending Intent是您提供给某个应用程序的令牌,以代表您的应用执行某个操作,无论您的应用进程是否存活。
我认为文档已经足够详细:Pending Intent文档。
只需考虑Pending Intent的用例,例如广播意图和定时闹钟,文档就会变得更清晰和有意义。
在我的情况下,以上答案和谷歌官方文档都没有帮助我理解PendingIntent
类的概念。
然后我发现了这个视频:Google I/O 2013, Beyond the Blue Dot session。在这个视频中,前谷歌工程师Jaikumar Ganesh讲解了PendingIntent
是什么,这让我对它有了一个整体的认识。
以下是上述视频的文字记录(从15:24开始)。
那么何为pending intent?
它是你的应用进程会给位置进程的一个标记,位置进程会使用它来唤醒你的应用程序,当感兴趣的事件发生时。 这基本上意味着你的后台应用程序不必一直运行。 当发生感兴趣的事情时,我们会唤醒您。 这可以节省很多电量。
这段代码片段(包含在演示幻灯片中)使得这个解释更加清晰。
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(...)
}
}
挂起意图是一种稍后启动的意图。当传递给 startActivity(Intent)
或 StartService(Intent)
时,普通意图会立即启动。
什么是Intent?
Intent 是在Android中的一个特定命令,允许您向Android操作系统发送指令以执行特定操作。可以将其视为需要执行的操作。可以执行许多操作,例如:发送电子邮件,或将照片附加到电子邮件中,甚至是启动应用程序。创建 Intent 的逻辑工作流程通常如下所示: a. 创建 Intent b. 添加 Intent 选项 -> 比如我们要向操作系统发送什么类型的 Intent 或者与该 Intent 关联的任何属性,例如文本字符串或任何带有 Intent 的内容。 c. 运行 Intent
现实生活的例子:假设我早上起床想去洗手间。我首先要想到去洗手间,但这并不能直接让我到达洗手间。然后我会告诉我的大脑先下床,然后走到洗手间,然后解决问题,然后去洗手,最后去擦手。一旦我知道我要去哪里,我就发送开始的命令,我的身体开始行动。
什么是Pending Intents?
继续以上现实生活的例子,假设我想洗澡,但我想在刷牙和吃早饭后再洗澡。因此,我知道我至少需要等待30-40分钟才会洗澡。我仍然记得需要准备好我的衣服,然后走回浴室,然后脱衣服再洗澡。但是,在30-40分钟之前不会发生这种情况。现在我有了一个“待处理的意图”来洗澡。它会持续30-40分钟。
这基本上是待处理的意图和常规的意图之间的区别。可以创建常规意图而无需待处理的意图,但是要创建待处理的意图,必须先设置常规意图。
出租车类比
意图
意图通常用于启动服务。例如:
Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
startService(intent);
这就像你叫出租车一样:
Myself = CurrentClass
Taxi Driver = ServiceClass
待定意图
您将需要使用类似于以下代码:
Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
PendingIntent pi = PendingIntent.getService(parameter, parameter, intent, parameter);
getDataFromThirdParty(parameter, parameter, pi, parameter);
现在,这个第三方将会代表你启动服务。一个实际的生活类比是Uber或Lyft,它们都是出租车公司。
当你向Uber/Lyft发送乘车请求时,他们将代表您呼叫其中一名司机。
因此:
Uber/Lyft ------ ThirdParty which receives PendingIntent
Myself --------- Class calling PendingIntent
Taxi Driver ---- ServiceClass
new Intent(CurrentClass.this)
。其他人只是放了一个 context
,但您提供了实际的上下文,告诉我们在这里提供什么。 - LinusGeffarth一个可以被其他应用程序使用的未来意图。
以下是创建未来意图的示例:
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);
一个PendingIntent是一个令牌,您可以将其提供给另一个应用程序(例如通知管理器、闹钟管理器或其他第三方应用程序),从而允许此其他应用程序使用您的应用程序权限来执行预定义的代码块。 要通过pending intent执行广播,请通过PendingIntent.getBroadcast()获取PendingIntent。要通过pending intent执行活动,您可以通过PendingIntent.getActivity()接收该活动。
PendingIntent
基本上是一个包装另一个Intent
对象的对象。然后,它可以传递给外部应用程序,您授予该应用程序执行操作的权利,即像从您自己的应用程序进程执行意图一样执行该意图(具有相同的权限和身份)。出于安全原因,您应始终将显式意图传递给PendingIntent
而不是隐式意图。
PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
PendingIntent.FLAG_CANCEL_CURRENT);