鸿蒙app跳转Android应用的某个Activity、跳转华为应用市场 精华

小小诚哈哈哈
发布于 2021-7-15 17:33
浏览
7收藏

@toc

跳转Android某个Activity

为什么写这个帖子?

请注意,本文主要讲述的是跨应用跳转。因为项目中,涉及到应用更新,而目前打包生成的.hap包,无法直接安装,故想到可能鸿蒙应用的升级需要到应用商城去更新,而鸿蒙app如何跳转到Android的应用目前没有什么文档可以参考,所以研究了一下鸿蒙的Intent。

跨应用跳转的方式

在Android中,跨应用跳转采用的是隐式跳转,也就是通过intent-filter来筛选Activity,所以我猜测鸿蒙系统应该也是如此。

Android中的隐式跳转

1、先创建一个待跳转的测试工程,记为应用A,什么都不改,然后运行在手机上,其中MainActivity在manifest中的配置如下

 <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

2、再创建一个新的工程,记为应用B,用来跳转到应用A,然后我们编写跳转的代码,如下

Intent intent = new Intent();
intent.setClassName("com.example.test", "com.example.test.MainActivity");
intent.setAction("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
startActivity(intent);

3、运行应用B,然后跳转成功。到这里我们需要说明一下intent设置的几个参数。首先是比较核心的Action与Category参数,它与之对应的则是应用A中MainActivity配置中intent-filter里面的配置的参数;最后则是ClassName参数,我们通过intent-filter可能拿到是多个Activity,如果你的intent-filter写得够唯一,整个系统只有这一个,那自然好说,不用设置ClassName,可如果不能保证唯一性,那如何确定我们需要的是哪一个呢?就需要设置应用的包名与Activity的全路径了,一个是应用的包名,一个是Activity所在的文件路径,所以跳转能够成功。当然,Android自然是没有问题,那么在鸿蒙应用中呢?
4、创建一个鸿蒙项目,创建鸿蒙应用的步骤这里不多说,官网都有详细的文档。创建好了之后,我们记为应用C,通过Android中,我们知道,要找到Android中的Activity,不仅需要与Activity的配置文件中intent-filter配置的参数对得上,再得加上Activity的所在的应用包名与全路径。所以在鸿蒙中,有着类似的写法,代码如下

Intent intent = new Intent();
Set<String> entities = new HashSet<>();
entities.add("android.intent.category.LAUNCHER");
Operation operation = new Intent.OperationBuilder()
          .withBundleName("com.example.test")
          .withAbilityName("com.example.test.MainActivity")
          .withAction("android.intent.action.MAIN")
          .withFlags(Intent.FLAG_NOT_OHOS_COMPONENT)
          .withEntities(entities)
          .build();
intent.setOperation(operation);
startAbility(intent);

5、可以看到代码中,bundleName对应的则是应用A的包名;AbilityName则是Activity的全路径;需要注意的点就是category放到了Entities里面;特别重要的点则是Intent.FLAG_NOT_OHOS_COMPONENT这个参数,这个参数是必须的,它标明了,查找的范围,不是鸿蒙的应用;如此鸿蒙应用便能够跳转到Android应用了。
6、现在能够跳转了,那么如何传参呢?在Android中,传参有两种,一种是通过intent直接putExtra;一种则是通过Uri的方式传参;鸿蒙中一种则是setParam的方式,跟Android类似,所以这里就不再叙述,主要说一下Uri的方式。
7、首先这里需要说明一下,Uri传参的方式是需要通过在intent-filter中配置data参数,所以使用Uri传参的话,data也是筛选条件的一个,所以在编写代码的时候,Intent必须设置data中配置的协议的Uri,否则的话,是找不到这个Activity的。还是先看一下代码吧,给应用A的MainActivity配置data,代码如下。

<activity
            android:name=".MainActivity">           
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <data
                    android:host="com.example.test"
                    android:scheme="test" />
                <category android:name="android.intent.category.DEFAULT" />
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>
        </activity>

8、可以看到我们给应用A的MainActivity又添加了一个筛选条件,通过第二个intent-filter也能够筛选到这个Activity,所以我们在应用B中添加代码,如下。

Intent intent = new Intent();
intent.setPackage("com.example.test");
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("test://com.example.test"));
startActivity(intent);

9、在鸿蒙中如何筛选呢?写法也跟Android的类似,代码如下。

Intent intent = new Intent();
Set<String> entities = new HashSet<>();
entities.add("android.intent.category.DEFAULT");
Operation operation = new Intent.OperationBuilder()
                .withUri(Uri.parse("test://com.example.test"))
                .withEntities(entities)
                .withAction("android.intent.action.VIEW")
                .withBundleName("com.example.test")
                .withFlags(Intent.FLAG_NOT_OHOS_COMPONENT)
                .build();
intent.setOperation(operation);
startAbility(intent);

总结

鸿蒙调用Android应用,写法跟Android其实大差不多,唯一需要注意的就是Category与Intent.FLAG_NOT_OHOS_COMPONENT这两个点。最后附上跳转华为应用市场某个app的详情页的代码与一些常用的系统app的代码。

跳转华为市场爱奇艺app的详情页

Intent intent = new Intent();
Operation operation = new Intent.OperationBuilder()
                .withUri(Uri.parse("market://details?id=" + "com.qiyi.video"))
                .withAction("android.intent.action.VIEW")
                .withBundleName("com.huawei.appmarket")
                .withFlags(Intent.FLAG_NOT_OHOS_COMPONENT)
                .build();
intent.setOperation(operation);
startAbility(intent);

跳转至拨打电话页

Intent intent = new Intent();
Operation operation = new Intent.OperationBuilder()
                .withUri(Uri.parse("tel://135xxxxxxxx"))
                .withAction("android.intent.action.DIAL")
                .withFlags(Intent.FLAG_NOT_OHOS_COMPONENT)
                .build();
intent.setOperation(operation);
startAbility(intent);

跳转系统相册

Intent intent = new Intent();
Operation operation = new Intent.OperationBuilder()
                .withAction("android.intent.action.PICK")
                .withFlags(Intent.FLAG_NOT_OHOS_COMPONENT)
                .build();
intent.setUriAndType(null, "image/*");
intent.setOperation(operation);
startAbility(intent);

已于2021-7-15 17:36:30修改
7
收藏 7
回复
举报
2条回复
按时间正序
/
按时间倒序
Whyalone
Whyalone

强贴!

回复
2021-7-16 23:47:52
Haoc_小源同学
Haoc_小源同学

学习了

回复
2022-9-13 09:57:10
回复
    相关推荐