鸿蒙app跳转Android应用的某个Activity、跳转华为应用市场 精华
@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);
强贴!
学习了