Android开发我们最先遇到的就是四大组件,下面我们就从这比较重要和必要的Activity先开始。
Activity生命周期
Activity的生命周期方法基本就已经囊括在上面的图里了,下面我们来了解一下其中的一些方法。
onCreate()
系统在创建Activity的时候会触onCreate()方法,构建视图,通过setContentView设置页面的视图资源,此时的Activity还是不可见的。
onStart()
系统在通过onCreate方法构建完Activity后,通过回调onStart()方法,此时的Activity对用户是可见的,但是页面还是没获取到焦点,因此还不可以进行交互。
onResume()
当系统回调该方法时,说明页面已经完全加载完毕并获取到焦点,进入可交互的状态。
onPause()
当页面失去焦点时触发(对用户还是可见的,比如弹一个dialog),当页面重新获取到焦点时会触发onResume方法。
onStop()
当页面对用户不可见时会触发该回调,可以在该回调中停用一些视图变化的操作,比如停用动画播放。
onRestart()
当页面从stop状态重新来到前台的时候会执行。
onDestroy()
当页面被销毁前触发。
Activity启动模式
Activity共有四种启动模式 ,下面我们一一做下介绍。
standard(默认模式)
系统在启动该Activity的任务栈顶部创建Activity的新实例,可以重复叠加。
singleTop
系统在启动该Activity的任务栈顶部如果没有该Activity的实例,则会新建一个并添加,如果
顶部存在该实例了,则会调用onNewIntent方法,而不会重新创建新的实例。
singleTask(适合作为程序入口 )系统在启动该Activity的任务栈中,如果不存在该实例,则会新建一个并添加,如果任务栈中
已经存在该Activity,则会出栈该Activity以上的所有栈,至该Activity位于栈顶。
当 Activity 设置了 taskAffinity 属性,那么这个 Activity 在被创建时就会运行在taskAffinity 名字相同的任务栈中,如果没有,则新建taskAffinity 指定的任务栈,并将 Activity 放入该栈中。另外,taskAffinity 属性主要和 singleTask 或者 allowTaskReparenting 属性配对使用,在其他情况下没有意义。
singleInstance
会直接新建一个新的任务栈,并创建该实例并放入到新的任务栈中,后续启动会复用该任务栈中的实例。
Activity启动方式
Activity的启动分为显式启动和隐式启动。
显式启动
//当可以访问到Activity对应类时用这个比较方便
Intent intent = new Intent(this, xxx.class);
startActivity(intent);
//当不能直接访问到对应的类时,比如跨模块,
就可以用这种显式写类型(包括包名)
Intent intent = new Intent();
intent.setClassName(this,"com.xxx.xxx.Activity");
startActivity(intent);
//通过包名和类全名跳转
Intent intent = new Intent();
ComponentName cn = new
ComponentName("com.xxx.xxx","com.xxx.xxx.xxxActivity");
intent.setComponent(cn);
startActivity(intent);
隐式启动
// 通过Category、Action设置
Intent intent = new Intent();
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.addCategory("com.xxx.xxx");
intent.setAction("com.xxx.xxx");
startActivity(intent);
Activity中的intent-filter
从Activity的隐式启动可以看到,我们可以通过在manifest文件中设置Activity的action、category(其他类别),这样就可以通过设置intent的action和category启动Activity。一个Activity可以在manifest中设置多个intent-filter,只要有一个intent-filter命中,就可以启动Activity。
下面我们可以一起看看一些常见场景中Activity 的生命周期
横竖屏切换当没有对页面android:configChanges进行一些设置时,屏幕旋转会对当前页面进行销毁重构,此时的生命周期调用是
onPause -> onSaveInstanceState -> onStop-> onDestory -> onCreate -> onStart->onRestoreInstanceState-> onResume
当对Activity设置android:configChanges="orientation|
screenSize|keyboardHidden",则并不会对页面进行销毁重构,会回调方法onConfigurationChanged
按home键再回来当内存够时,会调用onPause->onStop
->onRestart->onStart->onResume
按back键(ActivityA ActivityB)ActivityB-onPause->ActiviyA-onRestart-onStart-onResume->ActivityB-onStop-onDestroy