(1)activity是一种应用程序组件,是一个可与用户进行交互的可视化界面。
它继承自context, 同时实现了和 可以处理与用户的交互事件。
2)activity界面的具体内容可以通过xml布局文件来设置,使用activity,需要在配置文件中进行注册。
3)通常,一个用户界面对应一个activity,一个应用程序会有多个activity。
其中有一个称为main activity或者说入口activity, main activity在应用程序启动时首先被调用。
4)android通过栈(或者说任务)来管理activity,它遵循后进先出的规则。
一个activity a 可以通过startactivity()启动另一个activity b。
默认情况下,b被载入a所在的栈,对用户可见,而a则变为不可见。
当用户按下返回键后,b出栈并被销毁,a重新位于栈顶,对用户可见。
生命周期是指一个对象从创建到销毁的过程,这一过程对象会经历不同的状态,不同状态的转变会调用对象不同的生命周期方法。
activity有7个生命周期方法,分别是:
void oncreate()
/ onactivityresult()
void onrestart()
void onstart()
/ onrestoreinstancestate()
void onresume()
/ ons**einstancestate()
void onpause()
void onstop()
void ondestroy()
有三种状态,分别是:
运行(激活)状态、暂停状态、停止状态;
1)当通过startactivity()启动一个activity a时,a就进入了运行状态,此过程会执行a的oncreate() onstart() 和onresume()方法。
处于运行状态的activity位于栈的最顶部,并且对用户来说完全可见,用户可以与它进行交互;
2)此时,如果在a中启动一个对话框,覆盖了a的一部分界面,那么a就从运行状态变为暂停状态,此过程会执行a的onpause();
处于暂停状态的activity失去了焦点,对用户来说有一部分不可见,用户不能直接与它进行交互;
当用户销毁对话框,a会从暂停状态回到运行状态,此过程会执行a的onresume()方法;
3)当在a中启动另外一个activity b,b完全覆盖了a,那么a就从运行状态变为停止状态,此过程会执行a的onpause() 和 onstop()方法;
处于停止状态的activity对用户来说完全不可见,当系统内存紧缺时,有可能会被系统进行**。
当用户按下返回键销毁b回到a时,那么a会从停止状态回到运行状态,此过程会执行a的onrestart() onstart() 和onresume()方法;
4)当调用finish()销毁a时,会执行a的onpause() onstop() 和 ondestroy()方法;
5)如果activitya处于停止状态时因系统内存紧张而被销毁,那么重新返回到a时,系统会创建一个新activitya对象。
onactivityresult()-onrestart()-onstart()-onresume()
横竖屏切换时候,activity的生命周期与activity在配置文件中的android:configchanges属性有关。
activity 生命周期方法:
protected void oncreate();
protected void onrestart();
protected void onstart();
protected void onresume();
protected void onpause();
protected void onstop();
protected void ondestroy();
另外,还有三个较特殊的方法:
ons**einstancestate();
onrestoreinstancestate();
onconfigarationchanged();
1)当的android:configchanges的值为"orientation|keyboarhidden"或者"orientation"时:
横竖屏切换时,会执行activity的onconfigurationchanged()方法;
2)其它情况,在进行横竖屏切换时,会先销毁原有的activity对象,然后重新创建一个新的activity对象:
依次执行如下方法:
ons**einstancestate()
onpause()
onstop()
ondestroy()
oncreate()
onstart()
onrestoreinstancestate()
onresume()
在android2.2的模拟器上进行测试,结果与此会不相同。
模拟器按ctrl+f11切换横竖屏)
游戏开发中, 屏幕的方向都是写死的。
除了在栈顶的activity,其他的activity都有可能在内存不足的时候被系统**,一个activity越处于栈底,被**的可能性越大。)
为了防止**造成的数据丢失,)可以重写activity的ons**einstancestate(),将界面状态信息及相关数据保存起来;
再在oncreate() 或 onrestoreinstancestate()方法中对数据进行恢复:
protected void ons**einstancestate(bundle outstate)
注意:关于onrestoreinstancestate():
ons**einstancestate()方法和onrestoreinstancestate()并不一定是成对被调用的。
只有当activity确实被系统销毁了,才会调用onrestoreinstancestate(),如果仅仅是“可能会被销毁”,则该方法是不会被调用的。
例如:在activity a中,用户按下home键回到主界面,紧接着用户又返回到activity a。
这种情况下activity a一般不会因为内存的原因被系统销毁,所以activity a的onrestoreinstancestate()是不会被执行的。
假设有两个默认样式的activity a和b,1)如果在a中通过startactivity(new intent(context, 启动b,则一定会执行a的ons**einstancestate() onpause()和onstop()方法,以及b的oncreate() onstart() onresume();
如果activityb为对话框或透明样式,则此过程不会执行a的onstop()方法;
当finish()b返回到a时,会调用b的onpause() onstop() ondestroy(),以及a的onrestart() onstart() onresume();
如果b为对话框或透明样式,则此过程只会执行a的onresume()方法;
2)如果在a中是通过startactivityforresult(new intent(context, 0)启动b,则情况与(1)基本相似,不同的是当finish()b返回a时,还会多执行a的onactivityresult()方法;
执行次序是:onactivityresult()-onrestart()-onstart()-onresume())
同一个程序,但不同的activity是否可以放在不同的task任务栈中?(可以)
任务就是管理activity的栈,它只是针对activity而言,跟service或其它组件没有任何关系。
栈中的activity可能属于同一个应用,也可能来自不同的应用。
处于栈顶位置的对象就是当前屏幕显示的activity,用户可以与它进行交互。
栈中的activity一般不会进行重排,只会遵循后进先出的规则作压入或弹出操作;
Android学习笔记
1 stringbuffer的使用 stringbuffer类和string一样,也用来代表字符串,只是由于stringbuffer的内部实现方式和string不同,所以stringbuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于string类。所以在实际使用时,如果经常需要对一个...
android学习笔记
目录。1 拨号器。2 短信发送器。3 单元测试1 4 单元测试2 5 文本文件读写。6 跨应用文件访问。7 访问sd卡。8 dom解析xml 9 sax解析xml文件。10 使用pull解析xml文件。11 共享首选项。12 跨包访问共享首选项。13 编程式布局。14 sqlite数据库操作。15 ...
Android学习笔记
android学习笔记 mars 1 android环境搭建。a adt bundle windows x86 b 配置环境变量 虚拟机运行的环境变量 随便整一个 i.android sdk home c android work d 2 android目录结构。a src 源文件 j a b as...