重写view的onAttachedToWindow () 和 onDetachedFromWindow ()与Home键屏蔽,捕获,修改

 在重写View的时候,会遇到这两个方法

protected void onAttachedToWindow()

Description copied from class: View

This is called when the view is attached to a window. At this point it has a Surface and will start drawing. Note that this function is guaranteed to be called before View.onDraw(android.graphics.Canvas), however it may be called any time before the first onDraw -- including before or after View.onMeasure(int, int).
Overrides: 
onAttachedToWindow in class View

当此view附加到窗体上时调用该方法。在这时,view有了一个用于显示的Surface,将开始绘制。注意,此方法要保证在调用onDraw(Canvas) 之前调用,但可能在调用 onDraw(Canvas) 之前的任何时刻,包括调用 onMeasure(int, int) 之前或之后。

看得出次方法在onDraw方法之前调用,也就是view还没有画出来的时候,可以在此方法中去执行一些初始化的操作,google的AlarmClock动态时钟View就是在这个方法中进行广播的注册,代码如下:

[java]  view plain copy
  1. @Override  
  2.     protected void onAttachedToWindow() {  
  3.         super.onAttachedToWindow();  
  4.   
  5.         if (Log.LOGV) Log.v("onAttachedToWindow " + this);  
  6.   
  7.         if (mAttached) return;  
  8.         mAttached = true;  
  9.   
  10.         if (mAnimate) {  
  11.             setBackgroundResource(R.drawable.animate_circle);  
  12.             /* Start the animation (looped playback by default). */  
  13.             ((AnimationDrawable) getBackground()).start();  
  14.         }  
  15.   
  16.         if (mLive) {  
  17.             /* monitor time ticks, time changed, timezone */  
  18.             IntentFilter filter = new IntentFilter();  
  19.             filter.addAction(Intent.ACTION_TIME_TICK);  
  20.             filter.addAction(Intent.ACTION_TIME_CHANGED);  
  21.             filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);  
  22.             mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);  
  23.         }  
  24.   
  25.         /* monitor 12/24-hour display preference */  
  26.         mFormatChangeObserver = new FormatChangeObserver();  
  27.         mContext.getContentResolver().registerContentObserver(  
  28.                 Settings.System.CONTENT_URI, true, mFormatChangeObserver);  
  29.   
  30.         updateTime();  
  31.     }  

另外在屏蔽Home键的时候也会用到

[java]  view plain copy
  1. public void onAttachedToWindow() {  
  2. this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);  
  3. super.onAttachedToWindow();  
  4. }  

在Level5以上(包含)中,Activity类中有如下方法: public void onAttachedToWindow () Since: API Level 5 Called when the main wi ...
开发过程中相信大家都有碰到因为不能捕获Home键而烦恼,现在终于有办法了,在Level5以上(包含)中,Activity类中有如下方法:
public void onAttachedToWindow ()
Since: API Level 5
Called when the main window associated with the activity has been attached to the window manager. See View.onAttachedToWindow() for more information.
See Also
    * onAttachedToWindow()
private boolean catchHomeKey = false;
    @Override
        public void onAttachedToWindow() {
                // TODO Auto-generated method stub
            if(catchHomeKey) {
                    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
            }
          super.onAttachedToWindow();
        }
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
                // TODO Auto-generated method stub
                if(keyCode == KeyEvent.KEYCODE_HOME) {
                        Log.e(TAG, "Home key down");
                }
                return super.onKeyDown(keyCode, event);
        }
重写Activity中的onAttachedToWindow方法,设置Type,就能捕获到Home键。
当不需要捕获时,删除setType这一行就OK。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

protected void onDetachedFromWindow()

Description copied from class: View
This is called when the view is detached from a window. At this point it no longer has a surface for drawing.
Overrides: 
onDetachedFromWindow in class AdapterView<ListAdapter>

将视图从窗体上分离的时候调用该方法。这时视图已经不具有可绘制部分。

 

onDetachedFromWindow()正好与onAttachedToWindow()的用法相对应,在destroy view的时候调用,所以可以加入取消广播注册等的操作,还是google的闹钟代码:

[java]  view plain copy
  1. @Override  
  2.     protected void onDetachedFromWindow() {  
  3.         super.onDetachedFromWindow();  
  4.   
  5.         if (!mAttached) return;  
  6.         mAttached = false;  
  7.   
  8.         Drawable background = getBackground();  
  9.         if (background instanceof AnimationDrawable) {  
  10.             ((AnimationDrawable) background).stop();  
  11.         }  
  12.   
  13.         if (mLive) {  
  14.             mContext.unregisterReceiver(mIntentReceiver);  
  15.         }  
  16.         mContext.getContentResolver().unregisterContentObserver(  
  17.                 mFormatChangeObserver);  
  18.     }  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Android中,我们可以通过重写Activity的onBackPressed()方法屏蔽返回的功能,代码如下: ``` @Override public void onBackPressed() { // 屏蔽返回 // super.onBackPressed(); // 如果需要默认的返回功能,需要注释掉这行代码 } ``` 对于HOME屏蔽,由于Android系统限制,我们无法屏蔽HOME的功能。但是我们可以监听HOME的按下事件,并在按下事件发生时做一些特定的操作,例如弹出对话框或者跳转到其他页面。代码如下: ``` private static final String SYSTEM_DIALOG_REASON_KEY = "reason"; private static final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; @Override public void onAttachedToWindow() { super.onAttachedToWindow(); // 监听HOME getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_HOME) { // HOME按下事件 return true; } return super.onKeyDown(keyCode, event); } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (!hasFocus) { // 如果Activity失去了焦点,则判断是否是HOME按下事件 Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); sendBroadcast(closeDialog); } } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); // 判断是否是HOME按下事件 String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); if (SYSTEM_DIALOG_REASON_HOME_KEY.equals(reason)) { // HOME按下事件 } } ``` 需要注意的是,由于Android系统限制,无法屏蔽HOME的功能,因此以上代码只能监听HOME的按下事件,并在按下事件发生时做一些特定的操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值