快速了解安卓四大组件

简介: Activity 活动Activity是用户操作的可视化界面,它为用户提供了一个完成操作指令的窗口。 需要在Activity创建时调用setContentView()来完成界面的显示,为用户提供交互的入口。

安卓四大组件分别为


Activity 活动


Activity是用户操作的可视化界面,它为用户提供了一个完成操作指令的窗口。 需要在Activity创建时调用setContentView()来完成界面的显示,为用户提供交互的入口。

1、通常一个Activity就是一个屏幕

2、Activity之间通过Intent进行通信

3、安卓中每一个Activity都需要在AndroidMainFest.xml文件中声明


Service  服务


Service(服务)是一个可以在后台执行长时间运行操作而没有用户界面的应用组件,即使当前应用被切换到后台,又或者用户打开了另一个App,服务仍然可以保持正常运行。

1、启动服务的Activity被销毁也不会影响服务的运行,只有当进程被关闭时,Service也会被关闭

2、服务并不会自己开启线程,所有的代码都是默认运行在主线程中,也就是说我们需要在服务的内部手动开启子线程,并在此执行耗时任务,否则就有可能出现主线程被阻塞的情况。


Service的两种形式


1、started(启动状态)

当应用组件(如 Activity)通过调用 startService() 启动服务时,服务即处于“启动”状态。一旦启动,服务即可在后台无限期运行,即使启动服务的组件已被销毁也不受影响,除非手动调用才能停止服务, 已启动的服务通常是执行单一操作,而且不会将结果返回给调用方。

2、bound(绑定状态)

当应用组件通过调用 bindService() 绑定到服务时,服务即处于“绑定”状态。绑定服务提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。 仅当与另一个应用组件绑定时,绑定服务才会运行。 多个组件可以同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。


Service在AndroidMainFest.xml中的声明

<service android:enabled=["true" | "false"]
    android:exported=["true" | "false"]
    android:icon="drawable resource"
    android:isolatedProcess=["true" | "false"]
    android:label="string resource"
    android:name="string"
    android:permission="string"
    android:process="string" >
    . . .
</service>

android:exported:代表是否能被其他应用隐式调用,其默认值是由service中有无intent-filter决定的,如果有intent-filter,默认值为true,否则为false。为false的情况下,即使有intent-filter匹配,也无法打开,即无法被其他应用隐式调用。

android:name:对应Service类名

android:permission:是权限声明

android:process:是否需要在单独的进程中运行,当设置为android:process=”:remote”时,代表Service在单独的进程中运行。注意“:”很重要,它的意思是指要在当前进程名称前面附加上当前的包名,所以“remote”和”:remote”不是同一个意思,前者的进程名称为:remote,而后者的进程名称为:App-packageName:remote。

android:isolatedProcess :设置 true 意味着,服务会在一个特殊的进程下运行,这个进程与系统其他进程分开且没有自己的权限。与其通信的唯一途径是通过服务的API(bind and start)。

android:enabled:是否可以被系统实例化,默认为 true,因为父标签也有enable属性,所以必须两个都为默认值 true 的情况下服务才会被激活,否则不会激活。


Content  Provider 内容提供者


ContentProvider 主要用于在不同的应用程序之间实现数据共享的功能。


它提供了一套完整的机制,允许一个程序访问另外一个程序的数据,同时还能保证被访问数据的安全性。目前使用 Content Provider 是 Android 实现跨进称共享数据的标准方式。

Content Provider 不同于 文件存储 和 ShardPreferences存储 全局可读写操作模式,它可以选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄漏的风险。


Content Provider 的用法一般有两种:


一。使用现有的内容提供器来读取和操作相应程序中的数据;

二。创建自己的内容提供器给我们程序的数据提供外部访问接口

如果一个应用程序通过内容提供器对其数据提供了外部访问接口,那么任何其他的应用程序就都可以对这部分数据进行访问。 例如:系统中自带的电话簿、短信、媒体库等

程序都提供了类似的访问接口,这就使得第三方应用程序可以充分的利用这部分数据来实现更好的功能。


Broadcast  Receiver  广播接收者


一、什么是BroadcastReceiver


BroadcastReceiver 是安卓系统中四大组件之一,在Android开发中,BroadcastReceiver的应用场景非常多,Android 广播分为两个角色:广播发送者、广播接收者。

1.1、作用

广播接收器用于响应来自其他应用程序或者系统的广播消息。

不同组件之间通信(包括应用内 / 不同应用之间)

与 Android 系统在特定情况下的通信(如当电话呼入时、网络可用时)

多线程通信

1.2、实现原理

Android中的广播使用了设计模式中的观察者模式:基于消息的发布/订阅事件模型。

模型中有3个角色:

消息订阅者(广播接收者)

消息发布者(广播发布者)

消息中心(AMS,即Activity Manager Service)

广播接收者通过 Binder机制在AMS注册

广播发送者通过 Binder 机制向AMS发送广播

AMS根据广播发送者要求,在已注册列表中,寻找合适的广播接收者(寻找依据:IntentFilter / Permission)

AMS将广播发送到合适的广播接收者相应的消息循环队列中;

广播接收者通过消息循环拿到此广播,并回调 onReceive()


二、创建广播接收器


广播接收器需要实现为BroadcastReceiver类的子类,并重写onReceive()方法来接收以Intent对象为参数的消息。

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("我是创建好的通知");
    }
}


三、注册广播接收器


广播接收器的注册分为两种:

静态注册
动态注册
3.1、静态注册
应用程序通过在AndroidManifest.xml中注册广播接收器来监听制定的广播意图。3.1.1 注册

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver android:name=".MyReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="com.tiger_test"
            tools:ignore="BatteryLife" />
    </intent-filter>
</receiver>

3.1.2、发送通知
在Activity 中新增一个发送通知的点击事件

    public void onClickStatic(View view) {
        System.out.println("MainActivity2.onClickStatic");
//        com.tiger_test 必须和清单文件中注册的保持一致
        Intent intent = new Intent();
        intent.setAction("com.tiger_test");
        intent.setPackage("com.traveleasy.activitydemo");
        sendBroadcast(intent);
    }

当点击通知发送按钮时,系统会自动实例化MyReceiver类,并注册到系统中。

静态注册是常驻广播,不受任何组件生命周期的影响

注意:由于自8.0以后隐式广播不能进行静态注册了,所以这里通过setPackage()指定应用程序响应广播。

3.2、动态注册

通过registerReceiver()注册广播监听  

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
//        在onCreate 中注册广播
        MyReceiver myReceiver = new MyReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction("com.tiger_test");
        registerReceiver(myReceiver, filter);
    }


触发通知

public void onClickStatic(View view) {
    //        com.tiger_test 必须和注册的保持一致
    Intent intent = new Intent();
    intent.setAction("com.tiger_test");
    sendBroadcast(intent);
}


在页面关闭时记得通过unregisterReceiver()注销广播监听,否则会因广播持有Activity引用导致内存泄露。

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(myReceiver);
}

运行结果

image.png

需要注意,在onReceive()不能执行耗时操作,onReceive()默认是在主线程中,进行耗时会阻塞主线程,如果非要执行耗时操作最好开启一个服务在服务中进行耗时操作,不建议开启线程来处理耗时操作,因为BroadCastReceiver的生命周期很短,可能在子线程结束前BroadCastReceiver已经退出,如果当BroadCastReceiver所在的进程结束,虽然该进程中可能有用户启动的新线程,但是由于该进程内没有活动的组件,系统会在内存紧张的时候,优先结束掉该进程,这就会导致BroadCastReceiver启动的子线程不能执行完。


四、系统广播


上面我们一起学习了自定义广播,下面我们一起来看一下Android 系统主要的系统广播类型。

事件常量    描述

android.intent.action.BATTERY_CHANGED    持久的广播,包含电池的充电状态,级别和其他信息。

android.intent.action.BATTERY_LOW    标识设备的低电量条件。

android.intent.action.BATTERY_OKAY    标识电池在电量低之后,现在已经好了。

android.intent.action.BOOT_COMPLETED    在系统完成启动后广播一次。

android.intent.action.BUG_REPORT    显示报告bug的活动。

android.intent.action.CALL    执行呼叫数据指定的某人。

android.intent.action.CALL_BUTTON    用户点击"呼叫"按钮打开拨号器或者其他拨号的合适界面。

android.intent.action.DATE_CHANGED    日期发生改变。

android.intent.action.REBOOT    设备重启。

总结

在BroadcastReceiver 中,广播的类型主要分为两大类


标注广播


标准广播是一种完全异步执行的广播,在广播发出之后,所有的BroadcastReceiver几乎在同一时刻收到这个广播消息,它们之间没有先后顺序,这种广播的效率较高,并且不能被拦截。


有序广播


有序广播是一种完全同步的广播,在广播发出后只能有一个BroadcastReceiver能接收到这个广播消息,当这个BroadcastReceiver中的逻辑执行完毕后,广播才能继续向下传递。所以这个广播是有顺序的,所以这种广播也是可以被拦截的,如果被拦截了后面的BroadCastReceiver则不能收到广播消息了。


相关文章
|
23天前
|
存储 设计模式 数据库
构建高效的安卓应用:探究Android Jetpack架构组件
【4月更文挑战第20天】 在移动开发的世界中,构建一个既高效又可维护的安卓应用是每个开发者追求的目标。随着Android Jetpack的推出,Google为开发者提供了一套高质量的库、工具和指南,以简化应用程序开发流程。本文将深入探讨Jetpack的核心组件之一——架构组件,并展示如何将其应用于实际项目中,以提升应用的响应性和稳定性。我们将通过分析这些组件的设计原则,以及它们如何协同工作,来揭示它们对于构建现代化安卓应用的重要性。
|
1月前
|
Android开发
Android四大组件详解2
Android四大组件详解
26 1
|
1月前
|
存储 监控 数据可视化
Android四大组件详解1
Android四大组件详解
42 0
|
3月前
|
设计模式 Android开发
[Android 四大组件] --- BroadcastReceiver
[Android 四大组件] --- BroadcastReceiver
35 0
|
5月前
|
数据库 Android开发
Android Studio开发之应用组件Application的讲解及实战(附源码,通过图书管理信息系统实战)
Android Studio开发之应用组件Application的讲解及实战(附源码,通过图书管理信息系统实战)
68 0
|
5月前
|
XML Java Android开发
Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信)
Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信)
107 0
|
4天前
|
Java 开发工具 Android开发
如何在Eclipse中查看Android源码或者第三方组件包源码(转)
如何在Eclipse中查看Android源码或者第三方组件包源码(转)
13 4
|
22天前
|
设计模式 前端开发 数据库
构建高效Android应用:使用Jetpack架构组件实现MVVM模式
【4月更文挑战第21天】 在移动开发领域,构建一个既健壮又易于维护的Android应用是每个开发者的目标。随着项目复杂度的增加,传统的MVP或MVC架构往往难以应对快速变化的市场需求和复杂的业务逻辑。本文将探讨如何利用Android Jetpack中的架构组件来实施MVVM(Model-View-ViewModel)设计模式,旨在提供一个更加模块化、可测试且易于管理的代码结构。通过具体案例分析,我们将展示如何使用LiveData, ViewModel, 和Repository来实现界面与业务逻辑的分离,以及如何利用Room数据库进行持久化存储。最终,你将获得一个响应迅速、可扩展且符合现代软件工
25 0
|
26天前
|
Android开发 开发者
什么是Android Jetpack,它包括哪些组件?
【4月更文挑战第17天】Android Jetpack是Google提供的一套工具集,助力开发者高效、稳定地开发Android应用。它包含架构、UI、行为和基础组件,简化了后台任务、导航和生命周期管理,使开发者能专注于创新。随着不断更新,如CameraX的推出,掌握Jetpack对开发者面试和工作至关重要。
22 0
|
29天前
|
存储 数据库 Android开发
使用Android Jetpack组件加速开发流程
【4月更文挑战第14天】Android Jetpack是为提升开发速度和代码质量而生的组件集合,包括`ViewModel`、`LiveData`、`RecyclerView`、`Room`、`WorkManager`等,它们遵循最新设计原则和最佳实践。例如,`RecyclerView`优化列表显示,`Room`简化数据库操作,`WorkManager`处理后台任务,`ViewModel`和`LiveData`分离业务和UI逻辑。此外,`Navigation`和`Paging`分别优化用户导航和数据加载。通过这些组件,开发者能更高效地构建高性能应用,值得学习和使用。