android之四大组件
1.四大组件理解:
activity、service、content provider、broadcast receiver
(1)activity
/** * An activity is a single, focused thing that the user can do. Almost all * activities interact with the user, so the Activity class takes care of * creating a window for you in which you can place your UI with **/
/** 一个activity就是一个用户可以操作的独立的界面,也就是和用户交互的窗口,所以activity就是负责建立一个放UI界面的窗口。**/
直观的理解:activity是手机上一个完整的全屏窗口页面,包括界面里面的所有东西,当用户点击这个activity的某个按钮,切换到一个新的全屏页面,新页面也是一个activity,所以用户看到的一个手机软件(app)就是一个个activity组成的。
Activity就是一个类(class):
public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener, ComponentCallbacks2, Window.OnWindowDismissedCallback, WindowControllerCallback {……}
在这个activity类中,在安卓的框架中,使用这样一个类就能生成一个空白的页面。开发人员可以在这个类中设计一个界面的UI布局,点击、滑动、滚动、弹窗等等事件,一个个的activity就组成了一个软件(app)。
注:点击、滑动、滚动、弹窗等等事件这些事件是瞬间完成的,不耗时,activity中处理单个事件的时间超过5秒就会报错,超过5秒的操作有Service完成,然后activity调用service来完成这些耗时操作
(2)service
/** * A Service is an application component representing either an application's desire * to perform a longer-running operation while not interacting with the user * or to supply functionality for other applications to use. Each service * class must have a corresponding **//** 一个service就是当用户点击屏幕交互后产出的耗时操作,并且可以提供给其他的手机软件调用 **/
public abstract class Service extends ContextWrapper implements ComponentCallbacks2 {……}
(3)content provider
/** * Content providers are one of the primary building blocks of Android applications, providing * content to applications. They encapsulate data and provide it to applications through the single * {@link ContentResolver} interface. A content provider is only required if you need to share * data between multiple applications. For example, the contacts data is used by multiple * applications and must be stored in a content provider. If you don't need to share data amongst * multiple applications you can use a database directly via * {@link android.database.sqlite.SQLiteDatabase}.
content provider页是一个类(Class)
public abstract class ContentProvider implements ComponentCallbacks2 {……}
(4)broadcast receiver
BroadcastReceiver 也是一个类(Class):
public abstract class BroadcastReceiver {……}
注:每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 , 该对象即被销毁 . 当 onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应 . 所以在
BroadcastReceiver 里不能做一些比较耗时的操作
——————————————————————————————————————————————————————————————
2.四大组件特性
/** * Interface to global information about an application environment. This is * an abstract class whose implementation is provided by * the Android system. It * allows access to application-specific resources and classes, as well as * up-calls for application-level operations such as launching activities, * broadcasting and receiving intents, etc. */ public abstract class Context {……}这个类是系统级别的抽象类,在app中是全局的,可以通过这个类调用系统的各种资源(文件,xml,图片,音视频等等)和class,还可以通过这个类提供的方法调用系统级的功能,当然就包括启动关闭四大组件。
(1)activity
启动关闭
生命周期
完整的Activity生命周期会按照如下顺序回调:
Create->Start -> Resume -> Pause -> Stop -> Destroy
Create:activity刚刚被创建出来的时候,回调方法:onCraeate():在这里处理activity创建时的初始化工作(比如初始化UI显示、初始化全局变量、绑定一些事件监听等等),这个时候不可见。
Start:activity创建好之后刚刚显示出来时候,这时候还不可以与用户交互。回调方法:onStart()
Resume:activity显示出来,并且可以与用户交互,回调方法:onResume()
Pause:activity变得可见但不可交互时候的状态(比如屏幕锁住了、有dialog弹出)。回调方法:onPause():通常会在这里保存activity中使用到的持久话数据。
Stop:activity变得完全不可见的时候(比如回到了桌面,另一个界面完全覆盖了现在的界面)。回调方法:onStop()
Destroy:调用finish()方法的时候或系统由于内存不足被回收的时候。这时候activity的内存空间被释放。回调方法:onDrstroy()
其他回调方法:
onRestart():当activity由不可见变得可见的时候调用。onStop->onRestart->onStart
onSaveInstanceState():当activity被stop前被调用,一定在onStop前,但不一定在onPause前,不确定性。一般在这里保存activity的瞬时状态,通过Bundle以参数形式传递给onCreate,当activity被重建的时候就会加载Bundle里的数据恢复销毁前的瞬时状态。【注:布局中的每一个View默认实现了onSaveInstanceState()方法,这样的话,这个UI的任何改变都会自动的存储和在activity重新创建的时候自动的恢复。但是这种情况只有在你为这个UI提供了唯一的ID之后才起作用,如果没有提供ID,将不会存储它的状态。由于默认的onSaveInstanceState()方法的实现帮助UI存储它的状态,所以如果你需要覆盖这个方法去存储额外的状态信息时,你应该在执行任何代码之前都调用父类的onSaveInstanceState()方法(super.onSaveInstanceState())。】
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
4、当前Activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变
5、Activity运行时按下HOME键(跟被完全覆盖是一样的):onSaveInstanceState --> onPause --> onStop,再次进入激活状态时: onRestart -->onStart--->onResume
(2)Service
启动关闭
生命周期
其他回掉方法:
onRebind():当调用onUnbind()方法后有调用onBind()方法的时候调用,在onBind()之前。onUnbind()->onRebind()->onBind()
(3)Broadcast Receiver
broadcast receiver生命周期只有十秒,如果在 onReceive() 内做超过十秒内的事情,就会报ANR(Application No Response) 程序无响应的错误信息,它的生命周期为从回调onReceive()方法开始到该方法返回结果后结束