如何跨App启动Activity

1
2
graph LR
AppA的ActivityA -- 启动 --> AppB的ActivityB
  • 共享uid的App

在AndroidManifest中:manifest标签中添加android:sharedUserId="xxxx"

启动时:startActivity(new Intent().setComponent(new ComponentName("com.example.zhu","com.example.zhu.XxxActivity")));

  • 使用exported

在Manifest中添加exported属性<activity android:name=".BActivity" android:exported="true"/>

启动时:startActivity(new Intent().setComponent(new ComponentName("com.example.zhu","com.example.zhu.XxxActivity")));

  • 使用intentFilter(隐式跳转)

在Manifest的Activity标签中添加:

1
2
3
4
<intent-filter>
<action android:name="android.intent.action.TEST" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>

启动时:startActivity(new Intent("android.intent.action.TEST"))


Activity加权限

  1. 给AppA的manifest中添加权限:

    <uses-permission android:name="com.example.zhu"/>

  2. gei AppB中需要启动的Activity添加permission属性:

    android:permission="com.example.zhu"

  3. 启动时:使用隐式跳转

这种添加权限的方法必须要AppB先安装,否则AppA无法获取权限

拒绝服务漏洞

在被启动的Activity中,getIntent().getExtras()获取的bundle对象中如果有的序列化数据,无法被反序列化成对象,程序就会崩溃(报找不到反序列化对象的exception),此时需要对bundle的操作加try-catch。