Activity相关知识总结

Posted 小威少威

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Activity相关知识总结相关的知识,希望对你有一定的参考价值。

一、activity启动过程和启动模式

  1. standard
  2. singleTop
  3. singleTask
  4. singleInstance

    1、standard:默认启动模式,可以不用在xml文件中配置。
    2、singleTop:可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。
    3、singleTask:只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
    4、singleInstance只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。

    activity生命周期:
    1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。
    2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。
    3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。
    4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。
    5.用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。
    6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。
    7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。

二、activity部分源码分析:
启动一个activity:
入口函数:

/**
     * Same as @link #startActivity(Intent, Bundle) with no options
     * specified.
     *
     * @param intent The intent to start.
     *
     * @throws android.content.ActivityNotFoundException
     *
     * @see @link #startActivity(Intent, Bundle)
     * @see #startActivityForResult
     */
    @Override
    public void startActivity(Intent intent) 
        this.startActivity(intent, null);
    
@Override
    public void startActivity(Intent intent, @Nullable Bundle options) 
        if (options != null) 
            startActivityForResult(intent, -1, options);
         else 
            // Note we want to go through this call for compatibility with
            // applications that may have overridden the method.
            startActivityForResult(intent, -1);
        
    
 public void startActivityForResult(@RequiresPermission Intent intent, int requestCode) 
        startActivityForResult(intent, requestCode, null);
    

可以发现,主要由startActivityForResult这个方法准备打开activity。

public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
            @Nullable Bundle options) 
        if (mParent == null) 
            //启动新的activity,mMainThread.getApplicationThread()是关键方法
            Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);
            if (ar != null) 
                mMainThread.sendActivityResult(
                    mToken, mEmbeddedID, requestCode, ar.getResultCode(),
                    ar.getResultData());
            
            if (requestCode >= 0) 
                // If this start is requesting a result, we can avoid making
                // the activity visible until the result is received.  Setting
                // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
                // activity hidden during this time, to avoid flickering.
                // This can only be done when a result is requested because
                // that guarantees we will get information back when the
                // activity is finished, no matter what happens to it.
                mStartedActivity = true;
            

            cancelInputsAndStartExitTransition(options);
            // TODO Consider clearing/flushing other event sources and events for child windows.
         else 
            if (options != null) 
                mParent.startActivityFromChild(this, intent, requestCode, options);
             else 
                // Note we want to go through this method for compatibility with
                // existing applications that may have overridden it.
                mParent.startActivityFromChild(this, intent, requestCode);
            
        
    

真正执行打开activity的代码:Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode, options);

activity setContentView方法:

public void setContentView(@LayoutRes int layoutResID) 
        getWindow().setContentView(layoutResID);
        initWindowDecorActionBar();
    

该方法用来加载布局资源文件。

以上是关于Activity相关知识总结的主要内容,如果未能解决你的问题,请参考以下文章

Android学习总结——开篇

Android碎片Fragment总结

知识总结: Activity的四种启动模式

基础总结篇之三:Activity的task相关

第三章知识点总结

热门前沿知识相关面试问题-MVC/MVP/MVVM架构设计模式面试问题详解