Activity生命周期##
- 运行状态:可见,并且可操作
(onCreate--onStart---onResume)
(onRestart--onStart---onResume) - 暂停状态:可见,但是不可操作 onPause
- 停止状态:不可见,并且也不可操作 onStop
- 销毁状态:该Activity结束,或Activity所在的Dalivik进程被结束 onDestory
回调函数###
- onCreate():Activity在实例化过程被调用,进行创建工作,只会调用一次. (一般创建界面,做一些数据的初始化工作)
- onStart():Activity启动过程的回调函数,可见
- onResume():恢复Activity时被回调,onStart()方法后一定会回调该方法,可操作
- onPause():暂停Activity时被回调(Activity失去操作焦点,但可见)
系统会停止动画等消耗CPU的事情。
应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,
有可能被系统收回。在这里保存的数据,应该在onResume里读出来。 - onStop():停止Activity时被回调(Activity失去操作焦点,不可见)
onDestory():销毁Activity时被回调,该方法只会被调用一次(回收资源)
这是Activity被kill前最后一个被调用方法了。
Activity启动方法
-
通过startActivity(Intent intent)启动Activity。
传递参数的方式:putExtra("key",values);
或者putExtras(Bundle);
获取参数的方式:getXxxExtra(key)
或者getExtras().getXxx()
注意:Xxx是数据类型 -
通过startActivityForResult(Intent intent,int requestCode):
( 以指定的请求码启动Activity,而且程序将会等待新启动Activity的结果。
一般情况下,我们只需要保证requestCode>-1即可,
这样它都能收到result。但是如果在A activity中,
能够跳转到多个activiity,并且要接受到这多个
activity中的信息的时候,我们就要注意了,这时候,
requestCode就起大作用了,当你startActiviityForResult()的时候,
给每一个不同的activity一个独立的requestcode,
那么在你接受到result的时候就可以通过这个参数来判断,
结果是那个acitivity返回来的了)启动的Activity重写onActivityResult()
被启动的Activity返回数据:setResult(int,Intent)
那么setResult()应该在什么时候调用呢?从源码可以看出,
Activity返回result是在被finish的时候,也就是说调用
setResult()方法必须在finish()之前。所以在
onPause、onStop、onDestroy方法中调用setResult()也
有可能不会返回成功,因为这些方法调用不一定是在
finish之前的,当然在onCreate()就调用setResult肯定
是在finish之前的,但是又不满足业务需要。
实际使用场景有两个:
(1)按BACK键从一个Activity退出来的,一按BACK,
android就会自动调用Activity的finish()方法,
方法:重写onBackPressed()方法,捕获BACK事件,
捕获到之后先setResult。代码:
@Override public void onBackPressed() { Log.i(TAG, "onBackPressed"); setResult(Const.LIVE_OK); super.onBackPressed(); }
(2)按点击事件中显式的调用finish()
intent.putExtra("result",et.getText().toString()); setResult(RESULT_OK, intent); finish();
Activity四种加载模式##
-
standard 默认
不管Activity实例是否存在,
都会创建一个新的实例装入Task。
(每次通过这种模式来启动目标Activity时,
android总会为目标Activity创建一个新的实例,
并将该Activity添加到目前的Task栈中,
这种模式不会启动新的Task,新的Activity将被添加到原有的Task中)
例子:10个应用程序都要调用浏览器的应用,
那么你需要创建10个浏览器对象的Activity的对象吗? -
singleTop 栈顶单例 --->微薄刷新
被跳转的Activity位于Task顶部时:
不会创建新的实例,直接复用已有的Activity实例
被跳转的Activity不是位于顶部时:
创建一个新的实例,同standard模式相似 -
singleTask 栈内单例:在同一个Task内只有一个实例
采用这种模式分三种情况:
a)如果将要启动的目标Activity不存在,系统将会创建目标Activity的实例,并将它加入Task栈顶。
b)如果将要启动的目标Activity已经位于Task栈顶,此时同singleTop模式
a)如果将要启动的目标Activity没有位于Task栈顶,系统将会把位于该Activity上面的所有Activity移除Task栈,从而使得目标Activity转入栈顶。 -
singleInstance 全局单例模式
采用这种模式启动目标Activity时,可分为如下两种情况:
a)如果将要启动的目标Activity不存在,系统会先创建一个全新的Task,在创建目标Activity的实例,
并将它加入新的Task的栈顶。
b)如果将要启动的目标Activity已经存在,无论它位于哪个应用程序中,无论它位于哪个Task中,
系统会把该Activity所在的Task转到前台,从而使用该Activity显示出来。
需要指出:采用单例模式加载Activity总是位于Task栈顶,
采用单例模式加载Activity所在Task只包含该Activity
网友评论