Android广播receiver
安卓四大组件之一接受者receiver是安卓必不可少的组成部分。
广播接收者BroadcastReceiver的运用
系统广播
创建一个自己的CallBroadcastReceiver继承BroadcastReceiver,然后在onReceive(Context context,Intent intent)方法中去接收广播。
public void onReceive(Context context, Intent intent) {
abortBroadcast();//中断广播
String action = intent.getAction();
if( "android.intent.action.NEW_OUTGOING_CALL".equals(action) ){
String resultData = getResultData();
if( "123".equals(resultData) ){
setResultData("456");
}
System.out.println(resultData);
Toast.makeText(context, "call", Toast.LENGTH_SHORT).show();
}else if("android.intent.action.PACKAGE_INSTALL".equals(action)){
System.out.println("PACKAGE_INSTALL");
Toast.makeText(context, "PACKAGE_INSTALL", Toast.LENGTH_SHORT).show();
}else if("android.intent.action.PACKAGE_ADDED".equals(action)){
System.out.println("PACKAGE_ADDED");
Toast.makeText(context, "PACKAGE_ADDED", Toast.LENGTH_SHORT).show();
Intent intent2 = new Intent();
intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent2.setClass(context,MainActivity.class);
context.startActivity(intent2);
}else if("android.intent.action.PACKAGE_REMOVED".equals(action)){
System.out.println("PACKAGE_REMOVED");
Toast.makeText(context, "PACKAGE_REMOVE", Toast.LENGTH_SHORT).show();
}
}获取广播事件action,然后判断广播事件,执行广播事件之后的相应代码。
打电话事件之后获取电话号码,输出号码名字,如果号码是123,就打给456。
然后再测试安装与卸载app的广播事件,安装的action是android.intent.action.PACKAGE_ADDED,不是android.intent.action.PACKAGE_INSTALL,安装广播之后也执行跳转命令Intent2。
但仅仅写完上述代码是不够的,还要在注册清单上面添加:
<receiver android:name="com.example.broadcastmytest.broadcast.CallBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_INSTALL"/>
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>把包改成
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcastmytest"
android:versionCode="1"
android:versionName="1.0" >
这样之后才可以运行成功。
自己写广播自己接收
无序广播
public void wuxu(View v){
showUserMsg("wuxu");
Intent intent = new Intent();
intent.putExtra("key1", "我是无序广播");
intent.setAction("com.example.broadcast.SendUnOder1");
sendBroadcast(intent);
}
自己写一个类去接收自己发出的广播
public class SendUnOrderBroadcast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String StringExtra = intent.getStringExtra("key1");
System.out.println("StringExtra"+StringExtra);
}
}在清单文件里面去添加一个receiver
<span style="white-space:pre"> </span><receiver android:name="com.example.broadcast.send.SendUnOrderBroadcast">
<intent-filter>
<action android:name="com.example.broadcast.SendUnOder1"/>
</intent-filter>
</receiver>
有序广播
写三个广播接收类,1 2 3表示权限
public class SendUnOrder1Broadcast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String stringExtra = intent.getStringExtra("key2");
System.out.println("111"+stringExtra);
}
}<pre name="code" class="java">public class SendUnOrder2Broadcast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String stringExtra = intent.getStringExtra("key2");
System.out.println("222"+stringExtra);
}
}public class SendUnOrder3Broadcast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String stringExtra = intent.getStringExtra("key2");
System.out.println("333"+stringExtra);
}
}发送广播
public void youxu(View v){
showUserMsg("youxu");
Intent intent = new Intent();
intent.putExtra("key2", "我是有序广播");
intent.setAction("com.example.broadcast.SendUnOder2");
sendOrderedBroadcast(intent, null, null, null, 1, null, null);
}清单文件内设置权限级别
<receiver android:name="com.example.broadcast.send.oder.SendUnOrder1Broadcast">
<intent-filter android:priority="1000">
<action android:name="com.example.broadcast.SendUnOder2"/>
</intent-filter>
</receiver>
<receiver android:name="com.example.broadcast.send.oder.SendUnOrder2Broadcast">
<intent-filter android:priority="500">
<action android:name="com.example.broadcast.SendUnOder2"/>
</intent-filter>
</receiver>
<receiver android:name="com.example.broadcast.send.oder.SendUnOrder3Broadcast">
<intent-filter android:priority="100">
<action android:name="com.example.broadcast.SendUnOder2"/>
</intent-filter>
</receiver>可以在广播接收类内部中断广播
abortBroadcast();
这样就可以自己发广播自己接收了。
代码动态配置广播
代码动态配置广播不需要在清单中配置recevier,直接在代码中创建一个registBroadcast和IntentFilter,然后往IntentFilter里面去添加action,最后代码注册一个Receiver。
在Activity的onCreate里面写
registBroadcast = new RegistBroadcast();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.intent.action.SCREEN_OFF");
intentFilter.addAction("android.intent.action.SCREEN_ON");
registerReceiver(registBroadcast,intentFilter);public class RegistBroadcast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if( "android.intent.action.SCREEN_OFF".equals(action) ){
System.out.println("SCREEN_OFF");
}else{
System.out.println("SCREEN_ON");
}
}
}这样就可以接收屏幕关闭打开的广播了。
本文详细介绍了Android中的广播机制,包括如何使用系统广播监听电话拨打、应用安装与卸载等事件,以及如何实现自定义广播的发送与接收。此外,还探讨了无序广播与有序广播的区别,并展示了如何通过代码动态配置广播接收器。

945

被折叠的 条评论
为什么被折叠?



