Activity知识总结

Activity生命周期

  1. 运行状态:可见,并且可操作
    (onCreate--onStart---onResume)
    (onRestart--onStart---onResume)
  2. 暂停状态:可见,但是不可操作 onPause
  3. 停止状态:不可见,并且也不可操作 onStop
  4. 销毁状态:该Activity结束,或Activity所在的Dalivik进程被结束 onDestory

回调函数

  • onCreate():Activity在实例化过程被调用,进行创建工作,只会调用一次. (一般创建界面,做一些数据的初始化工作)
  • onStart():Activity启动过程的回调函数,可见
  • onResume():恢复Activity时被回调,onStart()方法后一定会回调该方法,可操作
  • onPause():暂停Activity时被回调(Activity失去操作焦点,但可见)
    <span style="font-size:14px;">系统会停止动画等消耗CPU的事情。
    应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,
    有可能被系统收回。在这里保存的数据,应该在onResume里读出来。</span>

  • onStop():停止Activity时被回调(Activity失去操作焦点,不可见)
  • onDestory():销毁Activity时被回调,该方法只会被调用一次(回收资源)
    <span style="font-size:14px;"> 这是Activity被kill前最后一个被调用方法了。</span>

Activity启动方法

  1. 通过startActivity(Intent intent)启动Activity。
    传递参数的方式:putExtra("key",values);
    或者putExtras(Bundle);
    获取参数的方式:getXxxExtra(key)
     或者getExtras().getXxx()
     注意:Xxx是数据类型
  2. 通过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四种加载模式

  1. standard 默认
    不管Activity实例是否存在,
    都会创建一个新的实例装入Task。

    (每次通过这种模式来启动目标Activity时,

    android总会为目标Activity创建一个新的实例,
    并将该Activity添加到目前的Task栈中,
    这种模式不会启动新的Task,新的Activity将被添加到原有的Task中)
    例子:10个应用程序都要调用浏览器的应用,
    那么你需要创建10个浏览器对象的Activity的对象吗?

  2. singleTop 栈顶单例 --->微薄刷新
    被跳转的Activity位于Task顶部时:
    不会创建新的实例,直接复用已有的Activity实例
    被跳转的Activity不是位于顶部时:
    创建一个新的实例,同standard模式相似

  3. singleTask 栈内单例:在同一个Task内只有一个实例
    采用这种模式分三种情况:

     a)如果将要启动的目标Activity不存在,系统将会创建目标Activity的实例,并将它加入Task栈顶。  
     b)如果将要启动的目标Activity已经位于Task栈顶,此时同singleTop模式

    a)如果将要启动的目标Activity没有位于Task栈顶,系统将会把位于该Activity上面的所有Activity移除Task栈,从而使得目标Activity转入栈顶。

  4. singleInstance 全局单例模式
    采用这种模式启动目标Activity时,可分为如下两种情况:

     a)如果将要启动的目标Activity不存在,系统会先创建一个全新的Task,在创建目标Activity的实例,

    并将它加入新的Task的栈顶。

     b)如果将要启动的目标Activity已经存在,无论它位于哪个应用程序中,无论它位于哪个Task中,

    系统会把该Activity所在的Task转到前台,从而使用该Activity显示出来。

    需要指出:采用单例模式加载Activity总是位于Task栈顶,
    采用单例模式加载Activity所在Task只包含该Activity

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值