注:将A作为当前应用,B作为要被唤醒的应用
B应用需要在manifest文件对应Activity添加 android:exported="true"
方式一:getLaunchIntentForPackage唤醒
这种方式会启动要唤醒的app程序,相当于启动了B应用,进入其启动页。
"com.test.wakedemo2"为应用的包名。
//A应用中唤醒部分代码逻辑
Intent intent = getPackageManager().getLaunchIntentForPackage("com.test.wakedemo2");
if (intent != null) {
//inten可用来在两个APP间传递数据
intent.putExtra("type", "110");
//setFlags看自己情况使用,也可以不调用
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
方式二:包名+特定Activity名唤醒
这种方式并不会启动B应用的应用程序,而是还在A应用中打开了B应用中的一个Activity。
//A应用唤醒部分代码逻辑
Intent intent = new Intent(Intent.ACTION_MAIN);
/**知道要跳转应用的包命与目标Activity*/
ComponentName componentName = new ComponentName("com.test.wakedemo2", "com.test.wakedemo2.WakeActivity");
intent.setComponent(componentName);
intent.putExtra("", "");//这里Intent传值
startActivity(intent);
方式三:intent-filter的action,特定Activity名唤醒
这种方式同样不会启动B应用程序,只打开他的Activity
//A应用唤醒部分代码逻辑
Intent intent1 = new Intent("android.intent.action.Wake");
startActivity(intent1);
B应用里需要在Manifest给该Activity配置intent-filter
<activity android:name=".WakeActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.Wake" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
方式四:URI唤醒
//A应用唤醒部分代码逻辑
Intent intent2 = new Intent("android.intent.action.Wake", Uri.parse("wake://com.test.demo.demo/WakeActivity?userId=102"));
startActivity(intent2);
第一个参数是B应用中的action,第二个参数是Uri,需要将B应用中"scheme:// + host + path"拼接,最后想要传递数据的话可以再拼接数据,如上例中的?userId=102,也可以不使用或者使用Intent传递。
B应用需要在Manifest做如下配置
<intent-filter>
<!-- 指定启动协议 -->
<data android:host="com.test.demo.demo"
android:scheme="wake"
android:path="/WakeActivity"/>
<action android:name="android.intent.action.Wake" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>