大家好,这是我写的第一篇技术文章,写得不好,请各位谅解,小生会继续努力的!
首先,Android 重要组件包括:Activity(活动)、Service(服务)、Content Provider(数据源组件)、Broadcast Receiver(广播接收器)
Activity - 活动:
活动是程序与用户交互的窗口,是 Android 构造中最基本的一种。
它的功能就是:
1、构造界面;
作为用户交互的窗口,活动可用来构造界面,使用 setContentView() 方法可以将相关资源信息设置到内容区域中。
同时可以在活动中找到 layout 中的各种控件,可在活动中动态设置控件的内容等。
2、处理交互事件;
活动可处理用户与程序的交互事件,通过设置控件的监听来实现具体的交互。
它需要为保持各界面的状态,做很多持久化的事情。
每当一个新活动开始,以前的活动已停止,但系统会保持活动堆栈(“回栈”)。
Activity 生命周期:
图就不画了,搜索一下成堆。我就主要讲一下要点好了。生命周期不能乱用,一定要用到点上。以下是我的总结:
1、onCreate() - 主要使用初始化操作;
2、onStart() - 主要是用于保持显示给用户 UI 数据和资源;
3、onResume() - 一般用于数据恢复的操作;
4、onPause() - 用于保存数据;
5、onDestroy() - 用于释放资源。
注意:要生命周期方法要相对应来实现
onCreate() 对应 onDestroy() ;
onStart() 对应 onStop() ;
onResume() 对应 onPause() ;
Service - 服务:
Android为了屏蔽进程的概念,利用不同的组件[Activity、Service]来表示进程之间的通信。
服务是运行在后台的,它既不是进程,也不是线程,它是 Android 的一个组件,它没有界面。服务适用于长时间运行的应用功能。
可用于进程间通信,服务它可分为:本地服务、远程服务(AIDL),关于 AIDL 后续文章里会讲到。
注:服务它本身是在主线程中执行的,所以一般要开辟一个新线程。
有个好用的服务叫 IntentService, 它里面建立了有一个子线程。所以使用它就不必开启新线程了。
使用 IntentService 一般搭配的是广播,一个任务执行完,通过广播发送给活动来更新界面等。
服务的生命周期:
图也不画了,说个要点,
服务它有个混淆的概念就是: onBind() 和 onStartConmand()。
服务开始,会执行 onCreate() 跟活动一样方法只执行一次。每次 startService() 都会执行 onStartConmand() 方法。
使用服务的 onBind() 方法,可返回一个 Binder ,可实现个内部类提供 Service 给外部访问,外部就可以执行服务中的方法了。
- // 实例化 binder
- private IBinder binder = new LocalBinder();
- // 定义 binder
- class LocalBinder extends Binder{
- MyService1 getService(){
- Log.d(TAG, "LocalBinder");
- return MyService1.this;
- }
- }
- // 返回一个 binder
- @Override
- public IBinder onBind(Intent intent) {
- Log.d(TAG, "onBind");
- return binder;
- }
Content Provider - 数据源组件:
数据源组件并不包含特定的功能逻辑,而是负责为应用提供数据访问的接口。
它是 Android 第三方应用数据的访问方案,例如:你要访问手机中的联系人就需要通过数据源组件来访问。
它对外提供数据,实现它 需要重写六个方法: onCreate、query、getType、insert、delete、update
getType 是获得类型,MIME 类型 , 如果是目录则返回: "vnd.android.cursor.dir/" + PATH , 如果是具体内容则返回: "vnd.android.cursor.item/" + PATH
其他就像数据库操作一样,不用多讲。
使用它的好处就是可以屏蔽内部数据的存储细节,向外提供统一的接口模型。这样外部访问时,就直接使用 ContentResolver 来访问。
Broadcast Receiver - 广播接收器:
广播接收器接收一种或多种 Intent 作触发的事件,它用于监听各种系统或系统中其他应用发生的事件,做出响应。
它的注册,可分为动态注册和静态注册,所谓动态就是通过 Context.registerReceiver 来注册,通过 Context.unregisterReceiver 来解除注册;
而静态注册就是讲广播接收器的相关信息写在配置文件中。
静态注册这种方式的注册不是常驻型的,也就是说当应用关闭后,如果有广播信息传来,Receiver也会被系统调用而自动运行。
动态注册是常驻型,也是常用的方式,但注意,有注册就一定要有解除注册。不然会有系统异常。
以上四个重要组件,除了接收器可以动态注册以外,其他三个都必须在配置文件中注册。
同时要注意的是:所有组件都是在主线程中运行的,所以如果有耗时操作,一定要开辟新线程来执行,不然会 ANR 。
Service 的话,如果是执行简单的事情,可使用 IntentService - 这个里面已经提供了子线程,所以就不需要开辟线程了,能够更方便的使用。
但是要注意的就是 IntentService 的生命周期跟普通 Service 的生命周期不同。