Activity的简单应用:
创建类,继承Activity
重写Activity的onCreate(Bundle saveInstanceState)方法
在onCreate()方法中第一行是:super.onCreate(..)
在AndroidManifest清单文 件中配置:
在
android:name属性指定创建的Activity类
android:label设置Activity的标题
android:icon属性设置Acitivity的标题图标
android:screenOrientation属性设置窗口屏幕方向
landscape:限制界面为横屏,旋转屏幕也不会改变当前状态。
portrait:限制界面为竖屏,旋转屏幕也不会改变当前状态。
sensor:根据传感器定位方向,旋转手机90度,180,270,360,界面都会发生变化。
sensorLandscape:(横屏的旋转,不会出现竖屏的现象)根据传感器定位方向,旋转手机180度 界面旋转。一般横屏游戏会是这个属性。
sensorPortrait:(竖屏的旋转,不会出现横屏的现象)根据传感器定位方向,旋转手机180度界面会 旋转。
unspecified:由系统选择显示方向,不同的设备可能会有所不同(旋转手机,界面会跟着旋转)
user:用户当前的首选方向。
nosensor:不由传感器确定方向。旋转设备的时候界面不会跟着旋转。初始界面方向由系统提供。
如设置Activity为对话框样式:
android:theme="@android:style/Theme.Dialog"
代码中:
//修改Activity窗口的宽度与高度
WindowManager.LayoutParams wParam=getWindow().getAttributes();
wParam.height=400;
wParam.width=400;
getWindow().setAttributes(wParam);
Activity的四种传值方法:
1.Intent
putExtra(String key,value) getStringExtra("key")
Bundle: 类似于HashMap的集合类
Intent.putExtras(Bundle)/getExtras()
如何传送和获取类对象:类必须实现Serializable序列化接口
3.Application全局对象
1.创建类,继承Application类
2.在类中定义Activity间传值的对象或方法
3.在清单配置文件
4.通过Activity.getApplication()获取Application对象
5.将Application强转成自定义的Application类
6.调用全局对象或方法设置或获取数据
静态成员(不推荐使用)
startActivityForResult
一般用于拍照、录像、二维码扫描
注意:
Intent传递对象,该对象的类,要实现序列化接口(即:Serializable),获得该对象的时候,要使用 getSerializableExtra()方法
Activity的生命周期:
七大生命周期方法
onCreate() 第一次创建时执行
onStart() 显示窗口时执行
onResume() 可获取用户焦点时执行
onPause() 失去用户焦点时执行
onStop() 关闭窗口时执行
onRestart() 重新显示窗口时执行
onDestroy() 销毁时执行
生命周期的作用
①当用户接一个电话或切换到另一个程序不会崩溃
②当用户后台运行程序时不会销毁有价值的系统资源
③当用户离开再返回你的应用时不会丢失用户的进程
④当手机屏幕进行横竖屏切换的时候不会崩溃或者丢掉用户的进程
Activity四个生命周期阶段
开始Activity: onCreate()->onStart()->onResume()
失去焦点: onPause()->onStop()
重新获取焦点: onRestart()->onStart()->onResume()
关闭Activity: onPause()->onStop()->onDestroy()
Activity周期历程:
开始Activity: onCreate()->onStart()->onResume()
失去焦点: onPause()->onStop()
重新获取焦点: onRestart()->onStart()->onResume()
关闭Activity: onPause()->onStop()->onDestroy()
第一次启动:
onCreate--->onStart---->onResume
A页面跳转到B页面:
onPause---->onStop
打电话:
onPause---->onStop--->挂断电话--->onRestart--->onStart--->onResume
按下Home键/锁屏:
onPause---->onStop
打开主界面,HOME键退出,再次启动app
onPause---->onStop--->onRestart--->onStart--->onResume
竖屏切换为横屏:
onPause---->onStop--->onDestory--->onCreate--->onStart--->onResmue
现场保护(保存状态)
onSaveInstanceState(Bundle)
(1)、当用户按下HOME键时。
(2)、长按HOME键,选择运行其他的程序时。
(3)、按下电源按键(关闭屏幕显示)时。
(4)、从activity A中启动一个新的activity时。
(5)、屏幕方向切换时,例如从竖屏切换到横屏时。
调用onSaveInstanceState时机
onCreate(Bundle)
onRestoreInstanceState(Bundle)
现场恢复时,二者任选其一
一、为什么要做现场保护:
1、Activity在生命周期中的Paused状态或Stoped状态下,内存空间紧张的时,系统很可能会干掉Activity,如果用户通过导航再返回刚被干掉的Activity,系统只能创建新的Activity,如果之前的Activity界面已有用户录入信息,如用户名和密码等,而在新的Activity中则没有了,这种时间就需要做现场保护
2、横屏与竖屏切换时,生命周期变化如下:
onPause()->onStop()->onDestroy()->onCreate()->onStart()->onResume()
如果当前窗口中已录入部分信息,而用户不小心切换横竖屏,此时需要做现场保护。
二、调用时机,如下图所示:
横屏竖屏
1、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
2、设置Activity的android:configChanges="keyboardHidden"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、置Activity的android:configChanges="orientation|screenSize|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
设置屏幕方向:android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation|screenSize"
Task和BackStack
概念
一、总结性知识点:
1、Android应用运行时会创建任务Task,用于存放主窗口
2、每一个任务包含一个堆栈数据结构,用于保存当前应用已创建的窗口对象,这个堆栈即回退栈BackStack
3、 位于回退栈顶的窗口会处于焦点状态
4、 窗口的显示与关闭即是入栈与出栈的过程
二、详细描述
(一)、任务Task:
1、概念:
一个任务(task)就是在执行某项工作时与用户进行交互的Activity的集合。这些Activity按照被打开的顺序依次被安排在一个堆栈中(回退栈)。
2、主屏页面:
设备的主屏是大多数任务的启动位置,当用户触摸一个应用程序启动器图标(或者app快捷图标),应用程序的任务就会在前台显示。如果相关应用程序的任务不存在,那么就会有一个新的任务被创建,并且应用程序打开的“主”Activity会作为任务中的根Activity。
(二)、回退栈:
在当前的Activity启动了另一个Activity时,这个新的Activity被放到了堆栈的顶部,并且带有焦点。
前一个Activity并没有消失,而是保存在回退栈中,此时它处于停止状态。
当用户按下回退按钮时,当前的Activity会被从回退栈的顶部弹出(这个Activity被销毁),而前一个Activity被恢复。堆栈中的Activity不会被重新排列。因此,回退栈的操作跟后进先出的对象结构是一样的。
在用户按下回退按钮时,当前Activity被销毁,并且前一个Activity被恢复。如果用户继续按回退按钮,那么回退栈中的每个Activity会被依次弹出,前一个Activity会被显示,直到用户返回主屏(或者返回到任务开始时运行的那个Activity)。当所有的Activity从回退栈中被删除时,这个任务就不再存在了。
(三)、Activity和Task的默认行为的总结:
1、当Activity A启动Activity B时,ActivityA被终止,但是系统保留了它的状态(如滚动条的位置和录入表单的文本)。如果用户在Activity B中按回退按钮,Activity A会使用被保存的状态来进行恢复。
2、当用户通过按主页(Home)按钮离开一个任务时,当前的Activity会被终止,并且被放入后台。系统会保留任务中每个Activity的状态。如果用户随后通过选择启动图标来恢复这个任务,那么任务会来到前台,并且恢复了堆栈顶部的Activity。
3、如果用户按下回退按钮,当前的Activity会从堆栈中被弹出并且被销毁。堆栈中的前一个Activity会被恢复。Activity被销毁时,系统不会保留Activity的状态。
4、Activity能够被实例化多次,甚至来自其他任务。
运行模式
standard:默认,窗口类可以实例化多次
singleTop:
如果调用窗口在栈顶,则返回窗口对象,并直接使用并调用onNewIntent,反之同standard的作用一样,依然创建新的对象,比如,当前栈中窗口:A-B-C-D,D为栈顶,此时startActivity显示D,则直接显示栈顶的D,而不会创建新的D,如果startActivity显示B,因为B不在栈顶,则创建新的B并压入栈中,此时栈:A-B-C-D-B
singleTask
保证一个窗口类在多个回退栈中只能有一个实例;创建模式分如下4种情况:
1、调用同一个应用程序中singleTask模式的窗口,并且该窗口不存在,系统会创建窗口的对象,并将该窗口对象压入当前的回退栈中(不会创建新的任务)
2、调用同一个应用程序中singleTask模式的窗口,窗口存在且在栈顶,则直接调用onNewIntent();如果存在且不在顶栈,同样也调用onNewIntent()并弹出其上所有的窗口对象(这些对象会被释放),以保证窗口获取焦点。
3、调用另一个应用程序中的singleTask窗口,如果对象不存在,会创建新的窗口对象后,将其压入(Activity所属的应用)回退栈中,做为顶部元素。
当返回键时,下一个显示的页面是b回退栈中当前窗口的下一个位置
注意:此时涉及到两个任务(回退栈)的操作。
4、调用另一个应用程序中的singleTask窗口,如果对象已存在,系统会切换到窗口所在的任务,如果不在栈顶,同第2种情况一样,将其上面的对象进行出栈与释放。
singleInstance
与singleTask作用基本相同,但在新创建的Task中只能存在一个Activity
注意:这种用法并不多而且浪费空间,所以不建议使用。
启动Acivity
startActivity(Intent i);
startActivityForResult(Intent i,int requestCode)
作用:使用startActivityForResult启动的Activity在销毁的时候可以给启动他的Activity回传信息
使用:
效果使用AActivity启动BActivity,当BActivity销毁的时候给AActivity回传信息
1,在AActivity使用该方法启动Activity
2,在AActivity中重写的onActivityResult(int requestCode, int resultCode, Intent data)方法
1,比较请求码和响应码是否一致
2,对回传信息做处理
3,在BActivity中使用setResult(int resultCode,Intent i)方法回传意图
示例:
启动顺序:A-B-C-D-A-B-C
任务1:A-B-C-A-B-- 打开C:A-B-C
任务2:D
回退顺序:
C-B-A-D
这2个任务都属于同一个应用程序
一个App可能会有多个任务
同一个任务中,可能存储不同App的Activity对象