浅谈四大组件
我发现我记性越来越差了。
1、Activity
可以显示一些控件也可以监听并处理用户的事件作出相应。
Activity之间通过Intent进行通信。在Intent的描述中,有两个重要的部分:动作和动作对应的数据。
2、BroadcastReceive广播接收器
可以使用它对外部事件进行过滤,比如:电话呼入,邮件信息等。对感兴趣的外部事件进行接收并作出响应。
它可以启动一个Activity或者service来响应他们收到的信息,或者用NotificationManager来通知用户。
通知的方式,比如:闪动背灯、震动、播放声音等,一般是在状态栏上放一个持久的图标,用户可以打开它并获取信息。
广播类型:
普通广播:Content.sendBroadcast(Intent myIntent);发送的
有序广播:Content.sendOrderedBroadcast(intent,receiverPermission);
异步广播:Content.sendStickyBroadcast(Intent myIntent);
还有sendStickyOrderedBroadcast(intent, resultReceiver, scheduler, initialCode, initialData, initialExtras)方法,该方法具有有序广播的特性也有异步广播的特性;发送异步广播要: <uses-permission android:name="android.permission.BROADCAST_STICKY" />权限,接收并处理完Intent后,广播依然存在,直到你调用removeStickyBroadcast(intent)主动把它去掉
注意:发送广播时的intent参数与Contex.startActivity()启动起来的Intent不同,前者可以被多个订阅它的广播接收器调用,后者只能被一个(Activity或service)调用。
静态注册:在注册表里面配置
<receiver android:name=".SMSBroadcastReceiver" >
<intent-filter android:priority = "2147483647" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver >
动态注册:一般在Activity可交互时OnResume()内注册BroadcastReceive
IntentFilter intentFilter=new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(mBatteryInfoReceiver ,intentFilter);//反注册unregisterReceiver(receiver);
注意:
1.生命周期只有十秒左右
2. 动态注册广播接收器还有一个特点,就是当用来注册的Activity关掉后,广播也就失效了。
静态注册无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器也是打开着的。也就是说哪怕app本身未启动,该app订阅的广播在触发时也会对它起作用
系统常见广播Intent,如开机启动、电池电量变化、时间改变等广播
3、Service服务:
Service使用步骤如下
1>继承service类
2>AndroidManifast.xml配置清单文件中<application>节点里对服务进行配置
<service name=".SMSService"/>
服务不能自己运行,需要通过Contex.startService()或Contex.bindService()启动服务
通过startService()方法启动的服务于调用者没有关系,即使调用者关闭了,服务仍然运行想停止服务要调用Context.stopService(),此时系统会调用onDestory(),使用此方法启动时,服务首次启动系统先调用服务的onCreate()-->onStart(),如果服务已经启动再次调用只会触发onStart()方法。
使用bindService()启动的服务与调用者绑定,只要调用者关闭服务就终止,使用此方法启动时,服务首次启动系统先调用服务的onCreate()-->onBind(),如果服务已经启动再次调用不会再触发这2个方法,调用者退出时系统会调用服务的onUnbind()-->onDestory(),想主动解除绑定可使用Contex.unbindService(),系统依次调用onUnbind()-->onDestory();
4、Content Provider内容提供者:
android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式,
其他应用可以通过ContentResolver类(见ContentProviderAccessApp例子)从该内容提供者中获取或存入数据.(相当于在应用外包了一层壳),
只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中
它的好处:统一数据访问方式。
android系统自带的内容提供者(顶级的表示数据库名,非顶级的都是表名)这些内容提供者在SDK文档的android.provider Java包中都有介绍。见:http://developer.android.com/reference/android/provider/package-summary.html
├────Browser
├────CallLog
├────Contacts
│ ├────Groups
│ ├────People
│ ├────Phones
│ └────Photos
├────Images
│ └────Thumbnails
├────MediaStore
│ ├────Albums
│ ├────Artists
│ ├────Audio
│ ├────Genres
│ └────Playlists
├────Settings
└────Video
CallLog:地址和接收到的电话信息
Contact.People.Phones:存储电话号码
Setting.System:系统设置和偏好设置