Android四大组件

Android四大组件

Activity(活动)

是android程序与用户交互的窗口,可以显示一些空间用于监听并处理用户的事件

生命周期

有四个状态、七个方法、两个异常

四个状态

Running:处于栈的最顶端,此时处于不可见并可和用户交互的激活状态

Paused:当Activity被另一个透明的或者Dialog样式的Activity覆盖时的状态,此时仍然可见,但失去了焦点,不可与用户交互

Stopped:Activity完全不可见,处于后台,但仍保留着当前状态和成员信息

Killed:当前界面被销毁,等待被系统回收

七个方法

onCreate():在Activity创建时调用。一般用来做一些初始化操作,如初始化布局setContentLayout()

onStart():在Activity即将显示界面时调用,但用户无法操作。一般也用于做一些初始化操作,但对于Activity而言,onCreate只执行一次,但onStart可执行多次。

onResume():在Activity获取焦点开始与用户交互时调用,此时Activity处于运行状态,位于栈顶。一般用于数据恢复、开启动画等

onPause():在当前Activity被其他Activity覆盖部分或锁屏时调用,此时Activity处于暂停状态,仍然可见,但失去焦点,不能与用户交互。一般用于关闭动画,注销广播等。并应进行状态保存与数据存储,但不适合做耗时操作。(为了让新的Activity尽快切换到前台)

onStop():在Activity对用户完全不可见时调用,此时Activity处于停止状态。此时进程优先级较低,当系统内存不足时,容易被杀死。一般用于进行资源回收。

onDestory():在Activity销毁时调用,常用于释放资源,Activity处于销毁状态后,将被清出内存。

onRestart():在Activity从停止状态再次启动时调用。onRestart一般是应用位于后台重新切换为前台调用,可用于进行数据刷新。其中onCreate() & onDestory()、onStart() & onStop()、onResume() & onPause()成对出现。

两个异常
更高优先级的进程需要内存,但系统内存不足

处于暂停或停止状态(低优先级)的Activity可能会被直接杀死

手动重启当前Activity–>onCreate()–>onStart()–>onResume()–>运行

系统配置发生改变导致Activity意外销毁(如横竖屏切换、键盘事件等)

运行–>onSaveInstanceState()–>onPause()–>onStop()–>onDestory()–>自动重启–>onCreate()–>onStart()–>onRestoreInstanceState()–>onResume()–>运行

在onSaveInstanceState()保存Activity状态,适合保存一些非持久数据,如布局状态、成员变量的值等,持久数据适合在onPause()和onStop()中通过数据库、sharedpreference保存

在onRestoreInstanceState()或onCreate()恢复Activity状态

参数传递

传递基本数据类型putExtra
传递多种数据类型Bundle
传递自定义对象,实现Serializable接口
startActivityForResult
使用EventBus插件传输数据量较大的数据
借助外部存储,如SharedPreference

启动过程

启动模式

standard(标准模式)

只要启动一次Activity,不管该实例是否存在,系统都会在当前任务栈中新建一个Activity实例并将该实例置于栈顶

singleTop(栈顶复用模式)

如果要启动的Activity已经处于栈的顶部,那么此时系统不会创建新的实例,而是复用栈顶的实例,同时它的onNewIntent()方法会被执行,我们可以通过Intent进行传值。否则会创建一个新的实例。
SingleTop适用于接受推送通知的内容显示页面,防止每点击一次通知重新打开重复页面。

singleTask(栈内复用模式)

首先会根据taskAffinity去寻找对应的任务栈:
1、如果不存在指定的任务栈,系统会新建对应的任务栈,并新建一个Activity实例压入栈中。
2、如果存在指定的任务栈,则会查找该任务栈中是否存在该Activity实例
a、如果不存在该实例,则会在该任务栈中新建一个Activity实例压入栈中。
b、如果存在该实例,则将任务栈中该Activity实例之上的所有Activity出栈并将所需Activity置于栈顶。
SingleTask这种启动模式最常使用的就是一个APP的首页,因为一般为一个APP的第一个页面,且长时间保留在栈中,所以最适合设置singleTask启动模式来复用。

singleInstance(单例模式)

拥有singleTask(栈内复用)所有特性外且该Activity实例单独占用一个任务栈,具有全局唯一性。该模式启动的activity在系统中是单例的。如果已存在,则将它所在的任务栈调度到前台,进行复用。
适用于与程序分开,具有独立功能的页面,如闹铃提醒,电话拨号等

Service(服务)

提供需要在后台长期运行的服务,无用户界面。一个组件可以与一个Service进行绑定实现组件之间的交互,可以在后台执行很多任务,如处理网络事务,播放音乐,文件读写下载等

启动方式

startService(),调用者与Service没有关联,只有Service调用stopSelf()或者调用者调用stopService()才能停止服务

bindService(),调用者与Service绑定,可以与Service进行交互,当所有调用者退出后,Service自动停止

生命周期

onStartCommand():其他组件(如活动)通过调用startService()来请求启动服务时,系统调用该方法

onBind():其他组件(如活动)通过调用bindService()来请求启动服务时,系统调用该方法

onUnbind():当客户中断所有服务发布的特殊接口时,系统调用该方法

onCreate():当服务通过onStartCommand()和onBind()被第一次创建的时候,系统调用该方法

onDestory():当服务不再有用或者被销毁时,系统调用该方法。你的服务需要实现该方法来清理任何资源,如线程,已注册的监听器,接收器等

使用场景

提高进程的优先级,系统不容易回收进程,适合长期在后台运行的操作

分类

不可交互的后台服务:通过startService()方式开启。Service的生命周期很简单,分别为onCreate、onStartCommand、onDestroy

可交互的后台服务:前台页面可以调用后台服务的方法,通过bindService()方式开启。Service的生命周期很简单,分别为onCreate、onBind、onUnBind、onDestroy

前台服务:通过一定的方式将服务所在的进程级别提升了。前台服务会一直有一个正在运行的图标在系统的状态栏显示,非常类似于通知的效果。由于后台服务优先级相对比较低,当系统出现内存不足的情况下,它就有可能会被回收掉,所以前台服务就是来弥补这个缺点的,它可以一直保持运行状态而不被系统回收。

Service和Activity通信

bindService + 回调函数

Activity调用bindService方法,绑定一个Service。通过实例化ServiceConnection接口内部类监听的方法获取Service中的Binder对象,并将该接口传给binderService方法。如果想实现主动通知Activity的,还可以在Service中添加回调方法。

广播(推荐LocalBroadcastManager)

Activity调用registerReceiver注册广播接收器,通过startService启动一个Service,之后Service调用sendBoardcast向Activity发送广播,Activity则通过onReceive方法接收Service发送的消息

Content Provider(内容提供者)

是官方推荐的不同应用程序间进行数据交互和共享的方式。为存储和获取数据提供统一的接口,相当于数据的搬运工,真正的数据源是Sqlite/文件/XML/网络等

它一般为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据

设计目的在于:对底层数据库的抽象,提供一种跨进程数据共享方式,用安全的方式对数据进行封装

使用原理:内容提供者是一种跨应用访问数据库的方式,一个应用可以通过内容提供者将自己的私有数据暴露出来,其他应用通过内容解析者对数据进行增删改查

使用场景:由于内容提供者是向其他应用暴露数据库接口,不能保证应用所定义的数据库的安全性。因此不用于自定义数据库,适用于获取系统数据库的接口,如短信数据库,联系人数据库

Broadcast Receiver(广播接收器)

相当于一个全局监听器,用于接收应用间/应用内发出的广播信息,并做出响应

分为广播发送者和广播接收者。

系统在特定场景会发送广播,如电量低、插入耳机等,每个应用都会收到,应用程序也可以发送广播来通知其他app状态变化

原理

广播使用的是设计模式中的观察者模式,基于消息的发布/订阅事件模型。模型中有三个角色:消息订阅者(广播接受者),消息发布者(广播发布者),消息中心(AMS)

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

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

3.AMS根据广播发送者的要求,在已注册列表中寻找合适的广播接收者

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

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

分类

普通广播

系统广播

有序广播

无序广播

全局广播

本地广播

注册方式

静态注册
动态注册

使用方式

发送广播
接收广播
屏蔽广播

Context

上下文,提供了关于应用环境全局信息的接口,可以通过这个接口获取应用程序的资源和类,可以进行应用级别的操作,如启动Activity,弹出对话框,启动服务,发送广播,加载资源等

继承关系:Context是一个抽象类,具体实现类是ContextImpl,包装类是ContextWrapper。Activity,Application,Service继承自ContextWrapper,初始化过程会创建一个具体的ContextImpl实例,由ContexxtImpl实现Context中的方法。ContextThemeWrapper继承自ContextWrapper,相当于ContextWrapper添加了与主题相关的接口。Application和Service直接继承自ContextWrapper,Activity直接继承自ContextThemeWrapper

内存泄漏:一般Context造成的内存泄漏,是当Context销毁的时候,因为被引用而导致销毁失败。

而Application的Context对象可以理解为随着进程存在,所以:

生命周期长的对象,优先使用Application的Context

不要让生命周期长于Activity的对象持有Activity的引用

尽量不要在Activity中使用非静态内部类

Intent

表示意图,主要作用包括两个:

指定当前组件要完成的动作

隐式意图

https://blog.csdn.net/yinzhijiezhan/article/details/49205879

显示意图
常见使用场景

传递数据

java的8种基本数据类型,string以及他们的数组形式

Bundle类,是一个以键值对形式存储可传输数据的容器

实现了Serializable和Parcelable接口的对象,这些对象实现了序列化

Application

代表应用程序,属于Android的一个系统组件

特点

单例模式

每个app运行时,系统自动创建并实例化Application对象,且应用程序中有且仅有一个Application对象

全局实例

不同的组件可以获取Application且获取的是同一个Application

与app应用程序同生共死

Application的生命周期等于App的生命周期

获取方式

应用场景

初始化资源,WebView预加载,推送服务注册,第三方插件加载等
数据共享、数据缓存(设置全局共享变量、方法)
获取应用程序当前内存使用情况(及时释放资源,避免被系统杀死/提高应用程序性能)
监听 应用程序 配置信息的改变
监听应用程序内 所有Activity的生命周期

原文链接:https://blog.csdn.net/qq_29966203/article/details/90751361

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值