要实现跨应用启动Activity,需要用到隐式Intent
比如要在应用A的MainActivity中启动应用B的BeStartActivity,代码如下:
1.更改被启动Activity的配置
打开被启动的应用B的配置文件AndroidManifest.xml,更改BeStartActivity的配置,在<activity>标签下添加<intent-filter>标签,并在<intent-filter>标签内添加两个属性:<categroy>和<action>
- categroy表示当前动作执行的模式,默认为DEFAULT,这里就用默认模式
- action表示该Activity被启动时的要调用名字,可以为任意值,但最好为"项目包名.intent.action.Activity类名",这里我改为 “com.zs.appb.intent.action.BeStartActivity”
具体代码如下:
<activity android:name=".BeStartActivity">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="com.zs.appb.intent.action.BeStartActivity" />
</intent-filter>
</activity>
2.在应用A中用Intent启动B应用的BeStartActivity
在实例化intent时传入要启动的Activity的action属性的值,即之前设置的"com.zs.appb.intent.action.BeStartActivity"
代码如下:
Intent intent = new Intent();
intent=new Intent("com.zs.appb.intent.action.BeStartActivity");
try {
startActivity(intent);
}catch (Exception e) {
Toast.makeText(this, "应用不存在,请下载后再试", Toast.LENGTH_SHORT).show();
}
注意:
- 若不想Activity被其他应用启动,只需要在AndroidManifest.xml文件中设置android:exported=“false”
具体代码如下:
<activity android:name=".BeStartActivity" android:exported="false">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="com.zs.appb.intent.action.BeStartActivity" />
</intent-filter>
</activity>
- 如果有两个action属性值相同的Activity,那么在启动时手机系统会让你选择启动哪一个Activity
要解决这个问题,需要给被启动的Activity再加上一个属性<data>,
具体代码:
<activity android:name=".BeStartActivity" android:label="被启动的Activity1">
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<action android:name="com.zs.appb.intent.action.BeStartActivity" />
<data android:scheme="app" />
</intent-filter>
然后再启动该Activity的Intent中加上一个URI,其中“app”必须与data属性的scheme的值一样,
"hello"可更改为任意字符串
intent=new Intent("com.zs.appb.intent.action.BeStartActivity", Uri.parse("app://hello"));