AI智能
改变未来

Android的基本组件(四大组件)——Android初探

Android应用通常由一个或者多个基本组件组成。Android应用常用的组件包括Activity、Service、BroadcastReceiver、ContentProvider等组件。下面将对他们进行进行较为简单的介绍。

1、Activity与View

之所以将Activity与View一起介绍,是因为我们初学时有时可能会将二者混淆。Activity是Android应用中负责与用户交互的组件,View组件是所有UI空间、容器控件的基类,View组件就是Android应用中实实在在看到得到部分。Activity只能通过setContentView(View)来显示指定组件,View组件需要放到容器组建中或者使用Activity将它显示出来。

如需要通过某个Activity把指定View显示出来,调用Activity中的setContentView() 方法即可,同时setContentView() 方法也可以接受一个布局管理资源的ID作为参数进行显示,例如下面的setContentView(R.layout.activity_main)。

[code]public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}}

实际上Activity就是Window的容器,Activity包含一个getWindow()方法,该方法返回该activity包含的窗口。如果Android应用不调用Activity中的setContentView() 来设置该窗口的显示内容,则该程序将会显示一个空窗口。

Activity为Android提供了可视化用户界面,如果该Android应用需要多个用户界面,则Android应用将可能会包含多个Activity,多个Activity组成Activity栈,当前活动的Activity位于栈顶。

Activity包含一个setTheme(int resid) 方法来设置其窗口风格(即主题)。例如我们希望窗口不显示ActionBar、以对话框形式显示窗口,都可以通过该方法实现。

2、Service

Service与Activity的地位是并列的,也是一个单独的组件,Service的区别在与它通常位于后台运行,一般不需要与用户交互,因此它没有图形界面。

与Activity组件需要继承Activity基类相似,Service组件需要继承Service的基类。一个Service运行起来后,它将拥有独立的声明周期,service组件通常用于为其他组件提供后台服务或者监控其他组件的运行状态。

3、BroadcastReceiver

BroadcastReceiver代表广播接收器,从代码实现角度看,它非常类似于事件编程中的监听器。与普通事件监听器不同点在于,普通事件监听器监听的事件是源于程序中的对象,而BroadcastReceiver监听的事件源是Android应用中的其他组件,相当于一个全局的事件监听器。

使用BroadcastReceiver较为简单,只需要实现自己的BroadcastReceiver子类,并重写onReceive(Context context, Intent intent)方法即可。通常由两种方式对BroadcastReceiver进行注册:

  • 在Java代码或者Kotlin中通过Context.registReceiver() 方法注册BroadcastReceiver
  • 在AndroidManifest.xml中使用<receiver … />方法注册

当其他组件通过sendBroadcast()、sendStickyBroadcast()或sendOrderedBroadcast()方法发送广播时,如果该BroadcastReceiver接收到“订阅”的intent,则onReceive(Context context, Intent intent)就会被触发。

4、ContentProvider

ContentProvider是Android系统中为多个应用程序之间(跨应用)的数据交换提供的一个标准。

当用户实现自己的ContentProvider时,需要实现如下抽象方法:即“增删改查”

  • insert(Uri , ContentValues): 向ContentProvider插入数据
  • delete(Uri , ContentValues): 删除ContentProvider中指定的数据
  • update(Uri , ContentValues , String , String[]): 更新ContentProvider中指定的数据
  • query(Uri , String[] , String , String[] , String): 从ContentProvider查询数据

通常与ContentProvider结合使用的是ContentResolver,一个应用程序使用ContentProvider暴露自己的数据,而另一个应用程序则通过ContentResolver来访问数据。

5、Intent与IntentFilter(非Android的应用组件)

Intent虽不是Android的组件,但它对于Android的作用却非常大——它是Android应用内不同组件之间通信的载体。当Android运行时需要连接不同组件时,通常就需要借助Intent来实现。

Intent可以启动一个应用中的另一个Activity,也可以启动一个Service组件,还可以发送一条广播消息,来触发系统中的BroadcastReceiver。即Activity、Service、BroadcastReceive三种组件之间通信都可以通过Intent作为载体,只是他们之间使用Intent的机制略有不同而已。

启动一个Activity时,可调用Context的startActivity(Intent intent)或者startActivityForResult(Intent intent , int requestCode)方法,这两种方法中的Intent参数封装了需要启动的目标Activity的信息。

当需要启动一个Service时,可调用Context的startService(Intent intent)或者bindService(Intent intent , ServiceConnection conn, int flag)方法,这两种方法中的Intent参数封装了需要启动的目标Service的信息。

当需要出发一个BroadcastReceiver时,可调用Context中的sendBroadcast(Intent intent)或者sendStickyBroadcast(Intent intent)或sendOrderedBroadcast(Intent intent , String receiverPermission)方法来发送广播消息,这三种方法中的Intent参数封装了需要触发的目标BroadcastReceiver的信息。

在某些资料中Intent被翻译为“意图”,当一个组件表示的Intent启动或者触发另一个组件的“意图”,可分为两类:

  • 显示Intent:明确指定需要启动或者触发的组件的类名。
  • 隐式Intent:只是指定需要启动或者触发的组件应该满足的条件。

对于显示Intent,Android系统无需对该Intent做任何解析,系统直接找到指定的目标组件,启动或者触发它即可。

对于隐式Intent,Android系统需要对该Intent进行解析,解析出它的条件,然后再去系统找到符合条件的组件,就启动或者触发它们。

对于系统是如何判断被调用的组件是否符合隐式Intent的,这里就需要靠IntentFilter来实现,被调用的组件可通过IntentFilter来声明自己所满足的条件——即声明自己到底能处理哪些隐式Intent。

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Android的基本组件(四大组件)——Android初探