一、生命周期
onCreate():当activity被创建时调用,在这里主要做一些初始化的操作,如设置布局、初始化视图、绑定控件等等。
onStart():当用户变成用户可见时调用,此时的activity还不可见。举个例子说明一下这个函数的意义,当你按下home键直接返回了主页面,再进入这个activity时,会先调用onRestart()函数,再调用它,而不会去调用onCreate()函数了。这个函数一般是注册一些变量,这些变量只有activity类在前台时才能被响应.
onResume():activity获取焦点时调用,此时activity返回栈顶,并处于运行状态。这里一般可以做一些刷新UI的操作,每当activity调用到这里时就刷新一下控件。
Activity失去了焦点:这个很多人不理解,这个失去焦点的意思就是用户不能对activity操作了,比如我们弹出来一个广告或者升级提示,这时activity我们就不能操作了,但是依旧能看见,当再次关闭这个弹窗时,又获取了焦点,就再次执行onResume()方法。
onPause():说明白了失去焦点的原因,这个函数就很容易理解了。这个函数主要是界面失去了焦点,通常在这个函数中是对一些变量做操作,会释放一些占CPU资源,或者保存一些关键的数据.官方解释:
(1)当activity进入后台并且该Activity并未销毁时,该方法会被调用
(2)在Activity A中启动Activity B,如果B的活动页面覆盖在了A上面,那么Activity A则会调用onPause().
(3)onPause()方法对应的方法是onResume,如果一个Activity调用了onPause()不活动状态时,那么当Activity进入活动状态的时候必定会调用onResume().
onStop():界面不可见,在activity完全不可见时调用.官方解释:
(1)当前的Activity不再呈现给用户的时候,onStop()被调用。
(2)如果onStop()方法被调用之后,那么该Activity就处于挂起状态。那么在此时的情况下,要么唤醒它(onRestart()),要么销毁它(onDestroy())。
(3)在某些情况下,该方法可能不会被调用。比如系统内存过低导致无法确保在onPause()方法在被调用之后该Activity继续保持着运行状态。
onDestroy():activity销毁
onRestart():当用户按Home键返回桌面,并重新进入activity时被调用。
生命周期这一块用几个例子加深一下理解:
(1)Activity A启动了Activity B的时候,Activity A和Activity B的生命周期的运行的方法排序是什么?
正常状态: onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B) -> onStop(A)
Dialog:onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B)
(2)当处于Activity B时,点击返回键回到Activity A时,Activity A 和 Activity B的生命周期的运行的方法排序是什么?
正常状态:onPause(B) -> onRestart(A) -> onStart(A) -> onResume(A) -> onStop(B) -> onDestroy(B)
Dialog:onPause(B) -> onResume(A) -> onStop(B) -> onDestroy(B)
(3)当处于Activity B时,按下锁屏按钮,Activity A和Activity B的生命周期方法排序是什么?
正常状态:onPause(B) -> onStop(B),重新唤醒时:onRestart(B) -> onStart(B) -> onResume(B)
Dialog:onPause(B) -> onStop(B) -> onStop(A),重新唤醒时:onRestart(B) -> onStart(B) -> onRestart(A) -> onStart(A) -> onResume(B)
(4)如果设置Activity B的主题为Dialog风格的话,那么(1)(2)(3)的结果分别是什么?
二、启动模式
standard:默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同的Activity叠加。
singletask:开启一个ActivityB的时候检查任务栈里面是否有这个ActivityB的实例存在,如果存在的话,清空这个任务栈ActivityB上面的所有的Activity,复用这个ActivityB。
singletop:如果发现任务栈的栈顶已经存在这个Activity,再去开启Activity的时候,就不去重新创建新的Activity而是复用这个栈顶已经存在的Activity。
singleinstance:开启一个新的任务栈,任务栈里面只有一个Activity的实例存在,如果这个Activity被开启,把这个任务栈放在前面,如果开启了新的别的Activity,则别的Activity所在的任务栈会被放在前面。极端的说,在整个手机的操作系统里面只会有一个实例存在。
三、创建流程
(1)自定义类名,继承Activity类(Activity和AppCompatActivity二选一,后者提供了一些新的东西).
(2)重写onCreate()方法,在该方法中调setContentView()设置要显示的视图.
(3)在AndroidManifest.xml对Activity进行配置
注意:onCreate()方法中的函数,可以填两个参数一个是Bundle savedInstanceState,另一个是PersistableBundle persistableState,如果要用第二个函数要在配置文件中为Activity设置一个属性:
android:persistableMode="persistAcrossReboots"
然后Activity就有了持久化的能力,一般会搭配两个方法使用:
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState);
前一个方法会在下述情形中被调用:
1.点击home键回到主页或长按后选择运行其他程序
2.按下电源键关闭屏幕
3.启动新的Activity
4.横竖屏切换时,肯定会执行,因为横竖屏切换的时候会先销毁Act,然后再重新创建 重要原则:当系统"未经你许可"时销毁了你的activity,则onSaveInstanceState会被系统调用, 这是系统的责任,因为它必须要提供一个机会让你保存你的数据(你可以保存也可以不保存)。
说回这个Activity拥有了持久化的能力,增加的这个PersistableBundle参数令这些方法 拥有了系统关机后重启的数据恢复能力!!而且不影响我们其他的序列化操作
四、启动一个Activity的几种方式
1.显式启动
(1)最常用的
startActivity(new Intent(当前Act.this,要启动的Act.class));
(2)通过Intent的ComponentName:
ComponentName cn = new ComponentName("当前Act的全限定类名","启动Act的全限定类名") ;
Intent intent = new Intent() ;
intent.setComponent(cn) ;
startActivity(intent) ;
(3)初始化Intent时指定包名
Intent intent = new Intent("android.intent.action.MAIN");
intent.setClassName("当前Act的全限定类名","启动Act的全限定类名");
startActivity(intent);