接下来根据自己的平时的学习和自己最近要读的两本书《android开发艺术探索》和《android群英传》来梳理记录下自己的学习过程和对于遇到问题如何处理解决,还有将会陆续下一些有关关于如何将Java代码写的更优雅的,结合自己读过的书来做个记录整理型的系列博客。这两本书主要是关于android底层的实现的讲得比较多,对于项目的实战开发,看了一下,《app研发录》挺不错的。对于开始架构的设计上讲得很不错。
接下来是个人在Activity学习中,记录下来的一些知识和个人的一些理解,同时附带了自己的学习实例源码。

Activity生命周期

Activity正常生命周期

涉及到activity的生命周期要提的是activity的七个生命周期回调函数,首先看一下其各自的执行顺序。用户参与下的Activity所进行的正常生命周期.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("MAIN", "onCreate");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("MAIN","onRestart");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.i("MAIN", "onStart");

    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i("MAIN","onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i("MAIN","onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i("MAIN","onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("MAIN","onDestroy");
    }
}

测试结果
启动
onCreate->onStart->onResume
屏幕熄灭
onPause->onStop
屏幕点亮
onStart->onResume
按下HOME键
onPause->onStop
按下返回键
onPause->onStop->onDestroy

各个生命周期特征

onCreate:当打开一个新的Activity时执行,可以用来加载布局或者是加载一些数据。
onStart:这个时候,Activity已经可见,只是处在后台,无法与用户交互。
onReStart:在执行了onStop之后,在此回到该Activity时,会执行,可以用来进行一些恢复性操作。
onResume:此时activity已经可见,而且可以和用户进行交互。
onPause:表示activity正在停止,可进行一些动画停止之类的操作处理。不可过于耗时。
onStop:activity即将停止,可以进行一些稍微耗时的操作。
onDestroy:这个时候,Activity被销毁,可以进行一些回收工作和最终的资源释放。

Activity跳转时,两个activity的生命周期如何变化,通过一个Activity向另一个Activity进行跳转,生命周期的变化时。
onCreate->onStart->onResume->onPause->onCreate->onStart->onResume->onStop
粗体部分为第二个Activity的活动周期,可以看出,当第一个onPause执行完之后,第二个activity便开始启动,因此为了让第二个activity启动的速度加快,我们必须要将第一个activity中的onPause方法执行的任务要尽量的少。activity的控制又AMS(Activity Manager Service)来控制一个activity栈和其状态。

Activity异常生命周期

由于系统原因,导致的activity被创建销毁
资源相关的系统配置导致的activity被杀死,典型的例子就是在横竖屏切换的时候,系统提供了一个恢复机制,提供了两个回调函数。onSaveInstanceState(),onRestoreInstanceState(),第一个函数在onPause之后会被执行,而且是每次都会被执行,但是对于onRestoreInstanceState()只有在activity被重新创建之后,才会在onStart之后执行,所以在app开启到屏幕方向切换的过程中生命周期的变化为:
onCreate->onStart->onResume->onPause->onSaveInstanceState->onStop->onDestroy->onCreate->onStart->onRestoreInstanceState->onResume
在横竖过程中,前一个activity被销毁,又重新创建一个。
在横竖的变化中,不难发现的是,我们即使没有对其中的控件做任何处理,其仍然可以在状态切换之后,保持之前的状态,这个是如何实现的呢?在Activity被意外终结时,首先会去调用onSaveInstanceState()来保存数据,然后其会委托Window去保存数据,然后Window在委托其上层容器,ViewGroup,然后其通知哥哥子元素来保存各自的数据,到此view的数据保存完成。
资源相关配置有很多,比如屏幕大小发生变化,SIM卡发生变化,字体大小发生变化,这些变化都可能会导致出现activity重启,为了解决这个问题要采取的方式是,设置activity 的configChanges属性,然后添加相应的条件之后,就不会导致因为相关的配置的变化出现activity重启的现象。但是当变化发生的时候,将会有一个回调函数被执行。onConfigurationChanged()。

Activity启动规则

在讲启动规则之前,先要说几个概念。
任务栈:每一个应用在打开的时候,都会创建一个或者多个任务栈,里面是activity,每个activity有一个属性为taskAffinity,该属性用来制定其要处在的任务栈的名称标示,默认情况下,activity会继承application,而application则会以包名作为其标示。所以在监听一个应用是否被打开的时候,可以监听其任务栈的名称来判断一个应用是否当前被打开。

Activity四种启动模式

standard:该种模式下,无论当前的activity是否已经存在,都会重新启动一个,处在启动方的栈中,所以不可以在application的context下启动。
singleTop:该种模式下,如果当前任务栈中所要启动的activity位于栈顶,则不会重新启动,否则重新启动一个activity,采用该种方式,则会先暂停一下,调用onNewIntent,然后再调用onResume。
singleTask:该中模式下,会先去寻找其对应的任务栈,然后在其任务栈中,寻找是否存在该实例,如果不存在,则创建实例,如果存在,则将其置为栈顶,如果又在其上的,则将其清除,如果不存在任务栈,则创建一个任务栈,然后创建实例。
singleInstance:单独存放在一个栈中,当该模式启动的activity被创建后会单独处在一个栈中,然后该栈不会创建新的activity。
对于启动模式的设定,可以在xml文件中设置,同时也可以在启动的时候,通过addFlags的方式进行设定,两种方式的优先级为动态设置的优先级高。

Activity匹配规则

我们可以通过在activity中的IntentFilter标签中设置相应的过滤信息来唯一的标示确认一个activity,过滤信息有action,category,data,在我们平日里使用手机的时候,进行分享的时候,或者是选择某个应用打开某个文件的时候,都会出现一个应用列表来供我们选择,这个时候,其实是通过intent来打开某个activity的时候,匹配到的一些,过滤信息的匹配元素在匹配上拥有不同的规则。
action:一个intent中可以有多个action,但是只要其中一个和activity的相同,就可以匹配成功
data:过滤规则中的一个或多个和activity相同,才可以进行匹配。在设置的时候,通过setType和setData只能设置一个,因此需要通过setDataAndType,才可以同时对type和data进行,data由data和type。
category:可以不设置,但是如果设置了,其中的每一个都要和activity中对相匹配。

Activity任务栈

任务是一个Activity的集合,它使用栈的方式来管理其中的Activity,这个栈又被称为返回栈(back stack),栈中Activity的顺序就是按照它们被打开的顺序依次存放的。
手机的Home界面是大多数任务开始的地方,当用户在Home界面上点击了一个应用的图标时,这个应用的任务就会被转移到前台。如果这个应用目前并没有任何一个任务的话(说明这个应用最近没有被启动过),系统就会去创建一个新的任务,并且将该应用的主Activity放入到返回栈当中。

当一个Activity启动了另外一个Activity的时候,新的Activity就会被放置到返回栈的栈顶并将获得焦点。前一个Activity仍然保留在返回栈当中,但会处于停止状态。当用户按下Back键的时候,栈中最顶端的Activity会被移除掉,然后前一个Activity则会得重新回到最顶端的位置。返回栈中的Activity的顺序永远都不会发生改变,我们只能向栈顶添加Activity,或者将栈顶的Activity移除掉。因此,返回栈是一个典型的后进先出(last in, first out)的数据结构。

任务除了可以被转移到前台之外,当然也是可以被转移到后台的。当用户开启了一个新的任务,或者点击Home键回到主屏幕的时候,之前任务就会被转移到后台了。当任务处于后台状态的时候,返回栈中所有的Activity都会进入停止状态,但这些Activity在栈中的顺序都会原封不动地保留着。

接下来将会写一些关于Android中IPC相关的文章。


Jensen95
2.9k 声望534 粉丝

连续创业者。