android之四大组件

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就是当用户点击屏幕交互后产出的耗时操作,并且可以提供给其他的手机软件调用 **/

这个耗时操作和activity中的点击、滑动、滚动、弹窗等等动作事件不一样,activity中这些动作事件是在一瞬间完成的,而service处理的动作事件是比较耗时的,比如下载、上传文件,播放音乐等等。

Service也是以一个类(Class):
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翻译就是内容提供者,是android系统的一个主要组件,一种android系统中数据共享方式。android系统中一个应用程序(app)的数据是独立的,其他app不可以访问。而content provider存取的数据是跨越app之间的限制的,也就是说一部手机里面的所有软件都可以访问这些数据。如果不想共享数据,就是用android自带的数据库保存数据。content provider是通过ContentResolver类来完成数据存取操作的。

content provider页是一个类(Class)

public abstract class ContentProvider implements ComponentCallbacks2 {……}


(4)broadcast receiver

broadcast receiver翻译就是广播接收者,在android系统中,电池电量、来电来信、传感器状态改变等信号的传递被理解为广播,而broadcast receiver就是接收和过滤这些广播的,当app收到一个对自己有用的广播就会触发broadcast receiver的onReceive()方法,在方法中做想做的操作。BroadcastReceiver 自身并不实现图形用户界面,但是当它收到某个通知后, BroadcastReceiver 可以启动Activity 作为响应,或者通过 NotificationMananger 提醒用户,或者启动 Service 等等,开发者自己写代码控制。

BroadcastReceiver 也是一个类(Class):

public abstract class BroadcastReceiver {……}

注:每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 , 该对象即被销毁 . 当 onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应 . 所以在

BroadcastReceiver 里不能做一些比较耗时的操作





——————————————————————————————————————————————————————————————





2.四大组件特性

4大基本组件都需要注册才能使用,每个Activity、service、Content Provider都需要在AndroidManifest文件中进行配置。AndroidManifest文件中未进行声明的activity、服务以及内容提供者将不为系统所见,从而也就不可用。而broadcast receiver广播接收者的注册分静态注册(在AndroidManifest文件中进行配置)和通过代码动态创建并以调用Context.registerReceiver()的方式注册至系统。需要注意的是在AndroidManifest文件中进行配置的广播接收者会随系统的启动而一直处于活跃状态,只要接收到感兴趣的广播就会触发(即使程序未运行)。

Content Provider的事件(函数)在接收到ContentResolver发出的请求后被调用。而其它三种组件activity、service和broadcast receiver在接收到intent的异步消息被调用(Intent是一个类,功能是通信)

Content Provider仅在ContentResolver提出请求的时候激活。broadcast receiver仅在收到广播信息的时候激活。所以,没有必要去显式的关闭这些组件。而Activity、Service就需要手动关闭。通过调用finish()方法来关闭一个activity。Service分两种情况通过startService()方法启动的服务要调用Context.stopService()方法关闭服务,使用bindService()方法启动的服务要调用Contex.unbindService()方法关闭服务。

介绍之前先来看一个无处不在的类:Context,这个类贯穿四大组件。
/**
 * 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,还可以通过这个类提供的方法调用系统级的功能,当然就包括启动关闭四大组件。

而activity和service通过多重继承关系最终是继承Context的,所有activity和service都是Context的子类。而且Broadcast Receiver和Cotent Provider也都包含Context。

(1)activity

启动关闭

Context.startActivity():启动;Context.finish():关闭。当然activity是继承Context的,所以简化成startActivity()和finish()

生命周期

完整的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

启动关闭

方式1.Context.startService():启动服务;Context.stopService():关闭服务。生命周期跟随app。
方式2.Context.bindService():启动服务;Context.unbindService():关闭服务。绑定后service的生命周期受activity的生命周期影响
Service内部可以通过调用shopSelf()方法主动关闭。
Service也是继承Context。

生命周期

Create->[Bind]->[Unbind]->Destroy

Create:当启动Service后Cervice被创建的时候。回调方法:onCreate().
Bind:仅当Service以方式2启动的时候才调用。回调方法:onBind().
StartCommand:当开始执行服务的操作的时候。回掉方法onStartCommand().
Unbind:仅当Service以方式2启动的时候才调用。回掉方法:onUnbind().
Destroy:当service被销毁的时候。回调方法:onDestroy().

其他回掉方法:

onRebind():当调用onUnbind()方法后有调用onBind()方法的时候调用,在onBind()之前。onUnbind()->onRebind()->onBind()



(3)Broadcast Receiver

broadcast receiver生命周期只有十秒,如果在 onReceive() 内做超过十秒内的事情,就会报ANR(Application No Response) 程序无响应的错误信息,它的生命周期为从回调onReceive()方法开始到该方法返回结果后结束


(4)Content provider

content provider没有生命周期之说,这个类的功能类似与数据库的操作。







————————————————————————————————————————————————————————————————



3.四大组件的使用


阅读更多
个人分类: Android
上一篇android之kotlin编程
下一篇android之FragmentPagerAdapter 和FragmentStatePagerAdapter的区别
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭