Android基础知识总结

2018-10-04  本文已影响115人  满天星爱我

Activity

先附上图(来自官方文档)

activity_lifecycle.png

生命周期方法介绍:

Activity生命周期变化

Intent传递数据

使用Intent进行Activity跳转时,可以携带参数,将需要的数据传递给目标Activity,IntentputExtra(...)方法可
以传递基本数据和基本数据的数组,putExtras(...)方法可以传递对象,前提是对象需要实现序列化,即实现SerializableParcelable。例如:

Activity的启动模式

首先涉及到一个任务栈的概念,在Android中每启动一个Activity,该Activity就会被放入任务栈的栈顶,当在代码中调用finish方法或者按back键时,栈顶的Activity就会出栈,因此任务栈所遵循的原则就是先进后出,而每次启动一个Activity,无论之前是否已经启动过此Activity,系统都会实例化一个Activity,并把它放到栈顶,这样就造成了在任务栈中有多个相同的Activity实例,这样就比较浪费内存,为了解决这个问题,谷歌引入了启动模式这个概念,目前有四种启动模式(在清淡文件中指定launchMode属性):

standard、singleTop、singleTask、singleInstance

系统的默认启动模式,每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。在这种模式下,谁启动了这个Activity,那么这个Activity就会运行在启动它的那个Activity所在的栈中。

这种模式下,如果新的Activity已经位于任务栈的栈顶,那么此Activity将不会重新创建,而它的onNewIntent方法会被回调,通过此方法的参数我们可以取出当前请求的信息。另外需要注意的是:该ActivityonCreateonStart并不会被系统调用,因为它并没有发生改变。如果新的Activity不是位于栈顶,那么新的Activity仍会被重新创建。

这是一种单实例模式,在这种模式下,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,和singleTop一样,系统也会回调onNewIntent。当一个具有singleTask模式的Activity请求启动后,比如ActivityA,系统首先会寻找是否存在A想要的任务栈,如果不存在,就重新创建一个任务栈,然后创建A的实例后把A放到栈中。如果存在A所需的任务栈,这时要看A是否在栈中有实例存在,如果有实例存在,那么系统就会把A调到栈顶并调用它的onNewIntent方法,如果实例不存在,就创建A的实例并把A压入栈中。

这是一种加强后的singleTask模式,它除了具有singleTask模式的所有特性外,还加强了一点,那就是具有此种模式的Activity只能单独地位于一个任务栈中,换句话说,比如ActivityAsingleInstance模式,当A启动后,系统会为它创建一个新的任务栈,然后A独自在这个新的任务栈中,由于栈内复用的特性,后续的请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁了。

Intent的Flags

Activity数据的保存与恢复

OnSaveInstanceState

当Activity被系统异常杀死后,会调用onSaveInstanceState(Bundle outState)方法,此方法中有一个参数Bundle,开发者可以使用它来保存当前的临时数据,那么到底是什么情况下此方法会被调用呢?

此方法被调用会遵循一个原则,就是系统未经你同意时销毁你的Activity,一般会有如下几种情况:

OnRestaoreInstanceState

首先此方法和onSaveInstanceState方法不一定是成对出现的,
OnRestoreInstanceState被调用的前提是: Activity确实被销毁了,而仅仅是有这种可能的情况下,该方法并不会被调用。

例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity A的onRestoreInstanceState方法不会被执行

另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原。 还有onRestoreInstanceState在onstart之后执行。

应用被强杀,如何处理?

IntentFilter匹配规则

Fragment

先附上图

fragment_lifecycle

Activity&Fragment 关系图如下

activity&fragment

各生命周期方法介绍

将Fragment添加到Activity中有如下两种方式

Fragment与Activity交互方式

Fragment与Activity数据传递

Fragment管理与Fragment事务

ContentProvider

自定义ContentProvider

需要实现以下几个方法

UriMatcher 关联Uri和Code

使用它的addUri方法将Uri和Code关联到一起,外界通过Uri获取对应的Code,然后根据Code去访问对应的表

BroadCastReceiver

注册广播的两种方式

有序广播

发送广播的两种方法

通过代码Bundle bundle = getResultExtras(true)可以获取上一个接收者存入的数据。

Service

生命周期

注意
有一种特殊的情况,就是当同时以startService()bindService()两种方式开启服务时,在销毁此服务的时候需要同时调用stopService()unbindService()方法来停止服务。

onStartCommand返回值

如何保证Service不被杀死

Service 设置成 START_STICKY
service被杀死后会重启(等待5秒钟左右),重传intent,保证与重启前一样

提升Service优先级

提升Service进程优先级

onDestory方法里重启service

上一篇下一篇

猜你喜欢

热点阅读