Android应用框架中的四个核心要点:活动(Activity)、消息(Intent)、视图(View)、任务(Task)
(一)活动Activity
Android系统内部有专门的Activity堆栈空间,用于存储多个Activity的运行状态。一般,系统会保证某一时刻只有最顶端的那个Activity是处于前端的活动(foreground)状态。当一个Activity启动并进入活动状态,调用顺序是onCreate、onStrat、onResume;退居后台的时候,调用顺序是onPause、onStop;重新回到活动状态的时候,调用顺序是onRestart、onStart、onResume;销毁过程中调用顺序是onPause、onStop、onDestroy。
所有的Activity必须在项目基础配置文件AndroidManifest.xml中声明,这样Activity才可以被Android应用框架所识别;如果不进行声明,运行时会抛出ActivityNotFoundException异常。
(二)消息Intent
在Android应用系统中,常常把Intent称为消息,实际上,Intent本身是一个对象,里面包含的是构成消息的内容和属性。主要有的属性为:
1、组件名称(ComponentName)
对Android系统来说,组件名称实际是一个ComponentName对象,用于指定Intent对应的目标组件,Intent对象可以通过setComponent、setClassName方法来进行设置。
2、动作(Action)
消息基类(Intent)中定义的动作常量(字符串常量),比较常见的有:
ACTION_MAIN(对应字符串android.intent.action.Main)表示应用的入口的初始化动作。
ACTION_EDIT(对应字符串android.intent.action.EDIT)表示常见的编辑动作。
ACTION_CALL(对应字符串android.intent.action.CALL)表示用于初始化电话模块动作。
Intent对象常使用setAction方法来设置。
3、数据(Data)
不同的动作对应不同的数据(Data)类型,比如
ACTION_EDIT动作可能对应的是用于编辑文档的URI;
ACTION_CALL动作则应该包含类似于tel:xxx的URI。
多数情况下,数据类型可以从URI的格式中获取,Intent也支持使用setData、setType方法来指定数据的URI以及数据类型。
4、类别(Category)
不同的动作由不同类别的Activity组件来处理,比如
CATEGORY_BROWSABLE,表示该Intent应该由浏览器组件来打开
CATEGORY_LAUNCHER,表示此Intent由应用初始化Activity来处理
CATEGORY_PREFERENCE,表示处理该Intent的应该是系统配置界面
消息对象(Intent)可以使用addCategory添加一种类型,而一个Intent对象也可以包含多种类型属性。
5、附加信息(Extras)
存储一些自定义的额外附加信息,一般来说,这些信息是使用键值对的方式存储的。可以使用putExtra方法设置附加信息,信息类型非常丰富(一般还是以字符串为主),在接受的时候使用getExtras方法获取。
6、标志(Flags)
标志用于指示Android系统如何去启动Activity以及启动之后如何处理。
(三)视图 View
视图(View)主管Android应用的界面外观显示,因此也称为Android UI系统,是Android应用框架中最重要的组成部分之一。在Activity中展示或者操作的几乎多有控件都属于View。
主要UI控件:
Button——普通按钮
CheckBox——多选框控件
EditText——编辑框控件
Gallery——图片集控件
GridView——格子显示控件
ImageButton——图片按钮
ImageView——图片控件
LinearLayout——线性布局
ListPopupWindow——弹出式多选框
ListView——列表控件
PopupMenu——弹出菜单
PopupWindow——弹出窗口
ProgressBar——进度条控件
RadioButton——单选框控件
RelativeLayout——绝对定位布局
ScrollView——滚动式列表
TableLayout——表格布局
TextView——文本框
Toast——弹出提示框
(四)任务 Task
任务的概念有点抽象,在日常编码过程中不会直接接触到。
对某个task来说,每次启动一个新的Activity,其都会被压入(push)到Activity堆栈的顶部,而每次按“Back”键,当前的Activity就会被弹出(pop)Activity堆栈。如果,按了“HOME”键,该Task会失去焦点并被保存在内存中,而一旦重新启动,Task会自动读出并显示上次所在的Activity界面。
对于多task来说,当所在的task任务A,运行到某个Activity n的时候,按了“HOME”键,则task A中的所有Activity都被停止了,同时task A暂时退居到后台。这是如果运行Task B,那么task B就被推到前台,并显示最上册的Activity。
另外,我们可以在Android基础配置文件(ManifestFile)中使用<Activity/>元素的launchMode属性来控制Activity在任务中的行为特征。launchMode有四种模式可以选择:
1、Standard模式:Standard模式为默认模式,无论是打开一个新的Activity,还是接受Intent消息,系统都会为这个Activity创建一个新的实例(instance);每个Activity都可以被实例化多次,并且每个任务否可以包含多个实例。常用,但最耗费系统资源。
2、singleTop模式:行为和Standard模式下的行为基本相同。如果该Activity正好在运行状态,那么其接收Intent消息就不需要重新创建实例,而是通过该类的onNewIntent()方法来处理接收到的消息。这在一定程度上会减少一些资源浪费。
3、singleTask模式:此模式保证该Activity在任务中只会有一个实例,并且必须存在于该Task的根元素(即栈底)。此模式比较节省资源,手机浏览器使用的就是这种模式。
4、singleInstance模式:和singleTask类似,但该模式保证Activity独占一个task,其他的Activity都不能存在于该任务的Activity堆栈中。当然,Activity接收Intent消息也是通过onNewIntent方法实现的。
通过设置Intent消息的flag标志来主动改变Activity的调用方式,比较常见的flag如下:
FLAG_ACTIVITY_NEW_TASK:在新的Task中启动目标Activity,表现行为和前面提到的singleTask模式下的行为一样。
FLAG_ACTIVITY_SINGLE_TOP:如果目标Activity正好位于堆栈的顶部,则系统不用新建Activity的实例并使用onNewIntent()方法来处理接收到的消息。表现行为和前面提到的singleTop模式下的行为一样。
FLAG_ACTIVITY_CLEAR_TOP:如果目标Activity的运行实例已经存在,使用此方法系统将会清除咪表Activity所处的堆栈上面的所有Activity实例。
转自:https://blog.csdn.net/qq_39419087/article/details/78831772