Android四大组件详解

本文详细介绍了Android开发中的四大核心组件:Activity、Service、ContentProvider及BroadcastReceiver的功能特性、使用场景及实现方式。针对Activity的生命周期、横竖屏切换处理、启动模式等进行了深入探讨。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Android四大组件:Activity(活动)、Service(服务)、ContentProvider(内容提供者)、BroadCastReceiver(广播接收器)

    Activity(活动):一个显示用户界面并且提供用户交互的应用程序组件

    Service(服务):一个在后台执行的进行耗时操作的应用程序组件

    ContentProvider(内容提供者):一个用来暴露数据接口用于应用程序之间数据共享的应用程序组件

    BroadCastReceiver(广播接收器):一个用来进行组件之间消息异步传递的应用程序组件


二、Activity:

    1、生命周期:

       生命周期方法:onCreate() onStart() onRestart() onResume() onPause() onStop() onDestory()

       启动一个Activity:onCreate()--->onStart()--->onResume()

       销毁一个Activity:onPause()--->onStop()--->onDestory()

       当一个Activity(A)被另一个Activity(B)完全覆盖,则:A onPause()--->B onCreate()--->B onStart()--->B onResume()--->A onStop()。此时在栈(回退栈)中,B在A的上面。

       锁屏时:onPause()--->onStop()

       点击Home键退回后台时:onPause()--->onStop()

       从锁屏状态或者后台回到前台,onRestart()--->onStart()--->onResume()

    2、横竖屏切换:

         (1)由竖屏切换到横屏,生命周期变化为:onPause()--->onSaveInstanceState()--->onStop()--->

onDestroy()--->onCreate()--->onStart()--->onRestoreInstanceState()--->onResume()

           再由横屏切换到竖屏,则为:onPause()--->onSaveInstanceState()--->onStop()--->

onDestroy()--->onCreate()--->onStart()--->onRestoreInstanceState()--->onResume()

         (2)可以通过如下语句判断应用当前是处于竖屏状态还是横屏状态:

        if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)

        {

            //横屏

        } else if (getResources().getConfiguration().orientation== Configuration.ORIENTATION_PORTRAIT)

        {

            //竖屏

         }

         (3)进行横竖屏切换时,Activity会被销毁再重新创建,会重新载入布局,可以设置竖屏状态下和横屏状态下的布局(layout-land)。当然也可以阻止Activity被销毁再重新创建,通过1、在AndroidManifest文件中的对应Activity中配置android:configChanges="keyboardHidden|orientation|screenSize",最好这三个都配置,否则不能适配所有机型或sdk版本;2、在java代码中重载onConfigurationChanged(Configuration newConfig)这个方法。

         (4)也可以阻止横竖屏切换,通过在清单文件中对应的Activity下设置android:screenOrientation="portrait"(比如这就是只显示竖屏),或者在代码中设置也可以setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)(设置成横屏)

     3、Activity的启动模式:

       四种:standard、singleTop、singleTask、singleInstance

   standard:也就是标准的启动模式。每次激活一个Activity都会新建一个Activity对象,不管任务栈中是否存在一个相同的Activity都会新建。

      singleTop:如果Activity位于栈顶,并且设置成singleTop,那么若再次启动该Activity,则不会新建Activity实例

    singleTask:如果Activity被设置成singleTask,那么当启动该Activity时,会先去栈中找有无该Activity实例,如果有,则将该Activity上面的Activity弹出栈,如果没有,则仍然新建该Activity实例。

    singleInstance:新建一个回退栈来存储该Activity实例

   

    Activity的启动模式怎么设置:在清单文件中对应的Activity下

android:launchMode="singleTask"(比如设置成singleTask模式)


三、Service

   1、有两种服务:启动式服务和绑定式服务。通过startService方法启动的服务叫启动式服务,通过bindService方法启动的服务叫绑定式服务。

   2、启动式服务和绑定式服务的区别:(1)启动式服务无法与Activity之间进行通信,与现有的Activity分离,即使Activity被杀掉之后,Service还可以正常运行。(2)启动式服务既可以通过Activity中调用stopService()来结束,也可以通过自己调用stopself()来结束;而绑定式服务则只能通过Activity中调用unbindService()方法来结束

   3、IntentService与Service的关系:IntentService是Service的子类,IntentService采用工作线程处理请求对象,当服务中不是同时处理多个请求时适合使用IntentService。Service既可以同时处理多个请求也可以处理一个请求(可开启多个工作线程)

   4、Service既不是一个进程也不是一个线程


四、ContentProvider

   1、通常与ContentResolver(内容观察者)结合使用,ContentProvider用于暴露数据端,ContentResolver用于访问数据端。ContentProvider用于进程间访问。

   2、ContentProvider对外暴露数据接口,数据是以表格的形式暴露。ContentProvider暴露数据接口,数据可以

是文本数据、图片数据、数据库数据

     3、ContentProvider的使用:(1)在清单文件中注册(四大组件的使用都要在清单文件中注册)。

<application>

     <provider
            android:name="com.xxx.server.MyContentProvider"
            android:authorities="com.xxx.server"
            android:exported="true">

     </provider>
</applicaiton>

       (2)创建子类继承ContentProvider。重写onCreate()方法以及对共享数据操作的方法

query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder)

insert(Uri uri, ContentValues values)
update(Uri uri, ContentValues values, String selection,String[] selectionArgs)
delete(Uri uri, String selection, String[] selectionArgs)

       (3)客户端和服务端匹配成功的uri匹配成功码

private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    //客户端与服务端uri匹配成功码
    private static final int QUERY = 1;
    private static final int INERT = 2;
    private static final int UPDATE = 3;
    private static final int DELETE = 4;
    private static final int STATUS = 5;

    static {
        sURIMatcher.addURI("com.txy.anywhere", "query", QUERY);
        sURIMatcher.addURI("com.txy.anywhere", "insert", INERT);
        sURIMatcher.addURI("com.txy.anywhere", "update", UPDATE);
        sURIMatcher.addURI("com.txy.anywhere", "delete", DELETE);
        sURIMatcher.addURI("com.txy.anywhere", "status", STATUS);
        sURIMatcher.addURI("com.txy.anywhere", "insert", STATUS);
        sURIMatcher.addURI("com.txy.anywhere", "update", STATUS);
        sURIMatcher.addURI("com.txy.anywhere", "delete", STATUS);
    }


五、BroadCastReceiver

    BroadcastReceiver主要采用异步传播机制进行消息的发送和传递(组件之间消息传递),所谓的异步表示广播的发送方发送广播时只需要将广播进行标记发出,不需要等待接收方给出响应,可以继续进行下面的操作;默认情况下所有的组件(广播接收器)都有接收广播的能力,哪个组件想要接收该广播就可以注册与发送方一致的标记就可以接收处理广播。

    广播接收器相对于其他三个组件,是使用频率比较低的。关于广播接收器我们要掌握它的两种注册方式。

    静态注册:在AndroidManifest.xml文件中注册,<receiver>标签注册,然后是<intent-filter>,里面是<action />,action中注册与发送方一致的标记。静态注册的好处是,当程序关闭或者没有打开的时候,同样可以接收相关的广播。

    动态注册:在代码中注册,创建一个IntentFilter对象,设置想要接收的广播,在onCreate()方法中通过调用registerReceiver()方法来注册广播接收器,在onDestroy()方法中通过调用unregisterReceiver()方法来注销广播接收器。

### Android 四大组件详细介绍 #### 1. Activity 组件 Activity 是 Android 应用程序的一个核心组成部分,代表单个屏幕上的操作。每个应用程序通常由多个不相关的 Activity 构成。当启动某个应用程序时,会加载一个特定的 Activity 并显示其界面给用户。 - **生命周期**: 每个 `Activity` 都有一套完整的生命周期管理方法,如 `onCreate()`, `onStart()`, `onResume()` 等等。 - **交互特性**: 用户可以通过触摸屏或其他输入设备与当前活动窗口互动,完成各种功能需求。 ```java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } ``` #### 2. Service 组件 Service 运行在后台执行长时间运行的操作而不需要提供任何用户界面的应用逻辑单元。它可以用来播放音乐、处理网络事务或计算某些数值等耗时较长的任务。 - **两种模式**: - 使用 `startService()` 启动的服务会在任务完成后自动停止; - 而通过 `bindService()` 建立连接后,则需显式调用解绑函数才能结束服务实例[^1]。 - **IntentService 类型**: 提供了一种简化版的服务形式,专门用于异步处理来自客户端的一次性请求并立即关闭自己。 ```java // 定义一个简单的Service类 public class MyService extends Service { private final IBinder binder = new LocalBinder(); public class LocalBinder extends Binder { MyService getService() { return MyService.this; } } @Nullable @Override public IBinder onBind(Intent intent) { return binder; } // 实现具体业务逻辑... } ``` #### 3. BroadcastReceiver 组件 BroadcastReceiver 可以让应用监听系统范围内的广播消息,并作出响应。这些消息可能来自于操作系统本身或者其他正在运行的应用程序。 - **静态 vs 动态注册** - 在清单文件 (`AndroidManifest.xml`) 中声明为静态接收者; - 或是在代码里临时创建动态实例,在适当时候注销掉它[^3]。 - **工作流程**: 当接收到匹配过滤条件的消息时触发 `onReceive(Context context, Intent intent)` 方法。 ```java public class UnorderedReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Log.d("UnorderedReceiver", "Received broadcast with action: " + action); } } ``` #### 4. ContentProvider 组件 ContentProvider 主要负责管理和分享跨不同应用程序之间的数据资源。借助此机制,开发者能够安全有效地与其他应用交换信息而不必担心底层数据库结构等问题。 - **主要职责**: - 将本地存储的数据暴露出去以便外部查询; - 支持增删改查 (CRUD) 操作; - 对敏感字段实施权限控制措施。 - **实现步骤**: - 创建子类继承自 `ContentProvider`; - 注册到项目配置文件中; - 利用 `ContentResolver` 来获取所需记录集。 ```java public class CustomContentProvider extends ContentProvider { @Override public boolean onCreate() { // 初始化工作... return true; } @Override public Cursor query(Uri uri, ...) { // 执行查询语句... return null; } // 其他 CRUD 接口... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值