第一篇博客,Android四大组件
Android四大组件:
一.Activity(活动)
二.Service(服务)
三.Broadcast Receiver(广播)
四.Content Provider(内容提供者)
参考博客:
https://www.geek-share.com/detail/2571567561.html
**一.Activity(活动)
1. Activity生命周期:**
2. Activity启动模式:
(1) standard:标准启动模式,调用startActivity启动一个新的Activity实例.
(2) singleTop:若已有一个Activity处于Activity栈顶,则不产生新的实例,而是调用Activity的newInstance()方法,否则产生新的Activity.
(3) singleTask:在新的Task中产生实例,之后的调用都使用该实例,不会产生新的。
(4)singleInstance:与singleTask类似,不同点是产生的新实例所在的Task中只能有这个新实例
3.Activity启动模式的设置方法:
(1) 在manifestXML文件中设置Activity的LaunchMode属性。
(2) 在启动Activity的intent中使用initent.addFlags()方法。
二.Service(服务)
1.定义
Service是在一段不定的时间运行在后台,不和用户交互应用组件。每个Service必须在manifest中 通过来声明。
2. 启动方式:
contect.startservice
contect.bindserverice来启动。
3. 运行在主线程,耗时和阻塞操作在子线程实现。
4. 两种模式:
本地服务 Local Service
远程服务 Remote Service
5.生命周期:
使用context.startService() 启动Service是会会经历:
context.startService() ->onCreate()- >onStartCommand()->Service running
context.stopService() | ->onDestroy() ->Service stop
如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。
stopService的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。
所以调用startService的生命周期为:onCreate –> onStart(可多次调用) –> onDestroy
1. 使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。
如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。
如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。
采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
使用context.bindService()启动Service会经历:
context.bindService()->onCreate()->onBind()->Service running
onUnbind() -> onDestroy() ->Service stop
onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。
所以调用bindService的生命周期为:onCreate –> onBind(只一次,不可多次绑定) –> onUnbind –> onDestory。
在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。
2. 使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。
onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。
采用Context.bindService()方法启动服务时只能调用onUnbind()方法解除调用者与服务解除,服务结束时会调用onDestroy()方法。
三.Broadcast Receiver(广播)
1.分类:
接受广播:
(1)正常广播 Normal broadcasts (用 Context.sendBroadcast()发送)是完全异步的。它们都运行在一个未定义的顺序,通常是在同一时间。这样会更有效,但意味着receiver不能包含所要使用的结果或中止的API。
(2)有序广播 Ordered broadcasts(用 Context.sendOrderedBroadcast()发送)每次被发送到一个receiver。所谓有序,就是每个receiver执行后可以传播到下一个receiver,也可以完全中止传播–不传播给其他receiver。 而receiver运行的顺序可以通过matched intent-filter 里面的android:priority来控制,当priority优先级相同的时候,Receiver以任意的顺序运行。
2.生命周期
一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)的才有效的,当从该函数返回后,该对象就无效的了,结束生命周期。
不能有过于耗时操作(10s)
3. 发送广播
Intent intent = new Intent(String action);
或者intent.setAction(String action);
sendBroadcast(Intent),
sendOrderedBroadcast(),sendStickyBroadcast()// 发送广播
4.接受广播
通过定义一个继承BroadcastReceiver类来实现,继承该类后覆盖其onReceiver方法,并在该方法中响应事件。
5.注册Receiver
(1) 静态方式,在AndroidManifest.xml的application里面定义receiver并设置要接收的action。例如:
<receiver android:name=".SMSReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver>
(2) 动态方式, 在activity里面调用函数来注册,和静态的内容差不多。一个形参是receiver,另一个是IntentFilter,其中里面是要接收的action。
`receiver = new CallReceiver();
registerReceiver(receiver, new IntentFilter(“android.intent.action.PHONE_STATE”));
onDestroy(){
//解除注册
}`
一个receiver可以接收多个action的,即可以有多个intent-filter,需要在onReceive里面对intent.getAction(action name)进行判断。记得添加相应权限
四、Content Provider(内容提供者)
1.作用
主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作。ContentProvider分为系统的和自定义的,系统的也就是例如联系人,图片等数据,获取前需要添加相应权限
2.使用方式
A应用实现ContentProvider提供内容给其他应用(例如B)应用来操作。
其他(例如B)应用通过ContentResolver来操作别的(例如A)应用数据。
3.ContentProvicer
ContentProvider使用表的形式来组织数据
无论数据的来源是什么,ContentProvider都会认为是一种表,然后把数据组织成表格
当应用需要通过ContentProvider对外共享数据时,第一步需要继承ContentProvider并重写下面方法:
public class PersonContentProvider extends ContentProvider{ //该方法在ContentProvider创建后就会被调用,Android开机后,ContentProvider在其它应用第一次访问它时才会被创建。 public boolean onCreate() //该方法用于供外部应用往ContentProvider添加数据。 public Uri insert(Uri uri, ContentValues values)//插入 //删除 public int delete(Uri uri, String selection, String[] selectionArgs) //该方法用于供外部应用更新ContentProvider中的数据。 public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) //该方法用于供外部应用从ContentProvider中获取数据。 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) //用于返回指定的Uri中的数据的MIME类型 //如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头, //如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头 //例如:要得到所有person记录的Uri为content://com.ljq.provider.personprovider/person, //那么返回的MIME类型字符串应该为:"vnd.android.cursor.dir/person"。 public String getType(Uri uri) }
第二步需要在AndroidManifest.xml使用对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider ,ContentProvider采用了authorities(主机名/域名)对它进行唯一标识,authorities 就是他的域名:
<provider android:name=".PersonContentProvider" android:authorities="com.ljq.providers.personprovider"/>
4.Uri
参考:https://www.geek-share.com/detail/2638447703.html
Uri指定了将要操作的ContentProvider,其实可以把一个Uri看作是一个网址,我们把Uri分为三部分。
第一部分是”content://”。可以看作是网址中的”http://”。
第二部分是主机名或authority,用于唯一标识这个ContentProvider,外部应用需要根据这个标识来找到它。可以看作是网址中的主机名,比如”blog.csdn.net”。
第三部分是路径名,用来表示将要操作的数据。可以看作网址中细分的内容路径。
5.ContentResolver
当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成,要获取ContentResolver对象,可以使用Context提供的getContentResolver()方法。
- Android 技术专题Feature系列第一篇 四大组件之Activity
- Android 技术专题Feature系列第一篇 四大组件之Service
- Android 技术专题Feature系列第一篇 四大组件之BroadcastReceiver
- Android 四大组件 博客链接
- Android初学者的技术博客首旅:对四大组件的理解
- android开发之路12(android四大组件&Fragment&AsyncTask类)
- android四大组件--ContentProvider详解
- Android 四大组件
- android四大组件介绍
- Android应用程序四大组件
- Android的四大组件:Activity、Service、Content Provider、Broadcast Receiver
- 一个帖子学会Android开发四大组件
- Android四大基本组件介绍与生命周期
- Android四大组件
- Android 四大组件之Activity
- Android四大基本组件介绍与生命周期
- 小白android笔记【1】--Android四大组件之一(Activity)
- Android四大组件之 Activity(下)
- Android四大组件之一的service理解
- 干货︱Android面试必问之四大组件