Android同一Activity配置两个图片分享intent-filter仅第一个生效如何处理
完全可以不拆分多个Activity实现需求,使用Android原生的activity-alias(Activity别名)组件即可,既不需要创建额外的Activity实体类,也不会产生冗余代码。
步骤1:修改AndroidManifest.xml配置
完全删掉之前的DecodeActivity配置,替换为activity-alias配置,示例如下:
<activity android:name="MainActivity" android:label="@string/ENCODE" android:exported="true"> <!-- 原有启动页intent-filter保留,如果有的话 --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <!-- 编码功能的分享intent-filter --> <intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> </activity> <!-- 解码功能的Activity别名,不需要对应实体类 --> <activity-alias android:name="com.company.myapp.DecodeEntry" android:targetActivity="MainActivity" android:label="@string/DECODE" android:exported="true"> <!-- 解码功能的分享intent-filter --> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> </intent-filter> </activity-alias>
这里activity-alias的targetActivity属性指向你的主Activity,系统会识别这是两个独立的分享入口,分别显示对应的label,启动时都会打开MainActivity。
步骤2:区分用户选择的功能
当用户点击不同的分享入口启动MainActivity时,Intent中携带的组件名会对应你点击的入口配置:点击编码入口时组件名是MainActivity的类名,点击解码入口时组件名是activity-alias配置的DecodeEntry名称,你可以通过这个属性判断用户选择的功能,修改你的Intent处理代码如下:
if (Intent.ActionSend.Equals(Intent.Action) && Intent.Type != null && Intent.Type.StartsWith("image/")) { string functionType = "Encode"; // 判断启动入口是否为解码别名 if (Intent.Component?.ClassName == "com.company.myapp.DecodeEntry") { functionType = "Decode"; } await ImageDispatcher.HandleSendImage(ContentResolver, Intent, functionType); }
额外注意事项
- Android 12及以上版本要求所有对外暴露的组件(包括activity-alias)必须显式声明
android:exported属性,否则安装会报错 - 如果你需要两个分享入口显示不同的图标,可以给
activity-alias单独配置android:icon属性
内容的提问来源于stack exchange,提问作者mshwf
相关产品推荐
相关产品推荐

