「第四届青训营 -客户端&Android基础场」笔记创作活动的第2天(一切内容仅供参考)
Android组件分为:
- 基础组件
- 界面组件
- 服务组件:
- 广播组件
- 数据组件
- 通信组件
- Handler
- Binder
一、基础组件
1.1 界面组件
Activity
Activity是Android最基本的四大组件之一。它主要是用于展示数据,负责与用户交互的容器。Activity是每一位开发者必须掌握的知识点。
而想要创建Activity就需要我们在Android里面有一个清单文件它主要是用于Activity界面的创建或者其他权限的获取都需要在这个清单文件里获取。下面这个就是清单文件
Activity的创建
<activity
android:name=".MainActivity"
android:exported="true">
//用来接收系统的启动请求,也就是第一个界面的展示
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
//第二个Activity
<activity
android:name=".MainActivity2"
android:exported="false" />
Activity的生命周期
-
onCreate():Activity创建时候调用。生命周期第一个方法,一般在这创建视图和绑定数据。 -
onStart():表示Activity已经启动,即将进入前台。 -
onResume():表示Activity处于可交互状态,位于Activity栈顶。 -
onPause():当Activity失去焦点或暂停时调用,一般情况下onStop方法会紧接着被回调。 -
onStop():此时Activity不可见,仅在后台运行下一个回调是onRestart()或onDestory()。 -
onRestart():一个未被销毁的Activity重新显示出来回调这个方法。一般是调用顺序会是:onRestart()->onStart()->onResume() -
onDestory():Activity正在被销毁,释放该Activity的所以资源。 -
onSavelnstanceState():在非正常关闭时回调,用于保存数据,不支持持久化数据。 -
onRestorelnstanceState()/onCreate():用于恢复数据。
打开页面顺序为:1-2-3;
关闭页面顺序为:4-5-6;
1为部分遮挡;
2为遮挡恢复;
1为页面被其它页面全部遮挡了
234表示被遮挡的页面恢复了
Acticity的启动模式
1.standard:系统默认的启动模式,栈结构,先进后出,打开一个activity入栈,再打开下个activity,接着入栈,我们平时直接创建的Activity都是这种模式的Activity。 这种模式的Activity的特点是:只要你创建了Activity实例,一旦激活该Activity,则会向任务栈中加入新创建的实例,退出Activity则会在任务栈中销毁该实例。
2.singleTop:如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例;
3.singleTask: 如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,不允许同一个栈内重复创建;
4.singleInstance: 如果我们将某个activity设置成这个singleStance启动模式,则当激活这个activity之后单独放到一个栈,下次再使用的时候,直接使用这个栈,比如打电话应用就是一个singleStance模式启动的activity,它是整个系统都不允许重复的。
Fragment碎片化
Fragment是Android3.0后引入的一个新的API,他出现的初衷是为了适应大屏幕的平板电脑,而且我们普通手机开发也会加入这个Fragment, 我们可以把它看成一个小型的Activity,又称Activity片段,它可以在一个 Activity 中组合多个片段,从而构建多窗格界面;也可以在多个 Activity 中重复使用某个片段。
Fragment的生命周期
-
onAttach():Fragment和Activity建立关联时调用。 -
onCreateView():当Fragment创建视图时调用。 -
onActivityCreated():Activity的onCreate()方法已返回时调用。 -
onDestroyView():当Fragment中的视图被移除时调用。 -
onDetach():Fragment和Activity取消关联时调用。
1.2 服务组件 : Service
Service
Service是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件。即使应用被销毁也依然可以工作的。它有两种状态:
-
Started: 当Android的应用程序组件,如活动,通过startService()启动了服务,则服务是Started状态。一旦启动,服务可以在后台无限期运行,即使启动它的组件已经被销毁。已经启动的服务通常执行单一操作,而且不会将结果返回给调用方。例如,它可能通过网络下载或者上传文件。当它操作完成后,服务会自动停止运行。 -
Bound: 当Android的应用程序组件通过bindService()绑定了服务,则服务是Bound状态。Bound状态的服务提供了一个客户服务器接口来允许组件与服务进行交互,如发送请求,获取结果,甚至通过IPC来进行跨进程通信.
当然Service也是有生命周期的它可以通过实现监控服务状态的变化,在合适的阶段执行工作。下面左是当服务通过startService()被创建时的生命周期,右则是显示了当服务通过bindService()被创建时的生命周期;
Service (与Activity通信)
- 定义Binder子类,并实现getService)方法,返回Service对象。
- 实现服务类onBind(方法,返向上述Binder对象) 。
- 实例化ServiceConnection对象,实现onServiceConnected()方法,从中获叹到Service实例
- Activity中调用bindService)方法。并传递步苹3的服务连接对象,将流程跑起来
- 活动既可以通过调用服务实例中的方法进行直接通信。
1.3 广播组件 : Broadcast
广播接收器主要是用来接收广播设备来自其他应用程序的响应或者系统的广播有时被称为事件并可以知道这些消息。例如,用于广播的数据可以用于,应用程序已经被下载到其他应用程序的设备上,让其他应用程序的设备已经被下载到。这样广播接收器可以定义适当的动作来阻止这些通信。
Broadcast(基本用法)
静态广播
1. 注册广播接收器: 需要在Android的文件清单下的 <application/> 标签里面添加
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED">
</action>
</intent-filter>
2. 创建广播接收器:
需要建立相对应的类,并且需要重写`onReceive()`方法来接收Intent参数对象
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//参数1:表示上下文关系;参数2:表示要展示的文本;参数3:表示展示的时间;最后一定要.show()不然它是不会展示出来的。
Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
}
}
1.4 数据组件 : ContentProvider
ContentProvider 又叫内容提供者,是`Android`四大组件之一,基于 `Android`中的`Binder`机制实现。主要应用于进程间数据传输。
它可以通过请求从一个应用程序向其他的应用程序提供数据。这些请求由类 ContentResolver 的方法来处理。
内容提供者可以使用不同的方式来存储数据。数据可以被存放在数据库,文件,甚至是网络.
创建内容提供者:
- 首先,你需要继承类 ContentProviderbase 来创建一个内容提供者类。
- 其次,你需要定义用于访问内容的你的内容提供者URI地址。
- 接下来,你需要创建数据库来保存内容。通常,Android 使用 SQLite 数据库,并在框架中重写 onCreate() 方法来使用 SQLiteOpenHelper 的方法创建或者打开提供者的数据库。当你的应用程序被启动,它的每个内容提供者的 onCreate() 方法将在应用程序主线程中被调用。
- 最后,使用<provider.../>标签在 AndroidManifest.xml 中注册内容提供者。
以下是详细的介绍了ContentProvider的使用以及创建。
二、Android通信组件
2.1 Handler
`Handler`是一套 Android 消息传递机制,主要用于线程间通信。
`Handler`其实就是主线程在起了一个子线程,子线程运行并生成Message,Looper获取message并传递给Handler,Handler逐个获取子线程中的Message.
可以说只要有异步线程与主线程通信的地方就一定会有`Handler`。
在多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 UI主线程,从而实现 工作线程对UI的更新处理,最终实现异步消息的处理。
消息机制的模型:
- Message:需要传递的消息,可以传递数据;
- MessageQueue:消息队列,但是它的内部实现并不是用的队列,实际上是通过一个单链表的数据结构来维护消息列表,因为单链表在插入和删除上比较有优势。主要功能向消息池投递消息(MessageQueue.enqueueMessage)和取走消息池的消息(MessageQueue.next);
- Handler:消息辅助类,主要功能向消息池发送各种消息事件(Handler.sendMessage)和处理相应消息事件(Handler.handleMessage);
- Looper:不断循环执行(Looper.loop),从MessageQueue中读取消息,按分发机制将消息分发给目标处理者。
Handler接收的实现:
private Handler handler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
//msg.what就是返回的值,可以自定义
if(msg.what==1){
//就是接收返回的数据类型可以是arg,也可以是obj
text.setText(msg.obj.toString());
}
super.handleMessage(msg);
}
//通过在你需要接收的消息类或组件中添加然后在`Handler`那里更新UI线程
Message msg = handler.obtainMessage();
msg.what = 1;//GET_STRING;
msg.obj = string;
handler.sendMessage(msg);
2.2 : Binder
Binder 是一种进程间通信机制,基于开源的 OpenBinder 实现;OpenBinder 起初由 Be Inc. 开发,后由 Plam Inc. 接手。
1.从IPC角度来说:Binder是Android中的一种跨进程通信方式,该通信方式在linux中没有,是Android独有;
2.从Android Driver层:Binder还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder;
3.从Android Native层:Binder是创建Service Manager以及BpBinder/BBinder模型,搭建与binder驱动的桥梁;
4.从Android Framework层:Binder是各种Manager(ActivityManager、WindowManager等)和相应xxxManagerService的桥梁;
5.从Android APP层:Binder是客户端和服务端进行通信的媒介,当bindService的时候,服务端会返回一个包含了服务端业务调用的 Binder对象,通过这个Binder对象,客户端就可以获取服务端提供的服务或者数据,这里的服务包括普通服务和基于AIDL的服务。