[Android]四大组件简介

打印 上一主题 下一主题

主题 973|帖子 973|积分 2919

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在 Android 开发中,“四大组件”(Four Major Components)是指构成 Android 应用程序的四种焦点组件,它们通过各自的方式与体系交互,实现应用的多样功能。这些组件是:Activity、Service、Broadcast Receiver 和 Content Provider。每个组件都扮演着不同的角色,并且通过各自的生命周期、方法和目的与 Android 操纵体系交互。
一、Activity

在 Android 应用中,Activity 是一个非常焦点的组件,用于表示应用的一个单一屏幕,是用户与应用交互的主界面。每个 Activity 提供一个窗口,用于绘制界面和接收与用户的交互变乱。理解 Activity 的创建、生命周期和其根本用法对于开发 Android 应用至关重要。
根本概念

一个 Android 应用通常由多个 Activity 组成,每个 Activity 都是一个独立的界面。当你打开一个应用,如邮箱应用,你看到的邮箱列表、邮件详情、写邮件等各个界面,通常都是不同的 Activity。
生命周期

Activity 的生命周期是其最重要的特性之一。Android 提供了一系列的回调方法来管理 Activity 的状态,包括用户开始利用 Activity、Activity 进入前台或后台,以及 Activity 被体系烧毁的时候。
下面是 Activity 生命周期的主要方法:


  • onCreate(Bundle savedInstanceState): 当 Activity 被创建时调用。这是初始化界面、成员变量等的地方。
  • onStart(): 当 Activity 对用户可见时调用。
  • onResume(): 当 Activity 准备好与用户交互时调用,此时 Activity 位于前台。
  • onPause(): 当体系即将启动或恢复另一个 Activity 时调用。用于生存数据或开释资源。
  • onStop(): 当 Activity 不再对用户可见时调用。
  • onDestroy(): 当 Activity 即将被烧毁时调用。

示例代码

  1. import android.os.Bundle
  2. import androidx.appcompat.app.AppCompatActivity
  3. class MainActivity : AppCompatActivity() {
  4.    
  5.     // 当 Activity 被创建时调用
  6.     override fun onCreate(savedInstanceState: Bundle?) {
  7.         super.onCreate(savedInstanceState)
  8.         // 设置 Activity 的布局文件
  9.         setContentView(R.layout.activity_main)
  10.         // 进行初始化操作,比如从 Bundle 恢复数据
  11.         if (savedInstanceState != null) {
  12.             val savedValue = savedInstanceState.getString("key")
  13.             // 使用恢复的数据
  14.         }
  15.     }
  16.     // 当 Activity 开始对用户可见时调用
  17.     override fun onStart() {
  18.         super.onStart()
  19.     }
  20.     // 当 Activity 准备好与用户交互时调用
  21.     override fun onResume() {
  22.         super.onResume()
  23.     }
  24.     // 当 Activity 即将停止与用户交互时调用
  25.     override fun onPause() {
  26.         super.onPause()
  27.         // 保存数据或释放资源
  28.     }
  29.     // 当 Activity 不再完全可见时调用
  30.     override fun onStop() {
  31.         super.onStop()
  32.     }
  33.     // 当 Activity 即将被销毁时调用
  34.     override fun onDestroy() {
  35.         super.onDestroy()
  36.     }
  37.     // 保存 Activity 状态
  38.     override fun onSaveInstanceState(outState: Bundle) {
  39.         super.onSaveInstanceState(outState)
  40.         outState.putString("key", "value")
  41.     }
  42. }
复制代码
留意事项


  • 管理资源:由于 Android 设备的资源有限,合理管理 Activity 的资源非常重要。比方,在 onPause() 或 onStop() 中开释那些不需要的资源。
  • 状态生存与恢复:Android 体系大概由于资源不足等原因随时终止 Activity。因此,在 onSaveInstanceState(Bundle outState) 中生存重要状态,并在 onCreate(Bundle savedInstanceState) 中恢复状态是很重要的。
  • 用户界面响应:包管 Activity 响应用户的操纵,避免在主线程(UI线程)进行耗时操纵,这样可以防止应用界面冻结。

二、Service

在 Android 开发中,Service 是一种用于在后台实验长时间运行的任务而不提供用户界面的应用组件。Service 可以在应用的前台大概后台实验任务,即利用户离开了应用。服务是用来处理不需要与用户交互而需要恒久运行的操纵,比方在后台播放音乐、实验文件下载等。
根本范例

Service 主要有两种情势:

  • 前台服务(Foreground Service):前台服务显示一个持续的通知,这意味着用户清晰地知道正在运行的服务。这种服务用于用户积极到场的任务(如播放音乐)或对用户很重要的任务(如文件下载)。
  • 后台服务(Background Service):在应用不在屏幕上显示时实验的服务。从 Android Oreo(8.0)开始,后台服务的运行受到了严酷限制以优化应用对设备电池生命的影响。
生命周期方法

Service 有自己的生命周期方法,用于管理其创建、启动、绑定和烧毁过程:


  • onCreate(): 服务创建时调用。
  • onStartCommand(Intent intent, int flags, int startId): 每次通过 startService() 方法启动服务时调用。
  • onBind(Intent intent): 当其他组件想要与服务绑定时调用,需要返回一个 IBinder 对象,通过该对象组件可以与服务进行通信。
  • onUnbind(Intent intent): 当所有组件都与服务解除绑定时调用。
  • onDestroy(): 服务烧毁之前调用。
示例代码

下面是一个简单的服务示例,该服务在后台记载日志。
  1. import android.app.Service
  2. import android.content.Intent
  3. import android.os.IBinder
  4. import android.util.Log
  5. class MyService : Service() {
  6.     // 当服务被创建时调用
  7.     override fun onCreate() {
  8.         super.onCreate()
  9.         Log.d("MyService", "服务已创建")
  10.     }
  11.     // 每次服务启动时调用
  12.     override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
  13.         Log.d("MyService", "服务正在运行")
  14.         // 如果我们希望服务在终止后重启,则返回 START_STICKY
  15.         return START_STICKY
  16.     }
  17.     // 当服务被销毁时调用
  18.     override fun onDestroy() {
  19.         super.onDestroy()
  20.         Log.d("MyService", "服务已销毁")
  21.     }
  22.     // 当其他组件想要绑定服务时调用
  23.     override fun onBind(intent: Intent): IBinder? {
  24.         // 本示例不提供绑定功能,因此返回 null
  25.         return null
  26.     }
  27. }
复制代码
在 AndroidManifest.xml 中注册服务

要使服务能够运行,必须在应用的 AndroidManifest.xml 文件中进行声明:
  1. <application
  2.     ...>
  3.     <service android:name=".MyService" />
  4. </application>
复制代码
启动和停止服务

你可以从 Activity 或其他组件中启动和停止服务。
  1. val intent = Intent(this, MyService::class.java)
  2. startService(intent)  // 启动服务
  3. stopService(intent)   // 停止服务
复制代码
留意事项



  • 资源管理:服务可以无穷运行,但这大概消耗大量的电池和盘算资源。确保服务不会无谓地消耗资源。
  • 服务和线程:服务运行在应用的主线程中,因此假如在服务中实验耗时操纵,需要手动创建新线程来处理这些操纵,以避免壅闭主线程。
  • 服务的实用场景:在思量利用服务之前,评估是否真的需要服务。对于简单的、短暂的后台操纵,可以思量利用 WorkManager 或 AlarmManager。

三、Broadcast Receiver

在 Android 中,Broadcast Receiver(简称广播接收器)是一个用来处理来自体系或应用发出的广播通知的组件。它可以对诸如设备启动完成、电池电量变革、短信接收等体系变乱做出响应,也可以接收应用自界说的广播消息。
根本概念

广播接收器主要用于监听和响应广播消息。广播可以是体系广播(比如网络状态改变、屏幕关闭等),也可以是应用程序发送的广播。广播接收器自己没有用户界面,但它可以启动一个活动或服务来响应接收到的信息。
生命周期和范例

广播接收器不像 Activity 或 Service 那样拥有完整的生命周期。它只有一个回调方法 onReceive(Context context, Intent intent),当接收到广播时被调用。广播接收器的范例分为两种:


  • 静态注册:在 AndroidManifest.xml 中注册。即使应用没有运行,只要变乱发生,体系就会创建广播接收器的实例并调用它。
  • 动态注册:在代码中注册,通常在 Activity 或 Service 中注册。它只在其宿主组件(如 Activity)存在时活泼。
示例代码

下面是一个静态注册的广播接收器,用于接收设备启动完成后的广播:
AndroidManifest.xml:
  1. <application ... >
  2.     <receiver android:name=".BootCompletedReceiver">
  3.         <intent-filter>
  4.             <action android:name="android.intent.action.BOOT_COMPLETED" />
  5.         </intent-filter>
  6.     </receiver>
  7. </application>
复制代码
BootCompletedReceiver.kt:
  1. import android.content.BroadcastReceiver
  2. import android.content.Context
  3. import android.content.Intent
  4. import android.widget.Toast
  5. class BootCompletedReceiver : BroadcastReceiver() {
  6.     override fun onReceive(context: Context, intent: Intent) {
  7.         // 确认接收到的是设备启动完成的广播
  8.         if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
  9.             Toast.makeText(context, "设备启动完成!", Toast.LENGTH_LONG).show()
  10.             // 可以在这里启动一个服务或进行其他操作
  11.         }
  12.     }
  13. }
复制代码
下面是动态注册的广播接收器示例,用于在 Activity 中监听网络变革:
MainActivity.kt:
  1. import android.content.BroadcastReceiver
  2. import android.content.Context
  3. import android.content.Intent
  4. import android.content.IntentFilter
  5. import android.net.ConnectivityManager
  6. import android.os.Bundle
  7. import androidx.appcompat.app.AppCompatActivity
  8. class MainActivity : AppCompatActivity() {
  9.     private lateinit var networkChangeReceiver: BroadcastReceiver
  10.     override fun onCreate(savedInstanceState: Bundle?) {
  11.         super.onCreate(savedInstanceState)
  12.         setContentView(R.layout.activity_main)
  13.         // 初始化广播接收器
  14.         networkChangeReceiver = object : BroadcastReceiver() {
  15.             override fun onReceive(context: Context, intent: Intent) {
  16.                 // 检查网络状态变化
  17.                 Toast.makeText(context, "网络状态变化", Toast.LENGTH_SHORT).show()
  18.             }
  19.         }
  20.         // 注册接收器监听网络变化
  21.         IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION).also {
  22.             registerReceiver(networkChangeReceiver, it)
  23.         }
  24.     }
  25.     override fun onDestroy() {
  26.         super.onDestroy()
  27.         // 动态注册的接收器必须要取消注册
  28.         unregisterReceiver(networkChangeReceiver)
  29.     }
  30. }
复制代码
留意事项



  • 性能和资源管理:广播接收器的 onReceive() 方法应该尽快完成,不要进行任何耗时操纵,以免壅闭主线程。若需要实验较长时间的任务,应该启动一个 Service。
  • 权限问题:接收某些体系广播大概需要声明相应的权限,比如接收开机广播需要声明 RECEIVE_BOOT_COMPLETED 权限。
  • 条件广播和有序广播:Android 提供了条件广播和有序广播两种方式。有序广播允许多个接收器按顺序接收到同一个广播,每个接收器可以终止广播,防止它传递给其他接收器。

四、Content Provider

在 Android 中,Content Provider 是四大组件之一,用于在不同应用程序之间共享数据。它提供了一种封装数据的方式,并通过一套标准的 API 在应用之间进行数据访问。通过利用 Content Provider,一个应用可以允许其他应用访问其数据,而不需要直接访问底层数据库或文件体系。
根本概念

Content Provider 管理对一个或多个数据源(如 SQLite 数据库)的访问,通过 URI(统一资源标识符)来袒露数据。每个 URI 可以指代 Content Provider 中的数据表或表内的特定数据行。通过这种方式,Content Provider 为数据访问提供了封装,并确保了数据访问的安全性。
焦点组件



  • URI: 每个 Content Provider 都通过一个唯一的 authority 来标识,该 authority 与 URI 结合利用,用来找到对应的 Content Provider。
  • ContentResolver: 提供了一组 API,允许应用查询或修改由 Content Provider 管理的数据。应用通过调用 ContentResolver 的方法,如 query(), insert(), delete(), 和 update() 来实验操纵。
创建一个 Content Provider

创建一个 Content Provider 通常包括以下几个步骤:

  • 扩展 ContentProvider 类:
    实现须要的方法:onCreate(), query(), insert(), delete(), 和 update()。
  • 在 AndroidManifest.xml 中声明:
    注册 Content Provider 并界说一个唯一的 authority。
  • 利用 URI 访问数据:
    界说息争析 URI 来访问 Content Provider 管理的数据。
示例代码

下面是一个简单的 Content Provider 实现示例:
MyContentProvider.kt:
  1. import android.content.ContentProvider
  2. import android.content.ContentValues
  3. import android.database.Cursor
  4. import android.net.Uri
  5. class MyContentProvider : ContentProvider() {
  6.     // 初始化内容提供者
  7.     override fun onCreate(): Boolean {
  8.         // 初始化数据源等
  9.         return true
  10.     }
  11.     // 查询数据
  12.     override fun query(
  13.         uri: Uri,
  14.         projection: Array<String>?,
  15.         selection: String?,
  16.         selectionArgs: Array<String>?,
  17.         sortOrder: String?
  18.     ): Cursor? {
  19.         // 根据 uri 查询数据
  20.         return null // 示例中返回 null,实际使用时返回查询结果的 Cursor
  21.     }
  22.     // 插入数据
  23.     override fun insert(uri: Uri, values: ContentValues?): Uri? {
  24.         // 插入数据到数据源
  25.         return null // 示例中返回 null,实际使用时返回新插入数据的 Uri
  26.     }
  27.     // 删除数据
  28.     override fun delete(uri: Uri, selection: String?, selectionArgs: Array<String>?): Int {
  29.         // 根据 uri 和条件删除数据
  30.         return 0 // 示例中返回 0,实际使用时返回被删除的行数
  31.     }
  32.     // 更新数据
  33.     override fun update(
  34.         uri: Uri,
  35.         values: ContentValues?,
  36.         selection: String?,
  37.         selectionArgs: Array<String>?
  38.     ): Int {
  39.         // 根据 uri 更新数据
  40.         return 0 // 示例中返回 0,实际使用时返回被更新的行数
  41.     }
  42.     // 返回 MIME 类型
  43.     override fun getType(uri: Uri): String? {
  44.         // 根据 uri 返回 MIME 类型
  45.         return null
  46.     }
  47. }
复制代码
AndroidManifest.xml:
  1. <application ... >
  2.     <provider
  3.         android:name=".MyContentProvider"
  4.         android:authorities="com.example.myapp.provider"
  5.         android:exported="true"
  6.     />
  7. </application>
复制代码
利用 Content Provider

其他应用可以通过 ContentResolver 访问 Content Provider:
  1. val contentResolver = getContentResolver()
  2. val uri = Uri.parse("content://com.example.myapp.provider/table_name")
  3. val cursor = contentResolver.query(uri, null, null, null, null)
复制代码
留意事项



  • 权限管理:确保在 AndroidManifest.xml 中配置符合的权限,以保护数据不被未授权访问。可以通过 android:exported 和 android:permission 控制对 Content Provider 的访问。
  • 线程安全:Content Provider 的方法大概会被多个线程同时调用,因此实现时需要思量线程安全。
  • 性能优化:由于 Content Provider 大概会频仍地进行数据库操纵,合理计划和优化数据库访问逻辑非常重要,以避免性能瓶颈。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表