众所皆知,android四大组件有Activity、Service、BroadCastReceiver、ContentProvider。对于android开发来说,四大组件基本上是工作中必不可少,也是最常用到的内容。接下来我们逐个看下他们的作用。
1.Activity(活动)
activity是一种展示组件,一个activity就是一个单独的屏幕,相当网站的一个页面。
activity可以用于直接向用户展示一个界面,并且监听用户的操作并作出交互。最常见的就是注册登录页面,展示输入框等组件,并获取用户的输入进行注册或者登录操作。
activity必须要在AndroidManifest进行注册。不然不能直接调用。
<activity
android:name=".TestActivity"
android:label="This is a Activity">
</activity>
前面说activity相当于网页的一个页面,其实activity也可以以弹窗形式存在。只要在AndroidManifest注册的时候指定对话框主题即可
<activity
android:name=".TestActivity"
android:theme="@android:style/Theme.Dialog"
android:label="This is a Activity">
</activity>
activity是可以停止的,调用 finish方法即可。
2. Service(服务)
Service是一种计算型组件,用于在后台执行需要放在后台执行,用户无法直接感知的操作。例如在后台播放音乐。注意:service并不是专用于执行耗时操作的,因为service也是运行在主线程里面的,所以耗时操作如网络请求必须开启子线程。
Activity 组件只有一种运行模式,即 Activity 处于启动状态,Service 组件略有不同,它有两种状态:启动状态和绑定状态。
- 启动状态
Service 内部可以做一些后台计算,并且不需要和外界有直接的交互。该运行模式可以使用 Context 的startService方法启动Service。 - 绑定状态
Service 内部同样可以进行后台计算,但是处于这种状态时,外界可以很方便地和 Service 组件进行通信。该运行模式使用 Context 的bindService方法启动 Service。
3.BroadCastReceiver(广播接收器)
BroadCastReceiver是一种消息型组件,用于在不同的组件甚至不同的应用之间传递消息。 BroadcastReceiver 同样是用户无感知的,运行在系统内部。BroadCastReceiver没有停止的概念。
BroadCastReceiver有两种注册方式:
- 静态注册
在AndroidManifest里面注册。此种形式的广播不需要启动应用即可接收到相应的广播 - 动态注册
IntentFilter filter=new IntentFilter();
filter.addAction("com.simbazou.receiver.test");
this.registerReceiver(mReceiver,filter)
直接在代码里面注册,必须要启动应用才能收到广播。还需要在onDestory取消注册
this.unregisterReceiver(mReceiver)
4.ContentProvider(内容提供者)
ContentProvider是一种数据共享型组件,用于向其它组件乃至其他应用共享数据。他对于用户也是无法被感知的
实现一个ContentProvider必须实现insert、delete、update、query四种操作,并且需要注意线程同步的问题,因为这些方法有可能被多个线程调用。
ContentProvider也必须在AndroidManifest上注册。
5.四大组件多进程的开启
首先我们要先理解进程的概念,进程一般指一个执行单元,在移动设备中一般指一个应用。一个进程可以有多个线程,一般我们常用的UI主线程或者是网络子线程都是包含在进程里面的。
Android 四大组件都可以开启多进程,需要在AndroidManifest.xml里面添加android:process=":remote'。需要注意的是,process属性的值几乎可以随便设置,不一定非得是remote
例如
<activity
android:name=".TestActivity"
android:process=":remote"
android:label="This is a Activity">
</activity>
应用设置多进程的好处:
一般来说,Android应用多进程有三个好处:
1)我们知道Android系统对每个应用进程的内存占用是有限制的,而且占用内存越大的进程,通常被系统杀死的可能性越大。让一个组件运行在单独的进程中,可以减少主进程所占用的内存,降低被系统杀死的概率.
2)如果子进程因为某种原因崩溃了,不会直接导致主程序的崩溃,可以降低我们程序的崩溃率。
3)即使主进程退出了,我们的子进程仍然可以继续工作,假设子进程是推送服务,在主进程退出的情况下,仍然能够保证用户可以收到推送消息。
应用设置多进程的缺陷:
由于进程间的内存是不可见的,所以会带来一些缺陷:
1)Application的多次重建。
2)静态成员的失效。
3)文件共享问题。
4)断点调试问题
参考资料:《Android开发艺术探索》