(一)应用程序的组成
1.Android应用程序概述:
Android应用程序是在Android应用框架之上,由一些系统自带和用户创建的应用程序组成。组件是可以调用的基本功能模块,Android应用程序就是由组件组成的,一个Android的应用程序通常包含4个核心组件和一个Intent,4个核心组件分别是:Activity、Service、BroadcaseReceiver和ContentProvider。
Android应用程序组件
|
1.1Activity组件 :
Activity是Android程序的呈现层,显示可视化的用户界面,并接收与用户交互所产生的界面事件,一个Android应用程序可以包含一个或多个Activity,其中一个作为main activity用于启动显示,一般在程序启动后会呈现一个Activity,用于提示用户程序已经正常启动。
Activity通过View管理用户界面UI。
在应用程序中,每一个Activity都是一个单独的类,继承实现了Activity基础父类,这个类通过它的方法设置并显示由Views组成的用户界面UI,并接受、响应与用户交互产生的界面事件,Activity通过startActivity或startActivityForResult启动另外的activity。
1.2Service组件 :
Service常用于没有用户界面,但需要长时间在后台运行的应用。与应用程序的其他模块(例如activity)一同运行于主线程中。一般通过startService或bindService方法创建Service,通过stopService或stopSelf方法终止Service。通常情况下,都在activity中启动和终止Service。
1.3Intent和IntentFilter组件:
Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。
通常Intent分为显式和隐式两类。显式的Intent,就是指定了组件名字的,是由程序指定具体的目标组件来处理,即在构造Intent对象时就指定接收者,指定了一个明确的组件(setComponent或setClass)来使用处理Intent。
例如:
Intent intent = new Intent(
getApplicationContext() ,
Test.class
);
startActivity(intent);
隐式的Intent,隐式的就是没有指定Intent的组件名字,没有制定明确的组件来处理该Intent,使用这种方式时,需要让Intent与应用中的IntentFilter描述表相匹配。需要Android根据Intent中的Action、data、Category等来解析匹配。
例如:
ntent intent = new Intent();
intent.setAction("test.intent.IntentTest");
startActivity(intent);
目标组件(Activity、Service、Broadcast Receiver)是通过设置他们的Intent Filter来界定其处理的Intent。如果一个组件没有定义Intent Filter,那么它只能接受处理显式的Intent,只有定义了Intent Filter的组件才能同时处理隐式和显式的Intent。
1.3.1 Intent对象
一个Intent对象包含了很多数据的信息,由六个部分组成:
Action——要执行的动作
Data——执行动作要操作的数据
Category——被执行动作的附加信息
Extras——其它所有附加信息的集合
Type——显式指定Intent的数据类型(MIME)
Component——指定Intent的的目标组件的类名称比如要执行的 动作,类别,数据,附加信息等等。
1)Action
一个Intent的Action在很大程度上说明这个Intent要做什么,是查看(View)、删除(Delete)、编辑(Edit)等等。
2)Data:其实就是一个URI,用于执行一个Action时所用到的数据的URI和MIME。
3)component(组件),指定Intent的的目标组件的类名称。通常 Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。
4)Category:Category指定了用于处理Intent的组件的类型信息,一个Intent可以添加多个Category,使用addCategory()方法即可,使用removeCategory()删除一个已经添加的类别。
5)Extras:有些用于处理Intent的目标组件需要一些额外的信息,那么就可以通过Intent的put..()方法把额外的信息塞入到Intent对象中,用于目标组件的使用,一个附件信息就是一个key-value的键值对。Intent有一系列的put和get方法用于处理附加信息的塞入和取出。
1.3.2IntentFilter:
应用程序的组件为了告诉Android自己能响应、处理哪些隐式Intent请求,可以声明一个甚至多个Intent Filter。每个Intent Filter描述该组件所能响应Intent请求的能力——组件希望接收什么类型的请求行为,什么类型的请求数据。
Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的。
1.4BroadcastReceiver组件 :
在Android中,Broadcast是一种广泛运用在应用程序之间传输信息的组件。而BroadcastReceiver是接受并响应广播消息的组件,对发送出来的 Broadcast进行过滤接受并响应,它不包含任何用户界面,可以通过启动Activity或者Notification通知用户接收到重要信息。
1.4.1BroadcastReceiver过滤接收的过程:
在需要发送信息时,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。
当Intent发送后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则调用BroadcastReceiver的onReceive()方法。因此在我们定义一个BroadcastReceiver时,通常都需要实现onReceive()方法。
1.4.2BroadcastReceiver注册有两种方式:
一种方式是,静态的在AndroidManifest.xml中用<receiver>标签声明注册,并在标签内用<intent- filter>标签设置过滤器。
另一种方式是,动态的在代码中先定义并设置好一个 IntentFilter对象,然后在需要注册的地方调 Context.registerReceiver()方法,如果取消时就调用Context.unregisterReceiver()方法。
1.5ContentProvider组件:
ContentProvider是Android系统提供的一种标准的共享数据的机制
对ContentProvider的使用,有两种方式:
ContentResolver访问
Context.getContentResolver()
(二)程序生命周期:
程序的生命周期是指在Android系统中进程从启动到终止的所有阶段,也就是Android程序启动到停止的全过程。程序的生命周期由Android系统进行调度和控制的。
Android系统中的进程分为:前台进程、可见进程、服务进程、后台进程、空进程。
Android系统中的进程优先级由高到低
2.1前台进程:
前台进程是Android系统中最重要的进程,是指与用户正在交互的进程,包含以下四种情况:
进程中的Activity正在与用户进行交互
进程服务被Activity调用,而且这个Activity正在与用户进行交互
进程服务正在执行声明周期中的回调方法,如onCreate()、 onStart()或onDestroy()
进程的BroadcastReceiver正在执行onReceive()方法
2.2、可见进程:
可见进程指部分程序界面能够被用户看见,但不在前台与用户交互,不响应界面事件的进程。如果一个进程包含服务,且这个服务正在被用户可见的Activity调用,此进程同样被视为可见进程。
2.3、服务进程:
服务进程是指包含已启动服务的进程,通常特点:
没有用户界面在后台长期运行
2.4、后台进程:
后台进程是指不包含任何已经启动的服务,而且没有任何用户可见的Activity的进程。
2.5、空进程:
空进程是指不包含任何活跃组件的进程,空进程在系统资源紧张时会被首先清除。
2.6、Service生命周期:
一个service的生命周期通常包含:创建、启动、销毁这几个过程。
Service只继承了onCreate(),onStart(),onDestroy()三个方法,当第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,需要注意的是,如果Service已经启动了,当再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法。
创建service的方式有两种,一种是通过startService创建,另外一种是通过bindService创建Service,两种创建方式的区别在于,startService是创建并启动service,而bindService只是创建了一个service实例并取得了一个与该service关联的binder对象,但没有启动它。
2.7BroadcastReceiver生命周期:
Android在接收到一个广播Intent之后,找到了处理该Intent的BroadcastReceiver,创建一个对象来处理Intent。然后,调用被创建的BroadcastReceiver对象的onReceive方法进行处理,然后就撤销这个对象。
2.8Activity生命周期:
1)Activity状态
在Activity生命周期中,其表现状态有四种,分别是:活动状态、暂停状态、停止状态和非活动状态。
在Activity生命周期中,其事件的回调方法有7个,以及Activity状态保存/恢复的事件回调方法有2个
Activity状态保存/恢复的事件回调方法
方法 |
是否 可终止 |
说明 |
onCreate() |
否 |
Activity启动后第一个被调用的函数,常用来进行Activity的初始化,例如创建View、绑定数据或恢复信息等。 |
onStart() |
否 |
当Activity显示在屏幕上时,该函数被调用。 |
onRestart() |
否 |
当Activity从停止状态进入活动状态前,调用该函数。 |
onResume() |
否 |
当Activity能够与用户交互,接受用户输入时,该函数被调用。此时的Activity位于Activity栈的栈顶。 |
onPause() |
是 |
当Activity进入暂停状态时,该函数被调用。一般用来保存持久的数据或释放占用的资源。 |
onStop() |
是 |
当Activity进入停止状态时,该函数被调用。 |
onDestroy() |
是 |
在Activity被终止前,即进入非活动状态前,该函数被调用。 |
onSaveInstanceState() |
否 |
Android系统因资源不足终止Activity前调用该函数,用以保存Activity的状态信息,供onRestoreInstanceState()或onCreate()恢复之用。 |
onRestoreInstanceState() |
否 |
恢复onSaveInstanceState()保存的Activity状态信息,在onStart()和onResume ()之间被调用。 |
Activity生命周期分类
Activity生命周期指Activity从启动到销毁的过程。Activity的生命周期可分为全生命周期、可视生命周期和活动生命周期。
1)全生命周期 2)可视生命周期 3)活动生命周期
Activity生命周期划分及事件回调方法的调用顺序
|
在活动生命周期中,关于onPause()和onSaveInstanceState()方法,它们之间的异同主要是:相同之处是这两个方法都可以用来保存界面的用户输入数据,区别在于:
onPause()一般用于保存持久性数据,并将数据保存在存储设备上的文件系统或数据库系统中。
onSaveInstanceState()主要用来保存动态的状态信息,信息一般保存在Bundle(保存多种格式数据的对象)中,系统在调用onRestoreInstanceState()和onCreate()时,会同样利用Bundle将数据传递给方法。