Activity状态转换和Activity栈
一个Activity的启动顺序:
onCreate()——>onStart()——>onResume()
当另一个Activity启动时:
第一个ActivityonPause()——>第二个ActivityonCreate()——>onStart()——>onResume()
——>第一个Activity onStop()
当返回到第一个Activity时:
第二个Activity onPause()——> 第一个ActivityonRestart()——>onStart()——>onResume()
——>第二个ActivityonStop()——>onDestroy()
一个Activity的销毁顺序:
(情况一)onPause()——><ProcessKilled>
(情况二)onPause()——>onStop()——><ProcessKilled>
(情况三)onPause()——>onStop()——>onDestroy()
onCreate :当活动第一次启动的时候,触发该方法,可以在此时完成活动的初始化工作。onCreate 方法有一个参数,该参数可以为空( null ),也可以是之前调onSaveInstanceState ()方法保存的状态信息。
onStart :该方法的触发表示所属活动将被展现给用户。
onResume :当一个活动和用户发生交互的时候,触发该方法。
onPause :当一个正在前台运行的活动因为其他的活动需要前台运行而转入后台运行的时候,触发该方法。这时候需要将活动的状态持久化,比如正在编辑的数据库记录等。
onRestart :当处于停止状态的活动需要再次展现给用户的时候,触发该方法。
onDestroy :当活动销毁的时候,触发该方法。和onStop 方法一样,如果内存紧张,系统会直接结束这个活动而不会触发该方法。
onStop :当一个活动不再需要展示给用户的时候,触发该方法。如果内存紧张,系统会直接结束这个活动,而不会触发onStop 方法。所以保存状态信息是应该在onPause时做,而不是onStop时做。
onSaveInstanceState :系统调用该方法,允许活动保存之前的状态,比如说在一串字符串中的光标所处的位置等。
每个Activity的状态是由它在Activity栈(是一个后进先出LIFO,包含所有正在运行Activity的队列)中的位置决定的。
当一个新的Activity启动时,当前的活动的Activity将会移到Activity栈的顶部。
如果用户使用后退按钮返回的话,或者前台的Activity结束,活动的Activity就会被移出栈消亡,而在栈上的上一个活动的Activity将会移上来并变为活动状态。
一般认为Activity有以下四种状态:
活动的:当一个Activity在栈顶,它是可视的、有焦点、可接受用户输入的。Android试图尽最大可能保持它活动状态,杀死其它Activity来确保当前活动Activity有足够的资源可使用。当另外一个Activity被激活,这个将会被暂停。
暂停:在很多情况下,你的Activity可视但是它没有焦点,换句话说它被暂停了。有可能原因是一个透明或者非全屏的Activity被激活。
当被暂停,一个Activity仍会当成活动状态,只不过是不可以接受用户输入。在极特殊的情况下,Android将会杀死一个暂停的Activity来为活动的Activity提供充足的资源。当一个Activity变为完全隐藏,它将会变成停止。
停止:当一个Activity不是可视的,它“停止”了。这个Activity将仍然在内存中保存它所有的状态和会员信息。尽管如此,当其它地方需要内存时,它将是最有可能被释放资源的。当一个Activity停止后,一个很重要的步骤是要保存数据和当前UI状态。一旦一个Activity退出或关闭了,它将变为待用状态。
待用:在一个Activity被杀死后和被装在前,它是待用状态的。待用Acitivity被移除Activity栈,并且需要在显示和可用之前重新启动它。
Finish与System.exit(0)的区别
finish是Activity的类,仅仅针对Activity,当调用finish()时,只是将活动推向后台,并没有立即释放内存,活动的资源并没有被清理;
当调用System.exit(0)时,杀死了整个进程,这时候活动所占的资源也会被释放。
back键在程序的生命周期有很大作用,譬如某个activity你只想让他出现一次,在周期中点击了back,就让他被销毁掉··
android 的 back键返回上一级Activity
finish()与onDestroy()
程序员调用finish()方法用于结束一个Activity的生命周期,
而onDestory()方法则是Activity的一个生命周期方法,其作用是在一个Activity对象被销毁之前,Android系统会调用该方法,用于释放此Activity之前所占用的资源。
finish会调用到onDestroy方法,
finish的不同位置的不同执行结果
onCreate()中-------》仅指向onCreate、onDestroy
onStart()中---------》执行onCreate、onStart、onStop、onDestroy
onResume()/onPause()/onStop()/onDestroy()---------》全部都执行(除onRestart()外)
view重绘
android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。invalidate和postInvalidate方法需要使用android提供的handler,才能实现重绘, 具体是在需要重绘的地方调用handler的sendMessage方法发送消息,紧接着会os会触发handler中的handlerMessage方法,在handlerMessage方法中再调用view的invalidate或者postInvalidate方法就能实现重绘。
1. 对于线程中的刷新一个View为基类的界面,可以使用postInvalidate()方法在线程中来处理,其中还提供了一些重写方法比如postInvalidate(int left,inttop,int right,int bottom) 来刷新一个矩形区域,以及延时执行,比如postInvalidateDelayed(longdelayMilliseconds)或postInvalidateDelayed(longdelayMilliseconds,int left,int top,int right,int bottom) 方法,其中第一个参数为毫秒
2. 对于Android中Handler可以传递一些内容,通过Bundle对象可以封装String、Integer以及Blob二进制对象,我们通过在线程中使用Handler对象的sendEmptyMessage或sendMessage方法来传递一个Bundle对象到Handler处理器。对于Handler类提供了重写方法handleMessage(Message msg) 来判断,通过msg.what来区分每条信息。将Bundle解包来实现Handler类更新UI线程中的内容实现控件的刷新操作。
invalidate 方法是用来更新视图(View)的方法,不过这东西的用法比较古怪 invalidate 方法如果你直接在主线程中调用,是看不到任何更新的。如果跟线程结合使用的话比如在下面的代码中就会抛出异常
UIThreadimplements Runnable{
public void run(){
invalidate();
}}
上面的代码会抛出Only the originalthread that created a view hierarchy can touch its views。怎么样解决此问题呢,如果你有两个View,你需要一个View用来显示当前的状态,一个Thread去下载网络数据或者是读取文件等,这些数据读取完毕后你要更新View到当前屏幕上怎么办呢。
第一种解决方案是:
class UIUpdateThread implements Runnable{
public void run(){
try {
Thread.sleep(1000*5);
mHandler.post(mUpdateResults);
} catch (InterruptedException e) {
e.printStackTrace();
}}
final Handler mHandler = new Handler();
final Runnable mUpdateResults = new Runnable() {
public void run() {
invalidate(); //更新视图
}};}
你必须实现一个Handler.然后在你下载数据的线程中放上一个mHandler.post(mUpdateResults);就可以了。
第2中方案比较简单
LoadDataThreadimplements Runnable{
public void run(){
doLoadData();
mHandler.sendMessage(mHandler.obtainMessage()); //这里系统会自动调用handleMessage就可以更新视图
}}
Handler mHandler =new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 这里处理视图需要更新的代码。
}};