Activity知识总结

作者: 清枫_小天 | 来源:发表于2016-05-09 19:34 被阅读241次

    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失去操作焦点,但可见)
      系统会停止动画等消耗CPU的事情。
      应该在这里保存你的一些数据,因为这个时候你的程序的优先级降低,
      有可能被系统收回。在这里保存的数据,应该在onResume里读出来。
    • onStop():停止Activity时被回调(Activity失去操作焦点,不可见)

    onDestory():销毁Activity时被回调,该方法只会被调用一次(回收资源)
    这是Activity被kill前最后一个被调用方法了。

    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

    扫描二维码即可关注玩转_android公众号,每天更新,记录菜鸟android学习记,一起成长。同时提供各种软件下载如ps,office2013/2016等

    相关文章

      网友评论

        本文标题:Activity知识总结

        本文链接:https://www.haomeiwen.com/subject/wbperttx.html