菜鸟关于android开发中的变量生命周期的疑问

Android 码拜 7年前 (2015-05-10) 738次浏览 0个评论
 

疑问一:android程序运行机制是怎样的?该看那些数来了解?
疑问二:如题:比如我的一个布局文件中有两个button,然后在onCreate中声明了两个引用变量指向这两个button,并注册监听器响应用户动作。我所疑惑的是在方法里定义的变量不是随着方法的结束而销毁的吗?就像以上的两个指向button的变量,那onCreate后变量不存在了还如何来监听用户动作? 还有就是activity在经历了oncreate,onstart,onresume方法后是处于一种什么样的状态?我的猜测是就是处在一种监听用户动作的状态了,但就像上面提到的方法内定义变量的疑惑那样,我认为界面上的组件(如button)不是应该定义为activity的成员变量才能成立才好理解吗?
望赐教!

楼主太纠结了,清空观点再去看Android的Activity生命周期
引用 1 楼  的回复:

楼主太纠结了,清空观点再去看Android的Activity生命周期

兄弟!这不是纠结,这是疑问啊,不明不白地被一些例程牵着鼻子走的感觉不好受!所以凡事都应该探个究竟!你说的activity的生命周期我大概都了解是怎么的来龙去脉,但就是不理解android程序里面的运行机制,如果你知道有介绍这方面的书籍,望推介啊。谢谢!

大牛们求助啊!
activity在经历了oncreate,onstart,onresume方法后是处于一种什么样的状态? 说白了就是 界面和用户可以直接打交到了, 我也为此问题纠结了一段时间,后来写了程序实验了一下,作了个总结,
http://blog.csdn.net/huazai963184709/article/details/7864331   关于Activity 生命周期的,应该是可以看懂了,有举例
引用 5 楼  的回复:

activity在经历了oncreate,onstart,onresume方法后是处于一种什么样的状态? 说白了就是 界面和用户可以直接打交到了, 我也为此问题纠结了一段时间,后来写了程序实验了一下,作了个总结,
http://blog.csdn.net/huazai963184709/article/details/7864331   关于Activity 生命周期的,应该是可以看懂了,有举……

额,你博客上的知识我已经知道了,这里的重点是关于变量的生命周期及android的运行机制啊,兄弟!

了解的朋友回答一下吧,小弟不胜感激!
onCreate()方法,变量?其实你可以联想一下main方法。。。
引用 8 楼  的回复:

onCreate()方法,变量?其实你可以联想一下main方法。。。

main()的话,程序执行完就结束啦,而这里的oncreate方法执行完之后activity还是处于等待中的,性质不一样的吧。

有朋友这样回答我的:

第一个问题,你看activity生命周期就可以了,android的程序反映到用户的眼中就是一个个activity.
第二个问题,activity中的控件变量,比如button什么的,本来就应该作为成员变量定义,然后在oncreate方法中赋值.
这样在所有的回调方法中都能调用.
如果你在onCreate中定义局部变量,并且设置了点击监听,那么onCreate方法结束之后,这个局部变量确实是失效了,换句话说,”引用”已经没有了,但是这并不代表按钮不存在,只是你失去了调用这个按钮的方式而已.
activity在经历了oncreate,onstart,onresume方法后,可以理解为一种与用户交互的状态,

我问的大概就是这个意思,但是:

oncreate方法后button的引用变量失效,那么这时候的button上的监听器不是没用了吗?也就是说界面上在oncreate中声明的引用变量引用的组件无法响应用户的动作?但实际上它还可以响应用户动作的啊,就是这里我想不明白,最近看的android初学者的书里面的UI组件都是在oncreate里定义的引用,纠结。求解释。
    还有第一个疑问我的意思是android从Dalvik开始如何加载类,初始化类等等到实例化类的机制该看那些书?是不是要看《android内核剖析》之类的?

20分
oncreate中有个方法叫setContentView,每一个Activity都会加载一个视图,就是说有一个成员变量View,setContentView(View),就是给这个成员变量赋值,所以说oncreate里面定义的两个button虽说是局部变量,同时也是VIew这个成员变量的属性,Button btn = this.findViewById();这里用this来findView,说明button已经存在于activity中,btn这个局部变量是成员变量View通过Id找出来的,而不是new 出来的。
如果我说的不对,请勿喷,伤不起,也可以一起学习下!
我觉得最好的理解方法就是采用C++的方式来理解:变量,指针,内存,资源。楼主的学习态度很好,我也是这样走过来的

引用 10 楼  的回复:

有朋友这样回答我的:

第一个问题,你看activity生命周期就可以了,android的程序反映到用户的眼中就是一个个activity.
第二个问题,activity中的控件变量,比如button什么的,本来就应该作为成员变量定义,然后在oncreate方法中赋值.
这样在所有的回调方法中都能调用.
如果你在onCreate中定义局部变量,并且设置了点击监听,那么onCreate方法……

引用 10 楼  的回复:

有朋友这样回答我的:

第一个问题,你看activity生命周期就可以了,android的程序反映到用户的眼中就是一个个activity.
第二个问题,activity中的控件变量,比如button什么的,本来就应该作为成员变量定义,然后在oncreate方法中赋值.
这样在所有的回调方法中都能调用.
如果你在onCreate中定义局部变量,并且设置了点击监听,那么onCreate方法……

欣赏楼主的学习态度。 目前我也刚开始学android。
对于这个我的理解是 : 既然是成员变量,不是局部变量,那么他的生命周期应该是伴随着activity的生命周期的。 

在整个生命周期中,Activity一直被系统引用,只要系统没有强制回收处于pause的Activity,那该activity就应该一直处于内存中,所以Button作为activity的成员变量也就一直存在,设置的监听也就一直存在了。
英语好的话,建议你自己到官网上看吧,比那些市场上的书什么的将的好多了,市场的书都在照抄SDK文档。。
用个指针的例子说明 你那个局部变量   当我们释放一个指针的是 是 free(point);point=null;

既然释放了 为什么还要指向null呢, 释放是告诉计算机 刚才在占用的那段内存可以使用了,但是我们可不可以假设在某一段时间内 实际上没有其他值覆盖那段内存,这时候 你没有给point=null;但是敲好调用了point 这时候 计算机 还是会读取point 指向内存的数据

以此 我说明,即使出了oncreate button销毁了 只是告诉虚拟机 那段内存可以回收,至于回不回收,是否立即回收,没办法知道,那是虚拟机的事情。所以这时候访问 依然可以成立,但是不能保证会所有时候都成立。

至于你说停留在哪个状态,楼上说的交互状态是正解。

至于机制,个人理解,就是各种activity之间的转换。

引用 12 楼  的回复:

oncreate中有个方法叫setContentView,每一个Activity都会加载一个视图,就是说有一个成员变量View,setContentView(View),就是给这个成员变量赋值,所以说oncreate里面定义的两个button虽说是局部变量,同时也是VIew这个成员变量的属性,Button btn = this.findViewById();这里用this来findView,说明……

兄弟说的有理!非常有理,原来setContentView里为我们隐藏了一个view的成员变量啊(viewgroud?),那么它里面的button等组件的对象也就存在的了,只是这时候还没有被引用而已。而我们为了给相关的组件注册监听器就在oncreate里引用了,这个时候才可以操作button等组件,这些对象是find出来的而不是new出来的,解析的很好,我知道我的理解有没错误?同时也发现原来那个main.xml是这回事啊。谢谢啦。

引用 13 楼  的回复:

我觉得最好的理解方法就是采用C++的方式来理解:变量,指针,内存,资源。楼主的学习态度很好,我也是这样走过来的引用 10 楼  的回复:

有朋友这样回答我的:

第一个问题,你看activity生命周期就可以了,android的程序反映到用户的眼中就是一个个activity.
第二个问题,activity中的控件变量,比如button什么的,本来就应该作为成员变量定义,然后在oncr……

最后在这里一并谢过大家的答复啦!

我觉得Activity创建好以后,其所对应的XML布局文件会在内存中建立好视图树对象层次结构(在内存的堆区);而在onCreate方法中使用 findViewById 方法,获得的是堆区中视图控件对象的指针。当onCreate方法结束后,只是销毁了onCreate方法内部定义的局部变量(栈区内存),并没有销毁堆区的内存,所以,视图控件仍然可以点击,并做出事件响应。
引用 18 楼 stewen_001 的回复:

[Quote=引用 12 楼  的回复:]

oncreate中有个方法叫setContentView,每一个Activity都会加载一个视图,就是说有一个成员变量View,setContentView(View),就是给这个成员变量赋值,所以说oncreate里面定义的两个button虽说是局部变量,同时也是VIew这个成员变量的属性,Button btn = this.findViewById();这里用this来findView,说明……

兄弟说的有理!非常有理,原来setContentView里为我们隐藏了一个view的成员变量啊(viewgroud?),那么它里面的button等组件的对象也就存在的了,只是这时候还没有被引用而已。而我们为了给相关的组件注册监听器就在oncreate里引用了,这个时候才可以操作button等组件,这些对象是find出来的而不是new出来的,解析的很好,我知道我的理解有没错误?同时也发现原来那个main.xml是这回事啊。谢谢啦。这个哥们说的很对 如果不是view对象呢 还会一直被引用吗?


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明菜鸟关于android开发中的变量生命周期的疑问
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!