关于 Intent.makeRestartActivityTask

本文深入探讨了Android应用中通知点击后如何通过PendingIntent和Intent数组实现不同Activity间的跳转与返回,包括如何配置Activity以适应通知点击后的用户操作流程,以及在不同场景下(如Gmail与日历应用)实现退出应用的不同方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般来讲,点击一个notification后,都会打开一个Activity做为对点击事件的响应,这个Activity是之前在PendingIntent中设置好的。

经常玩Android手机的应该都有印象,在日历应用中,你新建一个提醒,当提醒通知收到后,你点击通知,会进入提醒的内容页面,如果这个时候按back键,会直接退出应用。

但是在Gmail的应用中,如果有一封新邮件到来,那么点击通知后,会进入到邮件的内容页面,等你看完邮件,点击back键,会退到邮件列表页面,再按back键,才会退出应用。

 

我们总结一下两种情况,假设我们的应用有两个Activity(ParentActivity、SubActivity),notification中设置打开的Activity为SubActivity。

那么第一种情况就是:

点击Notification ——>进入SubActivity ——> back键 ——> 退出应用

第二种情况:

点击Notification ——>进入SubActivity ——> back键 ——> 退到ParentActivity ——>back键 ——>退出应用

 

第一种情况比较简单,只需要在PendingIntent中指定Activity,不需要其他设置,Android默认的就这样。

 

Java代码   收藏代码
  1. PendingIntent contentIntent = PendingIntent.getActivity(context, 0,  intent, PendingIntent.FLAG_CANCEL_CURRENT);  

但是在创建PendingIntent的时候需要注意参数PendingIntent.FLAG_CANCEL_CURRENT

这个标志位用来指示:如果当前的Activity和PendingIntent中设置的intent一样,那么久先取消当前的Activity,用PendingIntent中指定的Activity取代之。

另外,需要在Manifest中对指定的Activity设置属性

 

Java代码   收藏代码
  1. <activity android:name=".SubActivityl"  
  2.         android:launchMode="singleTask"  
  3.         android:taskAffinity=""  
  4.         android:excludeFromRecents="true">  
  5. </activity>  
 

 

第二种情况稍微复杂点,因为如果只打开一个SubActivity,程序并没办法知道他的上一级Activity是谁,所以需要在点击Notification时打开一组Activity,但是我们并不需要一个个去调用startActivity方法,PendingIntent提供了个静态方法getActivities,里面可以设置一个Intent数组,用来指定一系列的Activity。

所以我们首先写一个函数创建一个Activity数组:

 

Java代码   收藏代码
  1. Intent[] makeIntentStack(Context context) {  
  2.     Intent[] intents = new Intent[2];  
  3.     intents[0] = Intent.makeRestartActivityTask(new ComponentName(context, com.example.notificationtest.MainActivity.class));  
  4.     intents[1] = new Intent(context,  com.example.notificationtest.SubActivity.class);  
  5.     return intents;  
  6. }  

 

 其中需要注意的是Intent.makeRestartActivityTask方法,这个方法用来创建activity栈的根activity

接下来,创建并显示Notification:

 

Java代码   收藏代码
  1. void showNotification(Intent intent) {  
  2.     Notification notification = new Notification(  
  3.             R.drawable.status_icon,   
  4.             "Hello World ticker text",  
  5.             System.currentTimeMillis());  
  6.   
  7.     PendingIntent contentIntent = PendingIntent.getActivities(  
  8.             this,  
  9.             0,  
  10.             makeIntentStack(this),   
  11.             PendingIntent.FLAG_CANCEL_CURRENT);  
  12.     notification.setLatestEventInfo(  
  13.             this,   
  14.             "Title",  
  15.             "Hey, shall we have a dinner tonight",   
  16.             contentIntent);  
  17.     notification.flags |= Notification.DEFAULT_ALL;  
  18.   
  19.     mNM.notify(1, notification);  
  20. }  
 
<think>我们正在处理关于Android中`android.intent.category.ALTERNATIVE`类别的问题。 根据Android开发文档,`ALTERNATIVE`类别用于指示某个Activity是用户正在查看的数据的替代操作。它通常与`CATEGORY_SELECTED_ALTERNATIVE`一起使用,后者用于指示Activity应该被视为当前选中数据的替代操作。 具体来说: - `android.intent.category.ALTERNATIVE`:用于在数据上定义替代操作。例如,在联系人应用中,对一个联系人可能有多个操作(如打电话、发短信等),这些操作可以作为替代操作列出。 - `android.intent.category.SELECTED_ALTERNATIVE`:类似于`ALTERNATIVE`,但它是针对当前选中的数据(例如,列表视图中选中的一项)。 使用场景: 1. 当你想为某些数据提供额外的操作时,可以在Activity的intent-filter中声明这个类别。例如,一个笔记应用可能允许其他应用为笔记数据提供额外的操作(如分享到特定平台、编辑等)。 2. 当你使用`Intent.createChooser`时,系统会收集所有可以处理该Intent的Activity,其中就包括声明了`ALTERNATIVE`类别的Activity,这样用户就可以选择替代操作。 示例代码: 在AndroidManifest.xml中声明一个Activity,它处理特定类型数据的替代操作。 ```xml <activity android:name=".MyAlternativeActionActivity" android:label="@string/my_alternative_action"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.ALTERNATIVE" /> <data android:mimeType="vnd.android.cursor.item/vnd.example.note" /> </intent-filter> </activity> ``` 然后,在其他应用中,你可以使用`PackageManager.queryIntentActivities`来查找所有为特定数据定义替代操作的Activity,并创建一个菜单或对话框供用户选择。 另外,你还可以通过创建一个Intent并设置`ALTERNATIVE`类别,然后调用`Intent.createChooser`来显示一个选择器,其中包含所有替代操作。 例如: ```java Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(noteUri, "vnd.android.cursor.item/vnd.example.note"); intent.addCategory(Intent.CATEGORY_ALTERNATIVE); startActivity(Intent.createChooser(intent, "Choose an alternative action")); ``` 这样,用户就可以选择你应用中定义的替代操作,或者其他应用为同类型数据定义的替代操作。 注意:在Android早期版本中,这些类别常用于在上下文菜单中提供额外的操作。随着Android的发展,现在可能有更多的方式(如分享操作提供器)来实现类似的功能,但`ALTERNATIVE`类别仍然有效。 引用说明: - 关于`ALTERNATIVE`类别的官方文档描述可以在Android的Intent类文档中找到[^1]。 - 实际应用示例可以参考Android SDK中的NotePad示例应用[^2]。 [^1]: Android Intent类文档:https://developer.android.com/reference/android/content/Intent#CATEGORY_ALTERNATIVE [^2]: NotePad示例:https://android.googlesource.com/platform/development/+/master/samples/NotePad §§相关问题§§ 1. `android.intent.category.ALTERNATIVE`和`android.intent.category.SELECTED_ALTERNATIVE`有什么区别? 2. 如何在Android应用中为自定义数据类型添加替代操作? 3. 如何以编程方式查询支持`ALTERNATIVE`类别的Activity?</think>### Android `android.intent.category.ALTERNATIVE` 用途与使用场景 `android.intent.category.ALTERNATIVE` 是 Android Intent 系统中的特殊类别,主要用于**为特定类型的数据提供替代操作选项**。以下是其核心用途和典型场景: #### 主要用途 1. **扩展数据操作菜单** 允许应用为其他应用中的数据类型(如文本、图片、文件等)注册额外的操作选项。当用户在其他应用中长按数据时,你的应用提供的操作会出现在系统菜单中[^1]。 2. **替代默认操作** 与 `Intent.ACTION_VIEW` 或 `Intent.ACTION_EDIT` 配合使用,提供除默认操作外的替代方案(例如用不同编辑器打开文件)[^3]。 3. **跨应用功能集成** 让第三方应用能无缝集成到系统操作菜单中,增强应用间的互操作性[^2]。 #### 典型使用场景 1. **文件处理扩展** ```xml <!-- 为PDF文件注册"转换为TXT"操作 --> <activity android:name=".PdfConverterActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.ALTERNATIVE" /> <data android:mimeType="application/pdf" /> </intent-filter> </activity> ``` 当用户在其他应用中选择PDF文件时,菜单中会出现"转换为TXT"选项。 2. **联系人自定义操作** ```xml <!-- 为联系人添加"发送优惠券"操作 --> <activity android:name=".SendCouponActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.ALTERNATIVE" /> <data android:mimeType="vnd.android.cursor.item/contact" /> </intent-filter> </activity> ``` 在系统联系人应用中长按联系人时,会出现自定义操作选项。 3. **笔记应用增强** 参考站内示例的扩展: ```xml <!-- 为笔记添加"分享到社交平台"操作 --> <activity android:name=".SocialShareActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.ALTERNATIVE" /> <data android:mimeType="vnd.android.cursor.item/vnd.google.note" /> </intent-filter> </activity> ``` 在笔记应用中长按笔记时,会出现自定义分享选项[^1]。 #### 工作原理 1. 当用户触发数据操作菜单时,系统会扫描所有声明 `ALTERNATIVE` 和匹配数据类型的 Activity。 2. 通过 `PackageManager.queryIntentActivityOptions()` 动态查询可用操作。 3. 结果以菜单形式呈现,优先级由 `intent-filter` 的优先级属性控制。 > **注意**:在 Android 11+ 中,由于包可见性限制,需在 `AndroidManifest.xml` 中添加 `<queries>` 声明才能检测其他应用的 ALTERNATIVE 操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值