首页 > 代码库 > 广播基础
广播基础
1.什么是广播
在andorid系统中,有一个类似于广播电台的功能,可以把一个公共的事件作为一个广播消息,发送给其它应用程序,只要其它应用指定了该接收的事件名称,就可以接收到这个事件消息。
由此可以推断出,如果想要使用广播,就要有发送和接收两部分完成
常见的广播事件有:外拨电话、接收到的短信、开机启动完成、SD卡的插拔、软件的安装、卸载、升级、电量的变化等等,当应用程序通过广播接收到这些事件后,就可以根据不同的事件做出不同的事情
2.广播的作用
广播接收者是Android四大组件之一,可以将一个事件作为一个广播消息,发送或通知给其它应用程序,当其他应用程序接收到这个信息后,就可以根据这个事件来进行其它相应的操作,类似于事件的监听
2.2.1 注册一般的广播接收者
a:广播发送者
public class MainActivity extends Activity {//1.Activity为广播发送者 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //点击事件,按钮为:发送广播 Button main_bt = (Button) findViewById(R.id.main_bt); main_bt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent();//通过意图携带广播信息 intent.setAction("com.cm.ccm.Receive_1.send");//设置(广播事件的名称)action,接受者要在intent-filter中配置相应的action才能接收到广播 intent.putExtra("key", "广播体操现在开始...");//设置传递的数据使用putExtra()方法,该方法类似Map集合,以键值对的方式存储数
sendBroadcast(intent,"com.cm.ccms");//发送广播,可以带权限也可以不带权限
}
});
}
}
b:广播接受者:
public class Receive_1 extends BroadcastReceiver {//1.定义一个类继承BroadcastReceiver @Override //2.在manifest中配置意图过滤器,ps:见下一段代码 public void onReceive(Context arg0, Intent arg1) { //并重写onReceiver()方法,当接收到广播后,系统会调用这个方法
String info = arg1.getStringExtra("key");//获取广播中意图携带的信息
System.out.println(info);
System.out.println("马上开始");
}
}
c:广播接受者在manifest中添加receiver节点:允许当前应用程序接收到其它应用程序发送的动作或数据的广播
1 <receiver 2 android:name="com.cm.ccm.Receive_1"> 3 <intent-filter> 4 <action android:name="com.cm.ccm.Receive_1.send" /> 5 </intent-filter> 6 </receiver>
d:权限配置
<uses-permission android:name="com.cm.ccms" /> <permission android:name="com.cm.ccms" android:protectionLevel="normal"></permission>
3.有序广播&广播拦截
3.1什么是有序广播
当广播发送后,广播会按照接收者的优先级,逐级的发送广播
a:广播发送者
1 public class MainActivity extends Activity { 2 //发送有序广播 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 Intent intent = new Intent(); 8 //设置action过滤 9 intent.setAction("com.cm.ccm.sendmashroom"); 10 //发送有序广播 11 sendOrderedBroadcast(intent, null, new MyReceiver(), null, 1, "发蘑菇喽", null); 12 } 13 }
b:广播接收者之一(New MyReceiver() 是最后一个接收到广播的人,而且一定能接收到(间谍式))
1 public class MyReceiver extends BroadcastReceiver { 2 3 @Override 4 public void onReceive(Context context, Intent intent) { 5 String result = getResultData();//该方法获取到上层传来的广播 6 System.out.println("蘑菇,你好"+result); 7 } 8 }
c:其他级别的广播接收者
1 public class MyReceiver1 extends BroadcastReceiver { 2 @Override 3 public void onReceive(Context context, Intent intent) { 4 String resultData =http://www.mamicode.com/ getResultData(); 5 System.out.println(resultData+"收到10斤蘑菇"); 6 setResultData("只发两斤蘑菇");//高优先级可以更改广播内容 7 abortBroadcast();//高优先级可以中断广播 8 } 9 }
d:manifest文件中优先级的设置:接收者将会按优先级的大小接收广播,值越大,优先级越高, 开发文档中的规范最大值为1000,最小的为-1000,但实际上最大值可以写int类型的最大值2147483647
1 <receiver 2 android:name="com.cm.ccm.MyReceiver1" > 3 <intent-filter android:priority="1000"> 4 <action android:name="com.cm.ccm.sendmashroom" /> 5 </intent-filter> 6 </receiver>
4.在代码中注册广播接收者(动态发送接受广播:代码中注册)
适用范围:有些操作比较频繁,那么如果使用在清单文件中注册广播接收者是接收不到的,例如频繁的锁屏解屏,所以就必须在代码中注册广播接收者
a:广播发送者
1 public class MainActivity extends Activity { 2 //广播接受者 3 MyReceiver receiver; 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.activity_main); 8 //创建广播接受者对象 9 receiver = new MyReceiver(); 10 //创建意图过滤器对象 11 IntentFilter filter = new IntentFilter(); 12 //通过意图过滤器添加事件名称 13 filter.addAction("android.intent.action.SCREEN_ON"); 14 filter.addAction("android.intent.action.SCREEN_OFF"); 15 //注册广播接受者 16 registerReceiver(receiver, filter); 17 } 18 @Override 19 protected void onDestroy() {//动态注册的广播一定记得在应用退出时,注销广播,否则会造成内存泄露; 20 unregisterReceiver(receiver); 21 super.onDestroy(); 22 } 23 }
b:广播接收者:不需要再manifest中配置
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction();//获取广播发送者中intent-filter对象所添加的事件 System.out.println("hellow"+action); }
广播基础