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系统被关闭
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系统被关闭
阅读全文
0 0
- BroadcastReceiver与Service小结
- Service 与BroadcastReceiver
- Service与BroadcastReceiver
- Android之Service与BroadCastReceiver
- android下Service BroadcastReceiver与AlarmManager
- Widget与service利用BroadcastReceiver通信
- android 广播BroadcastReceiver(activity与service通信)
- Service 通过 BroadcastReceiver与Activity 进行通信
- BroadcastReceiver service
- BroadcastReceiver与Service组件的基本应用场景
- Service与AlarmManager-BroadcastReceiver能否在CPU沉睡下工作
- 利用BroadcastReceiver,使Service与Activity数据交互。
- Activity组件与Service组件通过BroadcastReceiver监听器通信
- Android的Service与BroadcastReceiver之二 跨进程调用Service(AIDL Service)
- 理解Service和BroadcastReceiver
- Android Service BroadcastReceiver
- Android之Service&BroadCastReceiver
- 用BroadcastReceiver控制Service
- java分割字符串 Unclosed character class near index 错误
- 剑指offer---删除链表中的重复元素
- php 获取保存Pointer 类型
- [bigdata-123] docker + centos 7.4 安装redis和mongo
- php性能分析工具xhprof
- Service与BroadcastReceiver
- Intellij idea上传项目到github
- 程序员薪酬到底有多高?来看硅谷的工程师统计
- 多媒体开发
- SQL中的DataFrame的两种创建方式。
- 物理知识(1)
- python | 报错问题排查方法总结UnicodeDecodeError: 'ascii' codec ...
- 蓝桥杯练习题之闰年判断
- 接入应用宝的坑