两种广播接受者注册的优缺点:
1. 清单文件注册.
一旦应用程序被部署到手机上, 立刻生效了.
不管应用程序的进程是否开启,接收到了广播事件后,立刻执行onReceive()方法.
2. 代码注册
只有执行了 registerReceiver(receiver, filter); 生效
执行 unregisterReceiver(receiver); 失效
我们可以手工的控制这个广播接受者的有效期.
1. 清单文件注册.
一旦应用程序被部署到手机上, 立刻生效了.
不管应用程序的进程是否开启,接收到了广播事件后,立刻执行onReceive()方法.
2. 代码注册
只有执行了 registerReceiver(receiver, filter); 生效
执行 unregisterReceiver(receiver); 失效
我们可以手工的控制这个广播接受者的有效期.
需求:广播接收者的有效周期与服务的生命周期相关联,当服务开启时广播开启,当服务结束时广播结束
实现:1.在服务类中创建一个类继承BroadcastReceiver,并重写未实现方法
2.在服务开启的时候注册并开启广播
3.在服务销毁的时候取消广播
-----------------------------------------------------------------------------------------------
1.在服务类中创建一个类继承BroadcastReceiver,并重写未实现方法
2.在服务开启的时候注册并开启广播
3.在服务销毁的时候取消广播
/**
* 来电时显示来电号码归属地的服务
*
@author
Administrator
*
*/
public
class
ShowAddressService
extends
Service {
private
TelephonyManager
tm
;
private
MyListener
listener
;
private
BroadcastReceiver
receiver
;
@Override
public
IBinder onBind(Intent intent) {
return
null
;
}
/**
* 代码的方式创建广播接收者
*/
private
class
OutCallReceiver
extends
BroadcastReceiver{
@Override
public
void
onReceive(Context context, Intent intent) {
String address = AddressDao.getAddress(getResultData(), context);
Toast. makeText(context, address, 1).show();
}
}
/**
* 服务创建的时候
*/
@Override
public
void
onCreate() {
super
.onCreate();
//在服务创建时注册并开启广播
receiver
=
new
OutCallReceiver();
IntentFilter filter=
new
IntentFilter();
filter.addAction(
"android.intent.action.NEW_OUTGOING_CALL"
);
this
.registerReceiver(
receiver
, filter);
//创建电话管理者
tm
=(TelephonyManager) getSystemService(
TELEPHONY_SERVICE
);
listener
=
new
MyListener();
//初始化MyListener()
//注册一个监听器,监听电话状态的改变
tm
.listen(
listener
, PhoneStateListener.
LISTEN_CALL_STATE
);
}
/**
* 服务销毁的时候
*/
@Override
public
void
onDestroy() {
super
.onDestroy();
//在服务销毁时结束广播
unregisterReceiver(
receiver
);
receiver
=
null
;
// 当服务停止的时候 取消电话监听
tm
.listen(
listener
, PhoneStateListener.
LISTEN_NONE
);
listener
=
null
;
}
/**
* 电话状态的监听器
*
*/
public
class
MyListener
extends
PhoneStateListener{
@Override
public
void
onCallStateChanged(
int
state, String incomingNumber) {
super
.onCallStateChanged(state, incomingNumber);
switch
(state) {
case
TelephonyManager.
CALL_STATE_IDLE
:
//空闲状态
break
;
case
TelephonyManager.
CALL_STATE_RINGING
:
//响铃状态
//响铃时获取来电号码得到号码归属地
String location = AddressDao.getAddress(incomingNumber, getApplicationContext());
Toast. makeText(getApplicationContext(), location, 1).show();
break
;
case
TelephonyManager.
CALL_STATE_OFFHOOK
:
//接听状态
break
;
}
}
}
}