广播接收者案例_ip拨号器
定义一个类继承broadcastReceiver
public class OutGoingCallReceiver extends BroadcastReceiver {
//当接收到外拨电话的事件的时候 这个方法就会执行
@Override
public void onReceive(Context context, Intent intent) {
//[0]获取用户保存的ipnumber
SharedPreferences spPreferences = context.getSharedPreferences("config", 0);
String ipNumber = spPreferences.getString("ipnumber", "");
//[1]获取当前拨打的号码
String currentNumber = getResultData();
//[2]判断一下是否以0开头 然后在去加上17951
if (currentNumber.startsWith("0")) {
//修改拨打的电话号码
setResultData(ipNumber+currentNumber);
}
}
}
在清单文件里面配置
<receiver android:name="com.itheima.ipdail.OutGoingCallReceiver">
<intent-filter >
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>
mainActivity的逻辑 主要是保存ip号码
//[1]获取number
String ipNumber = et_number.getText().toString().trim();
//[2]把ipnumber存起来 获取sp实例
SharedPreferences sp = getSharedPreferences("config", 0);
//[2.1]获取sp的编辑器
sp.edit().putString("ipnumber", ipNumber).commit();
Toast.makeText(getApplicationContext(), "保存成功", 1).show();
3 广播接收者案例_sd卡状态监听
[1]定义广播接收者
public class SdcardReceiver extends BroadcastReceiver {
//当sd卡状态发生改变的时候调用
@Override
public void onReceive(Context context, Intent intent) {
//获取当前广播的事件类型
String action = intent.getAction();
if ("android.intent.action.MEDIA_MOUNTED".equals(action)) {
System.out.println("sd卡挂载了");
}else if ("android.intent.action.MEDIA_UNMOUNTED".equals(action)) {
System.out.println("说明sd卡卸载了");
}
}
}
[2]在清单文件里面配置一下
<receiver android:name="com.itheima.sdcardstate.SdcardReceiver">
<intent-filter >
<action android:name="android.intent.action.MEDIA_MOUNTED"/>
<action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
<data android:scheme="file"/>
</intent-filter>
</receiver>
4 广播接收者案例_短信监听器
[1]定义一个类继承broadCastReceiver
public class SmsReceiver extends BroadcastReceiver {
//当短信到来就会执行这个方法
@Override
public void onReceive(Context context, Intent intent) {
// 获取发送短信的号码 和 内容
Object[] objects = (Object[])intent.getExtras().get("pdus");
for (Object object : objects) {
//创建smsmessage的实例
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) object);
String body = smsMessage.getMessageBody();
String address = smsMessage.getOriginatingAddress();
System.out.println("body:"+body+"----"+address);
}
}
}
[2]在清单文件进行配置
<receiver android:name="com.itheima.smslistener.SmsReceiver" >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
5 不同版本广播的特点
[1]4.0之后 谷歌为了安全考虑 在设置页面多了一个强行停止的按钮 如果应用被强行停止 那么广播就不生效
[2]4.0之后 要求第一次安装的时候必须要有界面 没有界面广播接收者是不生效的
[3]2.3的手机是没有上面这样安全设计
[4]4.4系统短信监听事件不生效.
6 广播接收者案例_卸载安装
[1]定义一个广播接收者
public class AppStateReceiver extends BroadcastReceiver {
//当 应用被卸载 或者安装的时候调用
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("嘻嘻");
//获取当前广播的事件类型
String action = intent.getAction();
if ("android.intent.action.PACKAGE_ADDED".equals(action)) {
System.out.println("shuoming 应用被安装了:"+intent.getData());
}else if ("android.intent.action.PACKAGE_REMOVED".equals(action)) {
System.out.println("说明应用被卸载了");
}
}
}
[2]在清单文件里面配置一下
<receiver android:name="com.itheima.appstate.AppStateReceiver">
<intent-filter >
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>
7 广播接收者案例_开机启动
11-09 03:49:29.357: E/AndroidRuntime(1129): java.lang.RuntimeException: Unable to start receiver com.itheima.boot.BootReceiver: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
8 有序广播和无序广播
无序广播:类似新闻联播 每天晚上7点准时开播
sendBroadcast(Intent intent) 解耦 软件工程
有序广播:按照一定的优先级 接收广播
有序广播可以被拦截 数据可以被修改
无序广播不可以被拦截 数据不可以被修改
9 特殊广播接收者
操作特别频繁的广播事件 在清单文件注册无效
注册广播接收者有2种方式
[1]第一种方式就是在清单文件里面注册
[2]通过代码的方式去注册