四大组件的区别
- Activity
- Service
- Content provider
- BroadcastReceiver
广播接受者很特别:不仅可以在功能功能清单文件当中注册,还能在代码中注册。
在清单文件当中注册
<receiver android:name="com.scau.mobilesafe.receiver.OutCallReceiver" >
<intent-filter >
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>
在代码中注册
private OutCallReceiver receiver;
//注册监听去电
receiver= new OutCallReceiver();
IntentFilter filter =new IntentFilter();
filter.addAction("android.intent.action.NEW_OUTGOING_CALL");//监听去电的动作
registerReceiver(receiver, filter);
- 对比以上两种注册方法
- 在清单文件当中注册,不论程序是否开启,这个注册信息同样都会生效,所以在某些场合,当程序关闭后注册的清单文件也要随着失效的情况下,选择用代码注册会比较科学。
- 用代码注册的一下几大要点:
- 在将要注册的信息定义成类的成员变量,这很关键。因为后面要将这个文件注销的时候,用到就是这个成员变量。
- 在具体注册监听过程中,现定义好的信息new(创建出来),然跟在清单文件当中注册是一样的流程。将一路意图过滤器创建出来之后,添加意图过滤器的反应。这个反应就是来电监听,这时候还是要用到系统给定的NEW_OUTGOING_CALL监听接口。
- 最后在onCreate方法中将这个方法注册一下。
父类和子类的权限问题
private class OutCallReceiver extends BroadcastReceiver {
private void onReceive(Context context, Intent intent) {
String number = getResultData();
String address = NumberAddressQureyDao.getAddress(number);
Toast.makeText(context, address, 1).show();
}
}
会报如下错误
Cannot reduce the visibility of the inherited method from BroadcastReceiver
- 意思是子类的权限不能覆盖父类的权限。
- 因为广播接受者(BroadcastReceiver)在源码中给定的权限是public。所以如果此处使用private就相当于:定义的人能说话,但是作为人的子类的学生不能说话,这样是不和逻辑的。