参考资料:

  • 《疯狂 Android 讲义》
  • 《Android 编程权威指南》

Activity 和 View

  • Activity: Android 应用中负责与用户交互的组件。
  • View:所有 UI 控件、容器控件的基类,View 组件就是 Android 应用中用户实实在在看到的部分。但 View 组件需要放到容器组件中,或者使用 Activity 将它显示出来。如果需要通过某个 Activity 把指定 View 显示出来,调用 Activity 的 setContentView() 方法即可。

Service

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

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

BroadcastReceiver

顾名思义,BroadcastReceiver 代表广播消息接收器。从代码实现角度来看,BroadcastReceiver 非常类似于事件编程中的监听器。与普通事件监听器不同的是:普通事件监听器监听的事件源是程序中的对象;而 BroadcastReceiver 监听的事件源是 Android 应用中的其他组件。

使用 BroadcastReceiver 组件接收广播消息比较简单,开发者只要实现自己的 BroadcastReceiver 子类,并重写 onReceive(Context context, Intent intent) 方法即可。当其他组件通过 sendBroadcast()sendStickyBroadcast()sendOrderedBroadcast() 广播消息时,如该 BroadcastReceiver 也对该消息“感兴趣”(通过 IntentFilter 配置), BroadcastReceiver 的 onReceive(Context context, Intent intent) 方法将会被触发。

开发者实现了自己的 BroadcastReceiver 之后,通常有两种方式来注册这个系统级的“事件监听器”:

  • 在 Java 代码中通过 Context.registReceiver() 方法注册 BroadcastReceiver .
  • 在 AndroidManifest.xml 文件中使用 <receiver.../> 元素完成注册。

ContentProvider

Android 系统为跨应用的数据交换提供了一个标准:ContentProvider。当用户实现自己的 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 来访问数据。

Intent 和 IntentFilter

Intent 是 Android 应用内不同组件之间通信的载体。当 Android 运行时需要连接不同的组件时,通常就需要借助于 Intent 来实现。Intent 可以启动应用中另一个 Activity ,也可以启动一个 Service 组件,还可以发送一条广播消息来触发系统中的 BroadcastReceiver 。也就是说,Activity、Service、BroadcastReceiver 三种组件之间的通信都以 Intent 作为载体,只是不同组件使用 Intent 的机制略有区别而已。

  • 当需要启动一个 Activity 时,可调用 Context 的 startActivity(Intent intent)startActivityForResult(Intent intent, int requestCode) 方法,这两个方法中的 Intent 参数封装了需要启动的目标 Activity 的信息。
  • 当需要启动一个 Service 时,可调用 Context 的 startService(Intent intent) 方法或 bindService(Intent service, ServiceConnection conn, int flags) 方法,这两个方法中的 Intent 参数封装了需要启动的目标 Service 的信息。
  • 当需要触发一个 BroadcastReceiver 时,可调用 Context 的 sendBroadcast(Intent intent)sendStickyBroadcast()sendOrderedBroadcast() 来发送广播消息,这三个方法中的 Intent 参数封装了需要触发的目标 BroadcastReceiver 的信息。

权限

声明运行该应用本身需要的权限

通过为 <manifest.../> 元素添加 <uses-permission.../> 子元素即可为程序本身声明权限。例如在 <manifest.../> 元素里添加如下代码:

1
2
<!-- 声明该应用本身需要打电话的权限 -->
<uses-permission android:name="android.permission.CALL_PHONE"/>

声明调用该应用所需的权限

通过为应用的各组件元素,如 <activity.../> 元素添加 <uses-permission.../> 子元素即可声明调用该程序所需的权限。

例如在 <activity.../> 元素里添加如下代码:

1
2
<!-- 声明该应用本身需要发送短信的权限 -->
<uses-permission android:name="android.permission.SEND_SMS"/>

Android 中可以申请的权限类型参见 Android 系统中的权限

Comments