【Android】判断前台窗口的方法

在进行framework开发的时候经常需要监听前台窗口,根据窗口的不同做不同的业务逻辑。

常用的方法有两种:
一. 获取栈顶activity
二. 获取窗口Params

方法一: 获取栈顶activity

通过读取任务栈,获取topActivity。
优点:可以获取当前topActivity的包名类型和其他信息。
缺点:如果是非Activity窗口(如Dialog),则获取不到。

//获取当前Top activity
private void getTopComponentInfo()
{
    ActivityManager manager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningTaskInfo> runningTaskInfos = manager.getRunningTasks(1);
    if (null != runningTaskInfos)
    {
        ComponentName topcmpName = runningTaskInfos.get(0).topActivity;
        if (null != topcmpName) {
            Log.d(TAG, "topActivity pkg : " + topcmpName.getPackageName() + ", class : " + topcmpName.getClassName());
        }
    }
}

方法二: 获取窗口Params

通过设置窗口window属性,来判断当前窗口类别:
优点:不限于Activity,可以判断view dialog等
缺点:需要对应窗口添加flag

private static final int PRIVATE_FLAG_INTERCEPT_POWER_KEY = 0x20000000;

public Dialog(Context context, int themeResId) {
    super(context, themeResId);
    getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
    
    //设置私有flag,用于判断窗口,比如当前flag=PRIVATE_FLAG_INTERCEPT_POWER_KEY
    //eg:如果此窗口在前台,业务逻辑中就要拦截power键
    getWindow().addPrivateFlags(PRIVATE_FLAG_INTERCEPT_POWER_KEY);
    
    getWindow().setLayout(ViewGroup.LayoutParams.WRAP_CONTENT , ViewGroup.LayoutParams.WRAP_CONTENT);
    initDtv();
}

对应PhoneWindowManager.java中读取windowstate,判断是否拦截:

 private boolean shouldPassSpecialKeyToUser(WindowState win, int keyCode) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_POWER:
                return handleSpecialKey(win, PRIVATE_FLAG_INTERCEPT_POWER_KEY);
                ...
                ...
                ...
        }
        return false;
    }

private boolean handleSpecialKey(WindowState win, int mask) {
    if (win != null) {
        WindowManager.LayoutParams lp = win.getAttrs();
        if (lp != null) {
            //位与运算,判断当前window flag是否是FLAG_INTERCEPT_POWER_KEY
            if ((lp.privateFlags & mask) != 0) {
                return true;
            }
        }
    }
    return false;
}

如果有其他方法,还请留言交流,感谢。~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值