Intent
- Intent分为显式Intent和隐式Intent。
- Intent包含以下几项:组件名称、操作、数据、类别、Extra和标志。
- 在启动服务的时候,为了确保应用的安全性,会使用显式Intent,并且不要为服务声明过滤器。因为在使用隐式Intent启动服务的时候无法确定哪些服务会响应Intent,并且用户无法看到哪些服务已经启动。从Android5.0开始,使用隐式Intent调用bindService(),系统会引发异常。
- 使用隐式Intent的时候需要注意,在调用startActivity()或startActivityForResult()将Intent发送出去的时候,会为Intent添加一项Category为GATEGORY_DEFAULT,所以要在你想要接受该Intent的Activity的过滤器中添加这一类别。
- 当以startActivity()的形式传递一个intent,并且有多个app可以handle时,用户可以在弹出dialog的时候选择默认启动的app(通过勾选dialog下面的选择框,如上图所示)。该功能对于用户有特殊偏好的时候非常有用(例如用户总是喜欢启动某个app来查看网页,总是喜欢启动某个camera来拍照)。
然而,如果用户希望每次都弹出选择界面,而且每次都不确定会选择哪个app启动,例如分享功能,用户选择分享到哪个app都是不确定的,这个时候,需要强制弹出选择的对话框。(这种情况下用户不能选择默认启动的app)。
为了显示chooser, 需要使用createChooser()来创建Intent:
Intent intent = new Intent(Intent.ACTION_SEND);
...
// Always use string resources for UI text. This says something like "Share this photo with"
String title = getResources().getText(R.string.chooser_title);
// Create and start the chooser
Intent chooser = Intent.createChooser(intent, title);
startActivity(chooser);
PendingIntent
PendingIntent 对象是 Intent 对象的包装器。PendingIntent 的主要目的是授权外部应用使用包含的 Intent,就像是它从您应用本身的进程中执行的一样。
使用待定Intent的主要用例:
- 声明用户使用您的通知执行操作时所要执行的Intent(Android系统的NotificationManager执行的Intent)
- 声明用户使用您的应用小组件执行操作的时执行的Intent(主屏幕应用执行Intent)
- 声明未来某一特定时间要执行的Intent(AlarmManager执行Intent)
由于每个 Intent 对象均设计为由特定类型的应用组件(Activity、Service 或 BroadcastReceiver)进行处理,因此还必须基于相同的考虑因素创建 PendingIntent。使用待定 Intent 时,应用不会使用调用(如 startActivity())执行该 Intent。相反,通过调用相应的创建器方法创建 PendingIntent 时,您必须声明所需的组件类型:
- PendingIntent.getActivity(),适用于启动 Activity 的 Intent
- PendingIntent.getService(),适用于启动 Service 的 Intent
- PendingIntent.getBroadcast(),适用于启动 BroadcastReceiver 的 Intent