为了账号安全,请及时绑定邮箱和手机立即绑定

Android -- onAttachedToWindow()

标签:
Android

onAttachedToWindow在Activity生命周期中的位置

放大招:

5be82a68000155ec07001192.jpg

onAttachedToWindow不能在onCreate中哟~

View view = getWindow().getDecorView();  
WindowManager.LayoutParams lp = (WindowManager.LayoutParams)view.getLayoutParams();  
lp.gravity = Gravity.CENTER;  
lp.width = (dm.widthPixels * 4) / 5;  
lp.height = (dm.widthPixels * 4) / 5;  
getWindowManager().updateViewLayout(view,lp);

放到onCreate中进行测试,结果在lp.gravity = Gravity.CENTER;这行报了空指针异常,所以view.getLayoutParams()获取的LayoutParams是空。

public final class ActivityThread {	  ......	
  final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward) {	
    ......	
    ActivityClientRecord r = performResumeActivity(token, clearHide);	
    if (r != null) {	
      final Activity a = r.activity;	
      ......	
      // If the window hasn't yet been added to the window manager,	      // and this guy didn't finish itself or start another activity,	      // then go ahead and add the window.	      boolean willBeVisible = !a.mStartedActivity;	
      if (!willBeVisible) {	
        try {	
          willBeVisible = ActivityManagerNative.getDefault().willActivityBeVisible(	
              a.getActivityToken());	
        } catch (RemoteException e) {	
        }	
      }	
      if (r.window == null && !a.mFinished && willBeVisible) {	
        r.window = r.activity.getWindow();	
        View decor = r.window.getDecorView();	
        decor.setVisibility(View.INVISIBLE);	
        ViewManager wm = a.getWindowManager();	
        WindowManager.LayoutParams l = r.window.getAttributes();	
        a.mDecor = decor;	
        l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;	
        ......	
        if (a.mVisibleFromClient) {	
          a.mWindowAdded = true;	
          wm.addView(decor, l);	
        }	
      }	 
      ......	
    }	
    ......	
  }	
  ......	
}

原来在ActivityThread 执行handleResumeActivity时就会为PhoneWindow(r.activity.getWindow)中的DecorView设置LayoutParam ,并且通过源码发现 handleResumeActivity函数首先会执行performResumeActivity,此时会调用Activity的onResume()生命周期函数 ,这时问题就比较清晰了,看来只要在Activity的onResume生命周期后就能获取DecorView的LayoutParam,进而可以设置高度和宽度了。根据上面贴出的生命周期图,onResume()后面是onAttachedToWindow(),并且onAttachedToWindow只会调用一次,不会受用户操作行为影响。所以在onAttachedToWindow中进行窗口尺寸的修改再合适不过了。

干货

  • onAttachedToWindow运行在onResume之后;

  • DecorView的LayoutParams是在ActivityThread的handleResumeActivity中设置的,并且该函数会调用Activity的onResume生命周期,所以在onResume之后可以设置窗体尺寸;

原文链接:http://www.apkbus.com/blog-625968-58774.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消