四大组件

一、Service

1、Service的生命周期

startService方法启动:
  • startService(new Intent(this,MyService.class));
    onCreate(第一次启动)->onStartCommand()->onStart()(这两个方法每次都会调用)->onDestroy();
bindService启动方法:
  • bindService(new Intent(this,MyService.class),serviceConnection,BIND_AUTO_CREATE );
    onCreate()->onBind()->onUnbind()->onDestroy()(均只调用一次)

onBind()将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service的实例、运行状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。

当service被绑定时(binService启动之后),如果不调用unbindService方法解除绑定,无法stopService退出Service,只有调用unbindService之后才会调用onDestroy();
同样,使用startService()之后,如果不调用stopService(),此时又通过bindService()绑定了service,即使调用了unbindService(),也无法调用onDestroy(),只能调用到onUnbind();

2、Service的两种启动方式:startService和bindService

(见上面)

显示调用和隐式调用:

显示与隐式对比在清单文件中声明Service时,多了个

Android 5.0之后Service的intent必须显性声明。否则报错:
Service Intent must be explicit: Intent { act=myService }

3、Service和IntentService

IntentService是通过Handler looper message的方式实现了一个多线程的操作,同时耗时操作也可以被这个线程管理和执行,同时不会产生ANR的情况。当任务执行完后,IntentService会自动停止,而不需要我们手动去控制或stopSelf()。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。

二、Activity

1、Activity的生命周期

1.onCreate
Activity第一次被创建时调用
2.onStart
Activity由不可见变为可见时调用
3.onResume
Activity准备好和用户交互时调用,此时Activity一定位于返回栈的栈顶
并且处于运行状态。
4.onPause
在系统准备去恢复或启动另一个Activity时调用
5.onStop
当Activity变得完全不可见时调用。
它和onPause()方法的主要区别在于,如果启动的新Activity是一个对话框式的activity,onPause()方法会得到执行,而onStop()方法并不会执行。
6.onDestroy
Activity被销毁之前调用,之后Activity的状态变为销毁状态
7.onRestart
Activity由停止状态变为运行状态之前调用。也就是Activity被重新启动。

2、Activity的启动模式

(1)Standard
Activity默认模式,所有的Activity遵循元素进栈出栈的特性,例如进栈序列为A->B->C->D,D呈现在页面上,按返回键出栈顺序D->C->B->A.
(2)SingleTask
如果要启动的Activity在当前栈内启动,activity只会在任务栈里面存在一个实例。如果要激活的activity在任务栈里面已经存在,就不会创建新的activity,而是复用这个已经存在的activity,调用 onNewIntent() 方法,并且
清空这个activity任务栈上面所有的activity。
(3)SingleInstance
单一实例模式,整个手机操作系统里面只有一个实例存在。不同的应用去打开这个activity 共享公用的同一个activity。他会运行在自己单独,独立的任务栈里面,并且任务栈里面只有他一个实例存在。应用场景:呼叫来电界面。

  1. 以singleInstance模式启动的Activity具有全局唯一性,即整个系统中只会存在一个这样的实例。
  2. 以singleInstance模式启动的Activity在整个系统中是单例的,如果在启动这样的Activiyt时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。
  3. 以singleInstance模式启动的Activity具有独占性,即它会独自占用一个任务,被他开启的任何activity都会运行在其他任务中。
  4. 被singleInstance模式的Activity开启的其他activity,能够在新的任务中启动,但不一定开启新的任务,也可能在已有的一个任务中开启。

(4)SingleTop
栈顶复用模式,如果要开启的activity在任务栈的顶部已经存在,就不会创建新的实例,而是调用 onNewIntent() 方法。

3、Activity横竖屏切换回调哪些方法

1.onSaveInstanceState(Bundle outState) :
Activity 即将销毁时保存数据
2.onRestoreInstanceState(Bundle savedInstanceState):
Activity 重建或者恢复时候取出数据
[引用]http://www.cnblogs.com/yishujun/p/5395266.html

从 API 13开始,配置 android:configChanges="orientation|keyboardHidden|screenSize",不会销毁 activity,只调用 onConfigurationChanged方法。

Android 3.2 (API 级别 13)以前
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。
2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。
3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。
Android 3.2 (API级别 13)开始
1、不设置Activity的android:configChanges,或设置Activity的android:configChanges="orientation",或设置Activity的android:configChanges="orientation|keyboardHidden",切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行一次。
2、配置 android:configChanges="orientation|keyboardHidden|screenSize",才不会销毁 activity,且只调用 onConfigurationChanged方法。
数据影响
如果Activity重启(重新调用各个生命周期),会导致数据丢失,要(会)调用onSaveInstanceState()onRestoreInstanceState()来保存数据,此时如果res目录下有layout-land和layout-port资源文件夹,会自动调用不同的布局文件来配置;
如果是Fragment,则会摧毁它的View和局部变量。要调用onSaveInstanceState()onActivityCreated ()来保存数据。
如果不重启Activity,则不会导致数据丢失,如需更改布局文件,需手动代码设置。(在onConfigurationChanged里面设置);Fragment也一样。

三、ContentProvider

1、数据共享

2、增删改查

四、BroadcaseReceiver

1、两种注册方式

(1). 静态注册:AndroidManifest中注册

android:enabled=["true" | "false"]
//此broadcastReceiver能否接收其他App的发出的广播
//默认值是由receiver中有无intent-filter决定的:如果有intent-filter,默认值为true,否则为false
android:exported=["true" | "false"]
android:icon="drawable resource"
android:label="string resource"
//继承BroadcastReceiver子类的类名
android:name=".mBroadcastReceiver"
//具有相应权限的广播发送者发送的广播才能被此BroadcastReceiver所接收;
android:permission="string"
//BroadcastReceiver运行所处的进程
//默认为app的进程,可以指定独立的进程
//注:Android四大基本组件都可以通过此属性指定自己的独立进程
android:process="string" >
//用于指定此广播接收器将接收的广播类型
//本示例中给出的是用于接收网络状态改变时发出的广播



(2).动态注册:代码中调用Context.registerReceiver().需要反注册。

静态广播发送方法:

    Intent intent = new Intent(ActionName);//ActionName即为静态注册中的action 的名字
    sendBroadcast(intent);

设置顺序广播:

            
                
            

2、广播通讯的优缺点

广播从onReceive开始被创建,离开onReceive被销毁,生命周期结束。
因此在onReceive里面进行异步操作会有问题:当程序执行完onReceive方法后,BroadcastReceiver生命周期结束,异步操作终止

3、更高效的局部广播LocalBroadcastReceiver

LocalBroadcastReceiver不能静态注册,只能采用动态注册的方式。
在发送和注册的时候采用,LocalBroadcastManager的sendBroadcast方法和registerReceiver方法.

你可能感兴趣的:(四大组件)