您的位置:首页 > 移动开发 > Android开发

第一篇博客,Android四大组件

2017-03-06 21:51 106 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_26480643/article/details/60601617

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()方法。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: