[sg] Android 6.0 添加对Home键的拦截

先说结论:所有修改只适用定制系统有系统源码的场景,否则上层App只能监听到HOME按键的广播(而且由于Home键的特殊性,完全可靠的监听同样需要在framework层修改源码),无办法拦截,下面的方法亲自验证过,参考https://blog.csdn.net/u013286571/article/details/50012901了,修改了其中顺序有误的地方

1. 源码修改 com.android.server.wm.WindowManagerService
            if (attrs != null) {
                //add by sg , 注释掉对参数类型的判断
/*                if (win.mAttrs.type != attrs.type) {
                    throw new IllegalArgumentException(
                            "Window type can not be changed after the window is added.");
                }*/
                flagChanges = win.mAttrs.flags ^= attrs.flags;
                attrChanges = win.mAttrs.copyFrom(attrs);
                if ((attrChanges & (WindowManager.LayoutParams.LAYOUT_CHANGED
                        | WindowManager.LayoutParams.SYSTEM_UI_VISIBILITY_CHANGED)) != 0) {
                    win.mLayoutNeeded = true;
                }
            }
2. 源码修改 com.android.server.policy.PhoneWindowManager

public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags)方法
方法内部添加一个局部变量标志位isGohome,默认为true

   final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
   final boolean canceled = event.isCanceled();
+ boolean isGohome = true;

找到Home键事件,增加从WindowManager获取参数,这个参数我们会在activity的onAttach方法进行设置,当接受到该参数时,则将标志位isGohome设为false

        if (keyCode == KeyEvent.KEYCODE_HOME) {
+            WindowManager.LayoutParams attrs1 = win != null ? win.getAttrs() : null;
+           if (attrs1 != null) {
+                int type1 = attrs1.type;
+               if (type1 == WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG) {
+                    isGohome = false;
+                }
+            }

调用返回桌面方法前根据标志位进行判断,默认没有设置参数的activity就直接返回桌面,配置了WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG的activity就不响应

                if(isGohome == true){
                    handleShortPressOnHome();
                }
3. 在app需要拦截的activity

@Override
public void onAttachedToWindow() {
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
super.onAttachedToWindow();
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: MATLAB对时间序列做SG(Savitzky-Golay)滤波的方法如下: SG滤波是一种平滑信号的方法,其本质是使用多项式拟合数据来估计其局部取值。MATLAB中的sgolay函数可以用来进行SG滤波。 首先,需要导入时间序列的数据,通常是一个包含一组连续观测值的向量。 接下来,根据数据的特点,我们选择合适的SG滤波参数,包括滤波窗口的长度和多项式的次数。窗口长度决定了滤波器的局部取值范围,多项式次数决定了拟合的程度。 然后,通过调用sgolay函数,传入拟合的参数,进行滤波处理。sgolay函数会返回一个滤波后的时间序列。 最后,可以使用plot函数将原始数据和滤波后的数据进行可视化比较,以便分析滤波效果。 需要注意的是,SG滤波对信号有一定的时延,因此在回答一些要求较高时域精确度的问题时,需要考虑滤波引入的时延对分析结果的影响。 总结起来,MATLAB中的sgolay函数提供了一种方便的方式来对时间序列进行SG滤波。通过选择合适的参数,可以平滑信号并去除噪音,从而更好地分析数据趋势和特征。 ### 回答2: Matlab对时间序列进行SG滤波是通过使用sgolay函数来实现的。SG滤波是一种平滑和去除噪声的方法,它使用了Savitzky-Golay(SG)算法。 SG算法是一种基于多项式拟合的滤波方法。它通过拟合一系列局部数据点,并利用多项式来估计每个数据点的值。这个多项式是通过最小二乘法进行拟合的,从而找到一个平滑的曲线。 在Matlab中,使用sgolay函数可以指定滤波器的阶数和窗口长度。阶数用于指定多项式的次数,窗口长度用于指定局部数据点的数量。通过调整这两个参数,可以控制滤波的平滑程度和去噪效果。 使用sgolay函数进行SG滤波的示例代码如下: ```matlab % 假设有一个时间序列数据存储在向量x中 % 设定SG滤波器的阶数和窗口长度 order = 3; % 多项式次数 windowSize = 11; % 窗口长度 % 使用sgolay函数进行滤波 filteredSignal = sgolayfilt(x, order, windowSize); % 绘制原始数据和滤波结果的对比图 plot(x, 'b'); % 原始数据 hold on; plot(filteredSignal, 'r'); % 滤波结果 legend('原始数据', '滤波结果'); ``` 在这个示例中,我们假设时间序列数据存储在向量x中。然后我们通过调用sgolayfilt函数来对x进行SG滤波,并将滤波结果存储在filteredSignal中。最后,我们使用plot函数将原始数据和滤波结果绘制在同一张图上,以便比较它们。 这就是Matlab对时间序列进行SG滤波的简要介绍。通过调整滤波器的阶数和窗口长度,我们可以自己控制滤波的效果,以满足不同的需求。 ### 回答3: MATLAB对时间序列进行Savitzky-Golay(SG)滤波主要使用sgolayfilt函数。SG滤波是一种常用的平滑滤波方法,通过拟合一个局部多项式来估计数据点。下面是对该函数的使用方法。 1. 打开MATLAB软件,并将时间序列数据导入到工作空间中。 2. 使用sgolayfilt函数对时间序列进行滤波。该函数的语法如下: Y = sgolayfilt(X, N, F) 其中,X是输入的时间序列数据,N是多项式的阶数,F是滤波窗口的长度。 例如,如果要对一个100个数据点的时间序列进行3次多项式拟合,窗口长度为15,代码如下: Y = sgolayfilt(X, 3, 15) 函数将返回滤波后的时间序列Y。 3. 可以根据需要调整多项式的阶数和滤波窗口的长度。一般来说,通过增加多项式阶数可以更好地拟合数据,但也会引入更多的噪声。而增加滤波窗口的长度可以降低噪声,但可能会损失一部分细节信息。需要根据具体的数据和需要进行调整。 4. 使用滤波后的结果进行进一步的分析或绘图。 总之,MATLAB通过调用sgolayfilt函数对时间序列进行SG滤波,可以对数据进行平滑处理,从而减少噪声并突出数据的趋势。这种滤波方法在信号处理和数据分析中广泛应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值