层级冲突处理

定义了Android层级的冲突策略,通过Intent.ACTION_CLOSE_SYSTEM_DIALOGS 广播来解决系统层面的浮层隐藏和显示。

private static final String KEY_REASON = "reason";
 
public static void broadcastCloseSystemDialog(Context context, String reason) {
    try {
        Intent intent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
        if (!TextUtils.isEmpty(reason)) {
            intent.putExtra(KEY_REASON, reason);
        }
        context.sendBroadcastAsUser(intent, UserHandle.CURRENT);
    } catch (Exception e) {
        Log.e(TAG, "broadcastCloseSystemDialog", e);
    }
}

需要发广播的场景

📊 内嵌表格:需要发广播的场景明细(sheetId=uET5KA)

SystemUI

有弹窗报警出来disableVoice, 报警结束enableVoice @蔡智明

并且发生ACTION_CLOSE_SYSTEM_DIALOGS, reason 为”warning”

有通知出来发送下面ACTION_CLOSE_SYSTEM_DIALOGS广播 heads_up_notification @Jimmy Sun 孙强

监听ACTION_CLOSE_SYSTEM_DIALOGS广播

隐藏快控 @Yue5 Liu 刘越

background_start_app、avm、mirror 隐藏appdrawer @Yue5 Liu 刘越

语音

@伍仪华

监听广播ACTION_CLOSE_SYSTEM_DIALOGS

隐藏大卡片,防止遮挡

监听ACTION_OTA_STATUS_CHANGE

开始OTA 自己禁用OTA , 结束后启用语音

快控场景

快空未出现,下拉时,需要能让快控出来,并且语音弹窗消失

后台启动应用

发送广播

broadcastCloseSystemDialog(Context context, "background_start_app");

禁用语音

语音通过SettingProvider , 语音监听该值,自己禁用

 
public static String DISABLE_VOICE_ASSISTANT = "mi_disable_voice_assistant"
 
public static void disableVoice() {
    Settings.Global.putInt(null, DISABLE_VOICE_ASSISTANT, 1);
}
 
public static void enableVoice() {
    Settings.Global.putInt(null, DISABLE_VOICE_ASSISTANT, 0);
}

AVM

@王岩

broadcastCloseSystemDialog(Context context, "avm");

AVM影像浮层

@王岩@刘云松

broadcastCloseSystemDialog(Context context, "avm_window");

镜像投屏/副屏投屏

@Pan7 Wang 王攀

// 镜像
broadcastCloseSystemDialog(Context context, "mirror");
// 后台副屏投屏
broadcastCloseSystemDialog(Context context, "background_start_app");

OTA

@罗喻

发出广播,开始升级、结束升级

粘性广播,一个Action

public static final String ACTION_OTA_STATUS_CHANGE = "com.mi.car.action.OTA_STATUS_CHANGE";
 
//参数 boolean true ota 中,false 其他
public static final String EXTRA_UPGRADING = "com.mi.car.intent.extra.UPGRADING";
 

产品文档:

中控屏系统层级仲裁策略