Android使用scheme方式唤醒处于后台时的App场景

场景:甲App唤醒处于后台时的乙App的目标界面Activity,且乙App的目标界面Activity处于最上层,即已经打开状态,要求甲App使用scheme唤醒乙App时,达到跟从桌面icon拉起App效果一致,不能出现只拉起了乙App的目标界面Activity在甲App中,并且拉起后,乙App目标界面Activity的状态,跟处于后台时的一致,不能重新走onCreate,而是只走onReStart、onStart、onResume生命周期。

一、方式一

1、甲App跳转intent配置如下:

java 复制代码
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("schemeurltest://hostdemo"));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
startActivity(intent);

其中schemeurltest://hostdemo为乙App的目标界面scheme地址;

注意:intent必须添加:intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED),否则只会在甲App中拉起乙App的目标界面Activity,而不是唤醒整个乙App。

2、乙App的目标界面Activity清单文件设置如下:

html 复制代码
<activity android:name="com.xxx.yyy.TestActivity"
    android:exported="true"
    android:theme="@style/TransparentDialog"
    android:screenOrientation="behind">
    <intent-filter>
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="schemeurltest"
            android:host="hosttest"/>
    </intent-filter>
</activity>

注意这里不用配置启动模式 android:launchMode=""

二、方式二

1、甲App跳转intent配置如下:

java 复制代码
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("schemeurltest://hostdemo"));
startActivity(intent);

其中 schemeurltest://hostdemo 为乙App的目标界面scheme地址;

注意这里不用设置intent的Flags

2、乙App的目标界面Activity清单文件设置如下:

html 复制代码
<activity android:name="com.xxx.yyy.TestActivity"
    android:exported="true"
    android:theme="@style/TransparentDialog"
    android:launchMode="singleTask"
    android:screenOrientation="behind">
    <intent-filter>
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <action android:name="android.intent.action.VIEW" />
        <data android:scheme="schemeurltest"
            android:host="hosttest"/>
    </intent-filter>
</activity>

注意这里启动模式必须配置为:android:launchMode="singleTask"

三、两种方式的区别

方式一,当启动intent设置为:intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED),可以不用设置启动App目标界面Activity的启动模式。

方式二,当启动intent不设置Flags时,则需要设置启动App目标界面Activity的启动模式为:android:launchMode="singleTask"。

四、不配置会怎样

如果不配置以上两种方式,那么在甲App里唤醒起来的乙App的目标界面Activity会是下面这样:

相关推荐
Summer-Bright10 分钟前
消费者 AI 变现竞争:从“一家独大“到“iOS vs Android“,谁在为 AI 买单?
android·人工智能·ios·ai·自然语言处理·agi
Xzaveir42 分钟前
企业号码资产平台:逐号状态、事件日志与批次聚合
android·人工智能
恋猫de小郭2 小时前
Flutter 3D 渲染的全新选择和应用场景
android·前端·flutter
—Miss. Z—2 小时前
计算机二级MySQL——简单应用题(事件&视图)
android·mysql·adb
邪修king3 小时前
C++ 进阶终章:异常机制与智能指针全解 —— 从错误处理到 RAII 资源管理,打通现代 C++ 的核心命脉
android·数据结构·c++
三少爷的鞋3 小时前
LiveData 的缺陷:为什么我现在越来越少使用 LiveData?
android
雨白14 小时前
NDK 初探:基于 C++ 实现参数哈希与签名校验
android
程序员正茂15 小时前
Android studio中初步使用OpenCV库
android·opencv
紫_龙16 小时前
window 维护多版本Android studio
android·ide·android studio
杉氧17 小时前
KMP 自动化之路 (4):iOS 自动化构建与签名 —— 攻克最硬的骨头
android·架构·android jetpack