安卓 四大组件

复制代码

Activity的加载模式受启动Activity的Intent对象中设置的Flag和manifest文件中Activity的元素的特性值交互控制。

FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_CLEAR_TOP

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

FLAG_ACTIVITY_SINGLE_TOP

核心的特性有:

taskAffinity

launchMode

clearTaskOnLaunch

alwaysRetainTaskState

finishOnTaskLaunch

四种加载模式的区别 所属task的区别

一般情况下,“standard”和”singleTop”的activity的目标task,和收到的Intent的发送者在同一个task内,就相当于谁调用它,它就跟谁在同一个Task中。

除非Intent包括参数FLAG_ACTIVITY_NEW_任务。如果提供了FLAG _活动_新_ TASK参数,会启动到别的任务里。“singleTask”和” singleInstance”总是把要启动的活动作为一个任务的根元素,他们不会被启动到一个其他任务里。是否允许多个实例“standard”和“singleTop”可以被实例化多次,并且是可以存在于不同的任务中;这种实例化时一个任务可以包括一个activity的多个实例; “ singleTask“和”singleInstance“则限制只生成一个实例,并且是task的根元素。singleTop要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不创建新的实例。是否允许其它活动存在于本任务内“singleInstance”独占一个任务,其它活动不能存在那个任务里; 如果它启动了一个新的活动,不管新的活动的启动模式如何,新的活动都将会到别的任务里运行(如同加了FLAG 活动 NEW_TASK参数)。而另 三种模式,则可以和其它活动共存。是否每次都生成新实例

“standard”对于每一个启动Intent都会生成一个activity的新实例;

“singleTop”的activity如果在task的栈顶的话,则不生成新的该activity的实例,直接使用栈顶的实例,否则,生成该activity的实例。

“singleInstance”是其所在栈的唯一activity,它会每次都被重用。

“singleTask” 如果在栈顶,则接受intent,否则,该intent会被丢弃,但是该task仍会回到前台。

当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法,如果收到intent生成一个activity实例,那么用户可以通过back键回到上一个状态;如果是已经存在的一个activity来处理这个intent的话,用户不能通过按back键返回到这之前的状态。

———————————–

二、Service

service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。

Service是在一段不定的时间运行在后台,不和用户交互应用组件。每个Service必须在manifest中

通过来声明。可以通过contect.startservice和contect.bindserverice来启动。

Service和其他的应用组件一样,运行在进程的主线程中。这就是说如果service需要很多耗时或者阻塞的操作,需要在其子线程中实现。

启动service,根据onStartCommand的返回值不同,有两个附加的模式:

1、START_STICKY 用于显示启动和停止service。

2、START_NOT_STICKY或START_REDELIVER_INTENT用于有命令需要处理时才运行的模式。

服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。

1、 使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。

如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。

如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。

采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

2、使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。

onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。采用Context.bindService()方法启动服务时只能调用onUnbind()方法解除调用者与服务解除,服务结束时会调用的onDestroy()方法。拥有服务的进程具有较高的优先级1.如果service正在调用onCreate,onStartCommand或者onDestory方法,那么用于当前service的进程则变为前台进程以避免被杀死。2.如果当前服务已经被启动(start),拥有它的进程则比那些用户可见的进程优先级低一些,但是比那些不可见的进程更重要,这就意味着服务一般不会被杀死。3。如果客户端已经连接到service(bindService),那么拥有Service的进程则拥有最高的优先级,可以认为service是可见的。4.如果service可以使用startForeground(int,Notification)方法来将service设置为前台状态,那么系统就认为是对用户可见的,并不会在内存不足时被杀。如果有其他的应用组件作为服务,活动等运行在相同的进程中,那么将会增加该进程的重要性。本地服务1.不需和活动交互的本地服务2.本地服务和活动交互\ ———————–

三、Broadcast Receiver

是一个全局的监听器,属于Android四大组件之一

作用是监听 / 接收 应用 App 发出的广播消息,并 做出响应

应用场景为

1、Android不同组件间的通信

2、多线程通信

3、与Android系统在特定情况下的通信


四、Content Provider详解

ContentProvider(内容提供者)是Android中的四大组件之一。主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作。ContentProvider分为系统的和自定义的,系统的也就是例如联系人,图片等数据。

android中对数据操作包含有:

file, sqlite3, Preferences,ContectResolver与ContentProvider前三种数据操作方式都只是针对本应用内数据,程序不能通过这三种方法去操作别的应用内的数据。

android中提供ContectResolver与ContentProvider来操作别的应用程序的数据。

使用方式:

一个应用实现ContentProvider来提供内容给别的应用来操作,

一个应用通过ContentResolver来操作别的应用数据,当然在自己的应用中也可以。

1.ContentProvider

Android提供了一些主要数据类型的ContentProvider,比如音频、视频、图片和私人通讯录等。可在android.provider包下面找到一些Android提供的ContentProvider。通过获得这些ContentProvider可以查询它们包含的数据,当然前提是已获得适当的读取权限。

2.ContentResolver

当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,要获取ContentResolver对象,可以使用Context提供的getContentResolver()方法。

3.Uri

Uri指定了将要操作的ContentProvider,其实可以把一个Uri看作是一个网址,我们把Uri分为三部分。

第一部分是”content://”。可以看作是网址中的”http://”。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
学习之门**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

### Android 四大组件详解 Android 四大组件是构成 Android 应用程序的核心模块,它们各自承担着不同的职责,共同协作完成应用的完整功能。 #### Activity(活动) Activity 是 Android 应用中最常用的组件之一,它代表一个单独的屏幕,通常与用户交互。每个 Activity 都有一个与之关联的用户界面,用户可以通过该界面执行操作,例如填写表单、查看内容等。Activity 的生命周期由 Android 系统管理,开发者需要根据不同的生命周期状态实现相应的逻辑,例如保存和恢复数据。 #### Service(服务) Service 是一种可以在后台长时间运行的组件,它不提供用户界面。Service 通常用于执行耗时任务,例如播放音乐、下载文件、处理网络请求等。Service 可以分为两种类型:本地服务(Local Service)和远程服务(Remote Service)。本地服务通常用于应用程序内部的后台任务,而远程服务可以通过 AIDL(Android Interface Definition Language)与其他应用程序通信。 #### BroadcastReceiver(广播接收器) BroadcastReceiver 是用于接收广播消息的组件。广播消息可以来自系统(例如电池电量低、网络连接变化等)或其他应用程序。BroadcastReceiver 可以通过静态注册(在 AndroidManifest.xml 文件中声明)或动态注册(在代码中调用 `Context.registerReceiver()` 方法)来接收广播。当接收到广播时,系统会调用 `onReceive()` 方法,开发者可以在该方法中实现相应的处理逻辑。 #### ContentProvider(内容提供者) ContentProvider 是用于在不同应用程序之间共享数据的组件。它提供了一种标准化的接口,允许其他应用程序访问和操作其数据。ContentProvider 通常与 SQLite 数据库结合使用,但它也可以用于访问其他类型的数据源,例如文件或网络资源。ContentProvider 的核心方法包括 `query()`、`insert()`、`update()` 和 `delete()`,这些方法分别用于查询、插入、更新和删除数据。为了确保数据的安全性,ContentProvider 可以通过权限声明来控制对数据的访问。 ### 示例代码 以下是一个简单的示例,展示了如何在 Android 中启动一个新的 Activity: ```java Intent intent = new Intent(this, SecondActivity.class); startActivity(intent); ``` 以下是一个简单的 Service 示例,展示了如何在后台执行任务: ```java public class MyService extends Service { @Override public void onCreate() { super.onCreate(); // 初始化服务 } @Override public int onStartCommand(Intent intent, int flags, int startId) { // 执行后台任务 return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); // 清理资源 } @Override public IBinder onBind(Intent intent) { return null; } } ``` 以下是一个简单的 BroadcastReceiver 示例,展示了如何接收广播: ```java public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 处理广播消息 } } ``` 以下是一个简单的 ContentProvider 示例,展示了如何定义一个内容提供者: ```xml <provider android:name="com.example.MyContentProvider" android:authorities="com.example.provider" android:exported="true" /> ``` ### 相关问题 1. 如何在 Android 中实现两个 Activity 之间的数据传递? 2. 如何在 Android 中绑定一个 Service 并与其通信? 3. 如何在 Android 中发送和接收自定义广播? 4. 如何在 Android 中使用 ContentProvider 共享数据? 5. 如何管理 Activity 的生命周期以避免内存泄漏?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值