onAttachedToWindow () 和 onDetachedFromWindow ()
来源:互联网 发布:狮虎兽可以繁殖吗 知乎 编辑:程序博客网 时间:2024/04/30 09:44
http://blog.sina.com.cn/s/blog_5fc9337301019erl.html
protected void onAttachedToWindow()
onDraw(android.graphics.Canvas)
, however it may be called any time before the first onMeasure(int, int)
.从开发文档中我们可以看出,onAttachedToWindow是在第一次onDraw前调用的。也就是我们写的View在没有绘制出来时调用的,但只会调用一次。
比如,我们写状态栏中的时钟的View,在onAttachedToWindow这方法中做初始化工作,比如注册一些广播等等……
与onAttachedToWindow
protected void onDetachedFromWindow()
This is called when the view is detached from a window. At this point it no longer has a surface for drawing.
开发文档就简单的两句。也就是我们销毁View的时候。我们写的这个View不再显示。
这时我们就在这个方法做一些收尾工作,如:取消广播注册等等。
究竟是如何的调用顺序,我在播放界面的Activity中重写了这2个方法,并在其中打印Log,下面我们来看一下运行效果。
A:表示刚进入视频播放页面时执行的一系列。
B:表示点击back键退出视频播放页面时执行的一些列操作
上面一个椭圆部分,表示播放视频的初始化操作。
下面一个椭圆部分,表示播放视频的销毁操作,比如释放资源。
由此可见,onAttachedToWindow在初始化视频播放(既创建view)之前调用,
onDetachedFromWindow在退出视频播放,销毁资源(既销毁view)之后调用。
在 Adroid2.1 和 Adroid2.2 设备上,如果 Activity 中使用到 ViewFlipper 控件,进行横竖屏切换操作时会发生如下错误信息:
1 Program crashes, giving this crash log: 2 3 java.lang.IllegalArgumentException: Receiver not registered: android.widget.ViewFlipper$1@44b6ab90 4 at android.app.ActivityThread$PackageInfo.forgetReceiverDispatcher(ActivityThread.java:667) 5 at android.app.ApplicationContext.unregisterReceiver(ApplicationContext.java:747) 6 at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:321) 7 at android.widget.ViewFlipper.onDetachedFromWindow(ViewFlipper.java:104) 8 at android.view.View.dispatchDetachedFromWindow(View.java:5835) 9 at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1076) 10 at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074) 11 at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074) 12 at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074) 13 at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1074) 14 at android.view.ViewRoot.dispatchDetachedFromWindow(ViewRoot.java:1570) 15 at android.view.ViewRoot.doDie(ViewRoot.java:2556) 16 at android.view.ViewRoot.die(ViewRoot.java:2526) 17 at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:218) 18 at android.view.Window$LocalWindowManager.removeViewImmediate(Window.java:436) 19 at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3498) 20 at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3599) 21 at android.app.ActivityThread.access$2300(ActivityThread.java:119) 22 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1867) 23 at android.os.Handler.dispatchMessage(Handler.java:99) 24 at android.os.Looper.loop(Looper.java:123) 25 at android.app.ActivityThread.main(ActivityThread.java:4363) 26 at java.lang.reflect.Method.invokeNative(Native Method) 27 at java.lang.reflect.Method.invoke(Method.java:521) 28 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 29 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 30 at dalvik.system.NativeStart.main(Native Method)
这是由于 onDetachedFromWindow() 莫名其妙地在 onAttachedToWindow() 之前被调用了。
先提供解决方案如下:
1.重载ViewFlipper的onDetachedFromWindow()方法,注意修改访问修饰符为public。
public
if (Build.VERSION.SDK_INT == 7) {
try {
super.onDetachedFromWindow();
} catch (IllegalArgumentException
e) { Log.w(TAG, "Android project
issue 6191 workaround."); e.printStackTrace();
} finally {
super.stopFlipping();
}
} else {
super.onDetachedFromWindow();
}
}
若第一步不起作用,则在第一步的基础上,紧接着进行第二步:
2. 重载Activity的onDetachedFromWindow()在其中加入
@Override
public void onDetachedFromWindow() {
if (myFlipper != null) {
myFlipper.onDetachedFromWindow();// 第一步中修饰符修改为了public,这里才能访问到。
}
}
当然进行第二步的前提是,你已经重载了ViewFlipper的onDetachdFromWindow()方法,既第一步。
以上博文摘自:
http://blog.csdn.net/liyulei316686082/article/details/7312649
http://www.cnblogs.com/Fingertips/archive/2012/04/26/2471218.html
http://www.eoeandroid.com/thread-159069-1-1.html
- onAttachedToWindow () 和 onDetachedFromWindow ()
- onAttachedToWindow () 和 onDetachedFromWindow ()
- onAttachedToWindow () 和 onDetachedFromWindow ()
- onAttachedToWindow () 和 onDetachedFromWindow ()
- onAttachedToWindow () 和 onDetachedFromWindow ()
- onAttachedToWindow () 和 onDetachedFromWindow ()
- onAttachedToWindow () 和 onDetachedFromWindow ()
- onAttachedToWindow () 和 onDetachedFromWindow ()
- onAttachedToWindow () 和 onDetachedFromWindow ()
- onAttachedToWindow和onDetachedFromWindow
- onAttachedToWindow和onDetachedFromWindow?
- Android重写view时onAttachedToWindow () 和 onDetachedFromWindow ()
- Android重写view时onAttachedToWindow () 和 onDetachedFromWindow ()
- Android重写view时onAttachedToWindow () 和 onDetachedFromWindow ()
- Android重写view时onAttachedToWindow () 和 onDetachedFromWindow ()
- Android重写view时onAttachedToWindow () 和 onDetachedFromWindow ()
- Android重写view时onAttachedToWindow () 和 onDetachedFromWindow ()
- Android重写view时onAttachedToWindow () 和 onDetachedFromWindow () .
- 图解数据结构(1)——大圈表示法、动态数组和单向链表
- C#创建COM供PB调用
- lua开发工具的使用和环境的配置
- Several ports (8005, 8080, 8009) required by Tomcat Server at localhost are already in use
- redis2.6高可用方案【2】
- onAttachedToWindow () 和 onDetachedFromWindow ()
- tomcat部署java项目之后,war可以删除吗?
- DLL快速入门
- asp.net学习笔记1-2013-10-17-9:58
- CentOS6下调试时出现glibc问题
- 寻找数组中最小的k个数 "最小堆方法"
- Linux USB驱动工作流程
- (自备)HttpWebRequest
- re