android的四大组件

android的四大组件分别是activity, service,boardcast receiver, content provider。

一.activity

Activity 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。 每个 Activity 都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。

1.activity的生命周期



2.启动模式

分别是standard、singleTop、singleTask、singleInstance 

2.1 standard 默认模式

这个模式是默认的启动模式,即标准模式,在不指定启动模式的前提下,系统默认使用该模式启动Activity,每次启动一个Activity都会重写创建一个新的实例,不管这个实例存不存在,这种模式下,谁启动了该模式的Activity,该Activity就属于启动它的Activity的任务栈中。这个Activity它的onCreate(),onStart(),onResume()方法都会被调用,通常默认可不写。

配置方式:

<activity android:name=".demo.MainActivity" android:launchMode="standard"/>


当前栈中已有该Activity的实例并且该实例位于栈顶时,不会新建实例,而是复用栈顶的实例,并且会将Intent对象传入,回调onNewIntent方法
当前栈中已有该Activity的实例但是该实例不在栈顶时,其行为和standard启动模式一样,依然会创建一个新的实例
当前栈中不存在该Activity的实例时,其行为同standard启动模式
standard和singleTop启动模式都是在原任务栈中新建Activity实例,不会启动新的Task,即使你指定了taskAffinity属性。

2.2 singleTop 栈顶复用模式

这个模式下,如果新的activity已经位于栈顶,那么这个Activity不会被重写创建,同时它的onNewIntent方法会被调用,通过此方法的参数我们可以去除当前请求的信息。如果栈顶不存在该Activity的实例,则情况与standard模式相同。需要注意的是这个Activity它的onCreate(),onStart()方法不会被调用,因为它并没有发生改变。 

配置方式:

<activity android:name=".demo.MainActivity" android:launchMode="singleTop"/>



当前栈中已有该Activity的实例并且该实例位于栈顶时,不会新建实例,而是复用栈顶的实例,并且会将Intent对象传入,回调onNewIntent方法
当前栈中已有该Activity的实例但是该实例不在栈顶时,其行为和standard启动模式一样,依然会创建一个新的实例
当前栈中不存在该Activity的实例时,其行为同standard启动模式
standard和singleTop启动模式都是在原任务栈中新建Activity实例,不会启动新的Task,即使你指定了taskAffinity属性。

配置方式:

<activity android:name=".demo.MainActivity" android:launchMode="singleTop" /> 


那么什么是taskAffinity属性呢,可以简单的理解为任务相关性。

  • 这个参数标识了一个Activity所需任务栈的名字,默认情况下,所有Activity所需的任务栈的名字为应用的包名
  • 我们可以单独指定每一个Activity的taskAffinity属性覆盖默认值
  • 一个任务的affinity决定于这个任务的根activity(root activity)的taskAffinity
  • 在概念上,具有相同的affinity的activity(即设置了相同taskAffinity属性的activity)属于同一个任务
为一个activity的taskAffinity设置一个空字符串,表明这个activity不属于任何task

2.3 singleTask 栈内复用模式

 这个模式十分复杂,有各式各样的组合。在这个模式下,如果栈中存在这个Activity的实例就会复用这个Activity,不管它是否位于栈顶,复用时,会将它上面的Activity全部出栈,并且会回调该实例的onNewIntent方法。其实这个过程还存在一个任务栈的匹配,因为这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过taskAffinity属性指定。如果这个任务栈不存在,则会创建这个任务栈。

配置方式

<activity android:name=".demo.MainActivity" android:launchMode="singleTask" android:taskAffinity="com.demo.singletask" /> 
singleTask启动模式启动Activity时,首先会根据taskAffinity去寻找当前是否存在一个对应名字的任务栈
如果不存在,则会创建一个新的Task,并创建新的Activity实例入栈到新创建的Task中去
如果存在,则得到该任务栈,查找该任务栈中是否存在该Activity实例 
              如果存在实例,则将它上面的Activity实例都出栈,然后回调启动的Activity实例的onNewIntent方法 
              如果不存在该实例,则新建Activity,并入栈 
此外,我们可以将两个不同App中的Activity设置为相同的taskAffinity,这样虽然在不同的应用中,但是Activity会被分配到同一个Task中去。 
我们再创建另外一个应用,指定它的taskAffinity和之前的一样,都是.demo.singletask


2.4 singleInstance 全局唯一模式

该模式具备singleTask模式的所有特性外,与它的区别就是,这种模式下的Activity会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的Activity实例,除非这个特殊的任务栈被销毁了。以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。 

配置方式

<activity android:name=".demo.MainActivity" android:launchMode="singleInstance" />

二.Service

1.生命周期


说明:

1.1.通过 startService()被创建的service可以无限的运行下去。除非调用了stopSelf()或者在其他组件上调用stopService()来停止。

1.2.通过bindService()来创建的service,可以通过一个IBinder接口和service进行通信。可以通过 unbindService()方法来关闭这种连接。一个service可以同时和多个context绑定,当多个context都解除绑定之后,系统会销毁service。

如果一个service被startService()开启,然后又被bindService()与一个context绑定,这种情况下,只做stopService()或 stopSelf()并不能关闭这个service,必须都解除所有绑定才能关闭。


三.boardcast receiver

1.注册方法:

1.1.静态的在AndroidManifest.xml中用<receiver>标签声明注册,并在标签内用<intent- filter>标签设置过滤器。    

1.2.动态地在代码中先定义并设置好一个IntentFilter对象,然后在需要注册的地方调Context.registerReceiver()方法,如果取消时就调用Context.unregisterReceiver()方法。如果用动态方式注册的BroadcastReceiver的Context对象被销毁时,BroadcastReceiver也就自动取消注册了。


2.一般在onStart中注册,onStop中取消unregisterReceiver 发送广播消息 。仅有一个接收方法onRecive(ContextcurContext, Intent broadcastMsg) 。


四.content provider

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值