Service与BroadcastReceiver

来源:互联网 发布:微医挂号网可靠吗 知乎 编辑:程序博客网 时间:2024/06/05 04:03
(一)Service创建和配置步骤
1.定义一个继承Service的子类
2.在AndroidManifest.xml文件中配置该Service   <service android:name=".FirstService"></service>,无须指定label属性,因为service没有界面
Service和Activity都是从Context中派生出来的,所以都可以调用getResources()和getContentResolver()方法
IBinder  onBind(Intent intent)  该方法是Service子类必须实现的方法。该方法返回一个IBinder对象,应用程序可以通过该对象与Service组件通信
void onCreate()  在该service第一次被创建时回调该方法
void onDestroy() 在该Service被关闭前回调该方法
void onStartCommand(Intent intent,int flags,int startId) 该方法的早期版本是void onStart(Intent intent,int startId)每次调用startService(Intent)启动Service时会回调该方法
void onUnbind(Intent intent) 当该service上的所有客户端都断开连接时将会回调该方法

运行service的两种方式
通过Context的startService()方法,通过该方式启动的Serivce,访问者与Service之间没有任何关联,即使访问者退出了,Service也依然运行(可以通过stopService(Intent)关闭service)
通过Context的bindService()方法,通过该方式启动的service,访问者与service绑定在一起,访问者一旦退出,Service也就终止了。(通过unbindService()方法关闭service)
bindService(Intent service,ServiceConnection conn,int flags)
service:  系统将要启动的service
conn:   该参数是一个ServiceConnection对象,该对象用于监听访问者与service之间的连接情况,当访问者与Service之间连接成功时将回调该ServiceConnection的onServiceConnected(ComponentName name,IBinder service)方法,由于异常终止时调用其的onServiceDisconnected(ComponentName name)方法,当调用者主动通过unBindService()方法断开与Service连接时,不会回调onServiceDisconnncetion()方法
flags:   指定绑定时是否自动创建Service(如果Service还未创建),0表示不自动创建,BIND_AUTO_CREATE(自动创建)
onBind(Intent intent)方法所返回的IBinder对象将会传给ServiceConnection对象里的onServiceConnection(ComponentName name,IBinder service)方法的service参数,这样访问者就可通过该IBinder对象与Service进行通信了。
通常采用继承Binder类创建IBinder对象,Activity与Service之间通信通过binder对象,因为binder对象可以访问其内部数据。


(二)Service的生命周期
1.通过startService()方法来启动Service
  调用startService()-->onCreate()-->onStartCommand()-->stopService(Intent)
关闭-->onDestroy()-->Service关闭
2.调用bindService()来启动Service()
  调用bindService()-->onCreate()-->onBind()-->unbindService()断开连接-->onUnBind()-->onDestroy()
(三)使用IntentService
IntentService是Service的子类
Service本身存在两个问题:
1.Service不会专门启动一个单独的线程,Service与它所在应用位于同一个进程中
2.Service不是一个新的线程,因此不应该在Service中直接处理耗时任务

IntentService具有如下特征
1.IntentService会创建单独的worker线程来处理所有的Intent请求
2.IntentService会创建单独的worker线程来处理onHandleIntent()方法实现的代码,因此开发者无须处理多线程问题
3.当所有请求处理完成后,IntentService会自动停止,因此开发者无须调用stopSelf()方法
4.为Service的onBind()方法提供了默认实现,默认实现的onBind()方法返回null
5.为Service的onStartCommand()方法提供了默认实现,该实现会将请求Intent添加到队列中

(四)电话管理器(TelephonyManager)
TelephonyManager  aManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
(五)音频管理器AudioManager
AudioManager  aManager =(AudioManager)getSystemService(Service.AUDIO_SERVICE)
(六)振动器(Vibrator)
Vibrator vibrator =(Vibrator)getSystemService(Service.VIBRATOR_SERVICE)


(七)手机闹钟服务
AlarmManager  alarmManger=(AlarmManager)getSystemService(ALARM_SERVICE)
(八)BroadcastReceiver简介
本质是一个全局监听器女
创建步骤
1.创建需要启动的BroadcastReceiver的Intent
2.调用Context的sendBroadcast()或sendOrderedBroadcast()方法来启动指定的BroadcastReceiver,当程序发出一个Broadcast Intent之后,所有匹配该Intent的BroadcastReceiver都有可能被启动。
由于其本质是一个监听器,所以只需要重写onReceive(Context context,Intent intent)方法即可
指定该BroadcastReceiver能匹配的Intent,有两种方式
1.使用代码指定,调用BroadcastReceiver的Context的registReceiver(BroadcastReceiver  receiver,IntentFilter filter)方法指定,例如如下代码
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver,filter);
2.在AndroidManifest.xml文件中配置
<receiver  android:name=".IncomingSMSReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVER"/>
</intent-filter>
</receiver>

(Broadcast)广播被分为两种
1.Normal Broadcast(普通广播)   可以在同一时刻被所有接收者接收到,消息传递的效率比较高。但是缺点是接受者不能将处理的结果传递给下一个接受者
2.Ordered Broadcast(有序广播)预先声明优先级(在<intent-filter..../>元素的android:priority属性),依次接收Broadcast


Context提供如下两个方法用于发送广播
1.sendBroadcast()发送Normal Broadcast
2.sendOrderedBroadcast()发送Ordered Broadcast,对于Ordered Broadcast可以通过setResultExtras(Bundle)方法将处理的结果存入Broadcast中,然后传给下一个接受者,下一个接收者通过代码Bundle  bundle =getResultExtras(true);可以获取上一个接收者存入的数据


(九)基于Service的音乐播放器
(十)接收系统广播消息
常用广播的Action常量       
ACTION_TIME_CHANGED       系统时间被改变
ACTION_DATE_CHANGED系统日期被改变
ACTION_TIMEZONE_CHANGED系统时区被改变
ACTION_BOOT_COMPLETED系统启动完成
ACTION_PACKAGE_ADDED系统添加包
ACTION_PACKAGE_CHANGED系统的包改变
ACTION_PACKAGE_PEMOVED系统的包删除
ACTION_PACKAGE_RESTARTED系统的包重启
ACTION_PACKAGE_DATA_CLEARED系统的包数据被清空
ACTION_BATTERY_CHANGED电池电量改变
ACTION_BATTERY_LOW电池电量低
ACTION_POWER_CONNECTED系统与电源连接
ACTION_POWER_DISCONNECTED系统与电源断开
ACTION_SHOUTDOWN系统被关闭

原创粉丝点击