BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。
在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。
Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现在只需等待广播告知自己就可以了,大大减少了开发的工作量和开发周期。而作为应用开发者,就需要数练掌握Android系统提供的一个开发利器,那就是BroadcastReceiver。下面我们就对BroadcastReceiver逐一地分析和演练,了解和掌握它的各种功能和用法。
首先,我们来演示一下创建一个BroadcastReceiver,并让这个BroadcastReceiver能够根据我们的需要来运行。
要创建自己的BroadcastReceiver对象,我们需要继承android.content.BroadcastReceiver,并实现其onReceive方法。下面我们就创建一个名为MyReceiver广播接收者:
BroadcastReceiver逐一地分析和演练,了解和掌握它的各种功能和用法。
首先,我们来演示一下创建一个BroadcastReceiver,并让这个BroadcastReceiver能够根据我们的需要来运行。
要创建自己的BroadcastReceiver对象,我们需要继承android.content.BroadcastReceiver,并实现其onReceive方法。
创建一个新工程LearnBroadcastReceiver,一个空Activity
| |||||||||
创建一个MyReceiver, MyReceiver1, MyReceiver2 广播接收类扩展至 | |||||||||
public class MyReceiver extends BroadcastReceiver { public MyReceiver() { } @Override public void onReceive(Context context, Intent intent) { System.out.println("第0个广播接收器接收到消息是:====="+intent.getStringExtra("data")); } }
| |||||||||
public class MyReceiver1 extends BroadcastReceiver { public MyReceiver1() { } @Override public void onReceive(Context context, Intent intent) { System.out.println("第1个广播接收器接收到消息是:"+intent.getStringExtra("data")); if (intent.getStringExtra("isLanJie").equals("TRUE")) { abortBroadcast(); //拦截广播,不让优先级别低的接收该到消息 } } }
| |||||||||
public class MyReceiver2 extends BroadcastReceiver { public static final String ACTION="com.czg.com.learnbroadcastreceiver.intent.action.MyReceiver2"; public MyReceiver2() { } @Override public void onReceive(Context context, Intent intent) { System.out.println("第2个广播接收器接收到消息是:" + intent.getStringExtra("data")); if (intent.getStringExtra("isLanJie").equals("TRUE")){ abortBroadcast(); //拦截广播,不让优先级别低的接收该到消息 } } }
| |||||||||
修改androidManifest.xml中广播接收器 <receiver android:name=".MyReceiver" android:enabled="true" android:exported="true" > </receiver> <!--<receiver android:name=".MyReceiver2" >--> <!--<intent-filter>--> <!--<action android:name="com.czg.com.learnbroadcastreceiver.intent.action.MyReceiver2" />--> <!--</intent-filter>--> <!--</receiver>--> <receiver android:name=".MyReceiver1" android:enabled="true" android:exported="true" > <intent-filter android:priority="1"> <action android:name="com.czg.com.learnbroadcastreceiver.intent.action.MyReceiver2" /> </intent-filter> </receiver>
| |||||||||
| |||||||||
在创建完我们的MyReceiver2之后,还不能够使它进入工作状态,我们需要为它注册一个指定的广播地址。没有注册广播地址的BroadcastReceiver就像一个缺少选台按钮的收音机,虽然功能俱备,但也无法收到电台的信号。 | |||||||||
public class MainActivity extends AppCompatActivity implements View.OnClickListener { Button bSend; private MyReceiver2 myReceiver2=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bSend=(Button) findViewById(R.id.btnSendMsg); bSend.setOnClickListener(this); findViewById(R.id.btnReg).setOnClickListener(this); findViewById(R.id.btnUnReg).setOnClickListener(this); findViewById(R.id.btnsendYinShi).setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btnSendMsg: //发送消息 Intent intent=new Intent(this,MyReceiver.class); intent.putExtra("data", "消息来自czg"); sendBroadcast(intent); break; case R.id.btnsendYinShi: //没有自动注册的广播接收器自能用隐式的Intent进行创建(没有告诉要发送给哪个接收器,所有的接收器都可以接受到,优先级比较高的接收器可以根据需要拦截后面接收的的接收) Intent intent2=new Intent(MyReceiver2.ACTION); intent2.putExtra("data","消息来自czg"); CheckBox cb= (CheckBox) findViewById(R.id.checkBox); if (cb.isChecked()==true){ intent2.putExtra("isLanJie","TRUE"); }else { intent2.putExtra("isLanJie","FALSE"); } //sendBroadcast(intent2); sendOrderedBroadcast(intent2, null); //发送可以被拦截的广播,第二个参数可以指定权限 break; case R.id.btnReg: //注册 if (myReceiver2==null){ myReceiver2=new MyReceiver2(); registerReceiver(myReceiver2,new IntentFilter(MyReceiver2.ACTION)); } break; case R.id.btnUnReg: //注销 if (myReceiver2!=null){ unregisterReceiver(myReceiver2); myReceiver2=null; } break; } } }
|