Activity 深入理解

Activity 主要是用来和用户交互的,所以是否获得焦点与是否可见是理解Activity 生命周期的关键。


一共有 七个生命周期方法,如下:


整个生命周期开始于 onCreate,结束于 onDestory。

可见生命周期: 开始于 onStart,结束于 onStop。

获得焦点的生命周期: 开始于 onResume,结束于 onPause。


上面已经有 三对生命周期方法,还有一个 onRestart,是在onStop调用后,这个Activity由回到前台时调用的。即 onStop --> onRestart --> onStart。


在onResume里启动线程,在onPause里停止线程

在onResume里注册广播,在onPause里取消注册


所有的Activity必须实现onCreate(Bundle)函数来进行初始化;也可能实现onPause()函数来提交数据的变化。


不是生命周期方法,但是也是很重要的方法:onNewIntent


当该Activity的启动模式是 singleTask 或者 singleInstance 时,如果这个Activity有存在的实例,再次进入时不是调用 onCreate,而是 onNewItent。

可以是onPause --> onNewIntent --> onResume 

也可能是 onStop --> onNewIntent --> onRestart --> onStart --> onResume



注:四种模式


standard 标准模式默认加载模式

singleTopTask 顶单例模式在栈顶是不会新建

singleTaskTask 内单例模式该Task中这个Activity只有一个实例且始终在栈底,允许其他Activity存在

singleInstance全局单例模式该Task中有且只有这个Activity的这一个实例。


其它:

onSaveInstanceState()

总而言之,onSaveInstanceState()的调用遵循一个重要原则,即当系统存在“未经你许可”时销毁了我们的activity的可能时,则onSaveInstanceState()会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据(当然你不保存那就随便你了)。如果调用,调用将发生在onPause()或onStop()方法之前。(虽然测试时发现多数在onPause()前)

onRestoreInstanceState()

onRestoreInstanceState()被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行 此也说明上二者,大多数情况下不成对被使用。

onRestoreInstanceState()在onStart() 和 onPostCreate(Bundle)之间调用。

onSaveInstanceState()方法的默认实现

  如果我们没有覆写onSaveInstanceState()方法, 此方法的默认实现会自动保存activity中的某些状态数据, 比如activity中各种UI控件的状态.。android应用框架中定义的几乎所有UI控件都恰当的实现了onSaveInstanceState()方法,因此当activity被摧毁和重建时, 这些UI控件会自动保存和恢复状态数据. 比如EditText控件会自动保存和恢复输入的数据,而CheckBox控件会自动保存和恢复选中状态.开发者只需要为这些控件指定一个唯一的ID(通过设置android:id属性即可), 剩余的事情就可以自动完成了.如果没有为控件指定ID, 则这个控件就不会进行自动的数据保存和恢复操作。

上面转自:http://www.cnblogs.com/hanyonglu/archive/2012/03/28/2420515.html


更新UI

在 Handler 中可以直接更新,在 BroadcastReceiver 中也可以,所以线程可以用 Handler 或者 发送广播来更新。

//将一个线程立即加入线程队列,并执行它的run方法
handler.post(test);

Runnable test = new Runnable(){
  public void run(){
    //以上代码略
    //延迟1000毫秒,执行这个线程的run方法
    handler.postDelayed(test,1000);
  }
}

//退出时
//即从线程队列中移除该线程,不再被执行
handler.removeCallbacks(test);
代码来自:http://www.iteye.com/problems/67052

线程队列中执行的线程是没有新开线程的,只是在UI主线程中调用了其中的run方法而已。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值