Android提供了一个包含各种服务的应用框架, 为应用开发者提供了标准的应用程序开发方法,应用开发者只需通过四种组件的使用,实现组件提供的相关接口及提供应用用到的资源,布局及工程XML文件,最后打包成一个APK文件就可以完成应用程序的开发。
Android框架借鉴了J2EE框架的许多设计思想,框架提供完善的服务给服务者使用, 应用程序由一个个组件组成,通过组件的启动来启动应用程序,应用程序组件借助框架运行在框架之中,框架起到了应用服务器和容器的焦色,负责为应用程序组件提供运行环境,控制应用程序组件的生命周期。
Android框架如何实现控制应用程序组件的生命周期的呢?
主要是主动性框架API的提供,主动性框架API的实现是借助采用反向回调( IOC)机制(又称为好莱坞原则,别调用我们,我会调用你)的模板模式来完成的。模板模式是整个ANDROID框架的核心,采用模板模式,框架为需要控制的应用程序组件在其组件基类中提供了钩子, 框架通过调用钩子实现组件的生命周期控制。因此应用程序只需在组件的派生类中重新实现钩子函数(Function Overriding),既可以实现应用程序的客制化功能,又可以实现框架主动调用应用程序,控制应用程序的运行和生命周期的目的。
这样既可以实现多样化的应用,又能够使应用程序开发遵循同样的框架API,因此提供主动性框架API是ANDROID 框架的特征,也是目前大多数框架普遍采用的方式,如J2EE框架、NET框架。
Android 框架提供的四大基本组件:
Activity: Android 应用程序的UI(User Interface)组件,3.0以上版本又增加了Fragment。Fragment附属和依赖于Activity,作用象一个"sub activity",可以带有自己的UI,在Activity运行期间也可以具有自己独立的生命周期( 增加删除), 能够接收输入事件.能够在不同的Activity中 重用。
Service: 非UI功能的幕后处理组件。
Broadcast receiver: 可随时被启动来处理Intent,并执行其任务的组件。
Content provider: 实现跨程序的共享数据之组件,提供应用程序用到的数据源。
活动和服务是主要的运行组件,框架为两者通过IOC机制提供生命周期钩子,并在基类中提供了默认实现,钩子由框架来调用,应用程序通过派生基类,重新实现钩子回调函数,实现应用程序的客制化。
活动的基类为activity ,服务的基类为SERVICE ,两者都提供了钩子的默认实现。
两者都派生自Context,具体类图如下:
这里采用的是Bridge模式,ContextImpl是Context虚拟类的实现类,提供与框架交互的功能,如启动另外的活动或服务,登记广播接收器和发送广播,获得系统服务管理接口。ContextWrapper是对ContextImpl类的包装,SERVICE类和Activity类都是ContextWrapper的派生类,SERVICE类直接派生自ContextWrapper,Activity间接派生自ContextWrapper的子类ContextThemeWrapper,SERVICE类和Activity类分别在ContextWrapper和ContextThemeWrapper类的接口基础上添加和实现了各自的生命周期回调接口(钩子),ContextThemeWrappe的功能是在ContextWrapper基础上添加了Them的支持及在通过getSystemService接口返回服务管理对象时对于LAYOUT_INFLATER_SERVICE服务做了特殊处理,采用原形模式返回一个LayoutInflater对象的克隆对象。
Activity提供的钩子,每一个对应一个生命周期状态,onCreate(活动创建时调用),onStart(活动将要显示时调用),onResume( 活动已经处于可视状态时调用),onPause(另一个活动获得焦点,本活动将要暂停时调用),onStop(活动停止时不再可视时调用),onDestroy(活动将要释放时调用).
回调接口实现例子:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);//继承默认实现 // 在此添加新的功能 }
活动的完整生命周期
而Fragment至少需要实现如下三个回调:
onCreate()
创建fragmet时调用;
onCreateView()
在fragmet首次显示时调用,在该回调中实现fragmet与布局视图的绑定,并返回对应fragmet布局的根视图,如果fragmet没有UI,返回NULLL。
onPause()
用户离开fragmet时调用。
其它可以实现的回调:
onAttach(Activity activity)
当fragment 与activity绑定时调用
onActivityCreated()
当活动的onCreate()返回时调用。
onDestroyView()
当与fragment 绑定的视图被移走时调用。
onDetach()
当fragment与活动Detach时调用
onDestroy()
当fragment释放后调用
另外还有onStart(),onStop(),onResume(),onPause(),这些接口都与绑定的活动对应的状态对应,在绑定的活动相应状态回调接口调用时同时也被调用。
下面是Fragment与附属的Activity生命周期的对应图
服务的提供的钩子回调接口包括onCreate(服务创建时调用),onStartCommand(用户通过startService启动服务,服务将启动时调用),onBind(客户通过调用bindService将要绑定到服务时调用,该接口返回一个BINDER对象给客户,客户使用该BINDER对象与绑定服务通讯),onUnbind(客户通过调用unbindService已经与服务去绑定时调用),onRebind(客户通过unbindService与服务去绑定,然后重新bindService时调用),onDestroy(服务不再使用被释放时调用)。
服务生命周期图形
框架为广播接收器组件BroadcastReceiver及内容提供者ContentProvider组件提供了虚拟基类,应用程序需要实现他们的派生类. 广播组件只有一个接口需要在派生类中实现--onReceive接口(收到消息时由框架调用)。而内容提供者组件至少需要在派生类中实现onCreate接口(创建时由框架调用) , query接口(用来数据记录查询),getType接口(返回给定URI对应数据的MIME类型),update接口(更新数据记录用),insert接口(插入数据记录),delete接口(删除数据记录),这些接口除了onCreate由框架调用外其它都有客户调用,这是内容提供者组件与其它组件不一样的地方。
上一篇 版权所有,转载时请尊重原创显要位置注明链接!
下一篇