android知识总结--Activity

四大组件之一,通常一个用户交互界面对应一个 activity。activity 是Context 的子类,同时实现了 window.callback

和 keyevent.callback, 可以处理与窗体用户交互的事件。继承关系如下图(来源网络):


〇、配置、启动与关闭

1.四大组件都必须在androidManifest文件中注册,Activity也不例外,参数有name、icon、label、export、launchMode等,可指定一个或多个<intent-filter>元素,用于指定可响应的intent。

2.启动方式(由activity):

startActivity(Intent intent);

startActivityForResult(Intent intent,int requestCode);

关闭方法:

finish();

finishActivity(Int requestCode);

3.利用Bundle,Activity间交换数据。(Intent部分)


一、生命周期


onCrate():创建界面,初始化。

onStart():此时界面可见但不可交互。

onResume():变为可交互。

onPause():可见不可交互,停止动画等,可能被回收。此方法中可用来保存一些的数据,并在重新启动时,在onResume()中读取。注意:操作要简短,因为下一个Activity不会等到此方法执行完才启动。

onStop():不可见

onDestroy():调用finish()或系统为节省将其关掉,会执行此方法,可用isFinish()判断是否结束。注意:若有ProgressDialog在线程中转动,要在onDestroy()中cancel,否则当线程结束,progressDialog调用cancel方法(此时Activity已经关掉)会抛异常。

比如,该Activity运行中被另一个全屏Activity中断,调用onPause()-->onStop(),恢复时调用onStart()-->onResume();若是非覆盖,则仅仅onPause(),恢复时调用onResume();

注意:onPause、onStop、onDestroy三种状态下都有可能被系统关闭;

启动另一个Activity并Finish的过程:旧Activity的onPause()-->新Activity的onCreate-->onStart-->onResume,其次才是旧Activity的onDestroy。

如果没有调用finish,那么不会调用onDestroy,并且在调用onStop之前还会调用onSaveInstanceState方法,再次启动时调用的是onRestart-->onStart-->onResume。



二、4种启动模式


1.standard

默认启动模式,每次都会new一个Activity压入到Task栈,不论此Activity存在与否,都是new一个实例,从onCreate开始。点击返回按钮,按出栈顺序依次销毁。且使用同一个Task。

2.singleTop

要启动的Activity如果在栈顶则复用,不在栈顶则创建新实例,使用同一Task。

例子:有三条推送消息,无论什么顺序点开,都是同一个Activity。

3.singleTask

一个Task栈只存要启动Activity的一个实例(不重复,置顶)。

若此Task没有此Activity实例,new一个;若存在没有置顶,则将其之上的弹出,使之置顶;若已存在且已置顶,复用;

就好比关闭许多分支页面,回到主页面,但依然可以后退(把主页面打开的界面(非分支))。

4.singleInstance

无论多少个App中,多少个task栈启动,保证只有一个此Activity实例,且此Task栈中有且仅有这一个Activity实例。此方式启动,即把该Activity所在的Task转到前台,若没有则启动新Task并new一个此Activity实例。

注意:

launchMode为singleTask,Intent启动Activity,如果已经存在实例,那么不会调用onCreate(),而是调用onNewIntent()-->onRestart()-->...。当然,真正写代码的时候,可不能忘了,系统可能会随时杀掉后台运行的Activity,如果这一切发生,那么系统就会调用onCreate方法,而不调用onNewIntent方法。还是单独写一下吧。


三、onNewIntent

Activity供多种方式调用启动的情况,多个调用希望只有一个Activity的实例存在,这就需要Activity的onNewIntent(Intent intent)方法了。

launchMode为singleTask,Intent启动Activity,如果已经存在实例,那么不会调用onCreate(),而是调用onNewIntent()-->onRestart()-->...。当然,真正写代码的时候,可不能忘了,系统可能会随时杀掉后台运行的Activity,那么系统就会调用onCreate方法,而不调用onNewIntent方法。

当调用到onNewIntent(intent)的时候,需要在onNewIntent() 中使用setIntent(intent)赋值给Activity的Intent.否则,后续的getIntent()都是得到老的Intent。

protected void onNewIntent(Intent intent) {

   super.onNewIntent(intent);

   setIntent(intent);//must store the new intent unless getIntent() will return the old one

   processExtraData();

 }


四、onSaveInstanceState()

Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState() 会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。

详见:http://www.cnblogs.com/hanyonglu/archive/2012/03/28/2420515.html

五、随时补充











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值