让别的应用打开你的Activity怎么玩

本文介绍如何通过在Android应用清单文件中配置Intent过滤器及处理Intent数据,使应用能够响应并处理外部请求打开图片的动作。

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

承接上一篇应用内打开其他应用的正确姿势,我们已经能在我们的应用内打开指定功能的应用的Activity,这次我们就让别的应用打开我们的应用玩玩。

分析:

在我们的应用内打开其他的应用是隐式的Intent意图来实现,那我们如果想让别人打开我们的应用应该怎么做呢?

其实我们要做的也很简单,就是告诉系统我们能处理这个隐式的意图就可以了。

话不多说,开始撸代码:

就以打开图片为例吧,我们在文件管理应用中打开图片的时候,系统往往会弹出很多的应用让我们选择,如系统图片查看、各类美图软件、QQ、微信等等,如下图所示。


我们的目标就是在这个列表中把我们的应用也显示出来,点进去之后能显示点击的图片。

一、在清单文件中注册Intent过滤器如下:

       <activity android:name=".ui.MainActivity">

            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>

            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:mimeType="image/*"/>
            </intent-filter>

        </activity>
第一个intent-filter是系统默认的主启动Activity的过滤器。

第二个intent-filter才是我们设置的过滤器。
1、 <action> 代表要进行的操作,发送信息ACTION_SEND或ACTION_SENDTO,再次我们需要查看图片,所以action为VIEW。

2、 <category>提供另外一种表征处理 Intent 的 Activity 的方法,通常与用户手势或 Activity 启动的位置有关。 系统支持多种不同的类别,但大多数都很少使用。 但是,所有隐含 Intent 默认使用 CATEGORY_DEFAULT 进行定义。

3、 <data> 与 Intent 关联的数据描述。使用此元素中的一个或多个属性,您可以只指定 MIME 类型、URI 前缀、URI 架构或这些的组合以及其他指示所接受数据类型的项。

注:如果您无需声明关于数据的具体信息 Uri(比如,您的 Activity 处理其他类型的“额外”数据而不是 URI 时),您应只指定 android:mimeType您应只指定 android:mimeType 属性声明您的 Activity 处理的数据类型,比如 text/plain 或 image/jpeg。
您只应指定android:mimeType属性声明您的 Activity 处理的数据类型,比如 text/plain 或 image/jpeg。

完成了第一步之后我们就能在点击文件管理的图片的时候看到我们的应用图标也在列表内部了,如下:



到此处虽然我们的应用已经出现在了这个列表中,但是你点进去我们的应用进去发现什么都没有,那是因为我们的应用还没有对接收到的Intent进行相应的操作处理。

接下来就是处理请求也就是我们的下一步。

二、在Activity中进行Intent数据请求的处理,代码如下:

在onCreate方法中进行如下处理,ImageView为布局文件中用来展示图片的View:

  Intent intent = getIntent();
        if (intent == null){
            return;
        }
        String action = intent.getAction();
        if (Intent.ACTION_VIEW.equals(action)) {//查看图片
            Uri uri = intent.getData();
            if (null != uri) {
                Log.d(TAG, "图片地址Path:" + uri.getPath());
                mImgView.setImageURI(uri);
            }
        }
这样之后我们就不能看到展示图片效果了,如下:

当然测试的时候程序崩溃了,原因是图片在外部存储上,这里只需要再声明读取外部存储的权限就可以正常显示了。

好了,今天就到这里。

<think>我们正在处理一个关于Android开发中使用Intent打开第三方应用Activity的问题。根据用户提供的引用内容,我们可以总结出两种主要方法:方法一:使用setClassName,直接指定包名和类名(全路径)。方法二:通过隐式Intent,在目标ActivityAndroidManifest.xml中配置<intent-filter>,然后使用指定的action和category启动。我们将按照用户的要求,提供示例代码,并解释两种方法。同时,我们将生成相关问题。注意:用户提供的引用[1]和[2]分别对应了这两种方法。引用[3]是关于内容URI的转换,与当前问题关系不大,可以忽略。下面开始组织回答:</think>在 Android 中通过 Intent 打开第三方应用Activity 主要有两种方式,下面提供示例代码和说明: ### ✅ 1. 显式调用(已知目标 Activity 完整类名) 当明确知道目标应用的包名和 Activity 全类名时: ```java Intent intent = new Intent(); // 参数说明:目标应用包名, 目标Activity完整类名 intent.setClassName("com.example.targetapp", "com.example.targetapp.TargetActivity"); startActivity(intent); ``` > **适用场景**:已知目标应用的具体组件信息时推荐使用[^1] ### ✅ 2. 隐式调用(通过 Action 和 Category) 当目标应用在 `AndroidManifest.xml` 声明了 Intent Filter 时: ```xml <!-- 目标应用AndroidManifest 声明示例 --> <activity android:name=".TargetActivity" android:exported="true"> <intent-filter> <action android:name="com.yourdomain.ACTION_OPEN_TARGET"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity> ``` 调用方代码: ```java Intent intent = new Intent(); intent.setAction("com.yourdomain.ACTION_OPEN_TARGET"); intent.addCategory(Intent.CATEGORY_DEFAULT); // 可选:添加附加数据 intent.putExtra("key", "value"); startActivity(intent); ``` > **注意**:目标 Activity 必须设置 `android:exported="true"` 才能被外部应用调用[^2] ### ⚠️ 重要安全事项 1. **权限检查**(API 30+ 强制要求): ```java if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } else { // 处理目标应用未安装的情况 } ``` 2. **异常处理**: ```java try { startActivity(intent); } catch (ActivityNotFoundException e) { Toast.makeText(this, "未找到目标应用", Toast.LENGTH_SHORT).show(); } ``` ### 两种方式对比 | **方式** | **优点** | **缺点** | |----------------|-----------------------------|-----------------------------| | 显式调用 | 精确指定目标,启动速度快 | 强依赖包名和类名,易失效 | | 隐式调用 | 解耦合,支持多应用响应 | 需协调 action 命名规范 | 实际开发中推荐优先使用隐式调用,特别是需要跨应用协作的场景[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值