小丸子在这里祝愿大家愚人节快乐!记得不要被坑的说。。。。。。
这次的 BroadcastReceiver 的学习也是在慕课网上,在此感谢慕课网为我们提供这样一个免费的学习平台。
BroadcastReceiver
1.Broadcast
既然我们要学习广播接收器,那么我们首先要知道广播为何物,Broadcast,广播就是一种能在应用之间传输信息的机制,说白了就是传送消息。
1.1Broadcast的分类
1.1.1普通广播(Normal Broadcast)
所有监听该广播的广播接收者都可以监听到该广播
特点:
同级别接收先后是随机的(无序的)
级别低的后接收到广播
接收器不能截断广播的继续传播也不能对广播进行处理
同级别的动态注册高于静态注册(这里不懂没关系在下面会有介绍,请耐心往下看)
1.1.2有序广播(Ordered Broadcast)
按照接收者的优先级别顺序进行接收广播,优先级别在<intent-filter>的priority中声明,级别的范围在 -1000 - 1000 之间,值越大,级别就越高,还可以对广播进行终止,不让意图继续传播,接收者可以篡改内容。
特点:
同级别接收先后是随机的
能截断广播的继续传播,高级别的广播接收器手动改广播后,可以决定把该广播是否截断
接收器能截断广播也能处理广播,同时将处理后的广播继续发送
同级别动态注册高于静态注册
1.1.3异步广播(粘滞性滞留广播)
不能将结果传给下一个广播接收器,无法对广播进行终止。
特点:
可以先发送广播,再注册广播接收器
2.BroadcastReceiver
广播接收器,官方说法就是对发送出来的广播进行过滤并且进行接收响应的一类组件,其实就是用来接收系统以及应用的广播。
2.1注意事项
2.1.1 BroadcastReceiver同Activity,Service,ContentProvider一样需要注册,有静态注册和动态注册两种。
2.1.2 BroadcastReceiver的生命周期只有10s左右,5s左右的时候也会报ANR,再过一点时间就会直接崩溃。
2.1.3 BroadcastReceiver里面不能做一些耗时的操作。
2.1.4 耗时操作可通过Intent发送给Service由它来完成。
2.1.5 BroadcastReceiver不能使用子线程,因为它生命周期短,一旦被销毁,子线程也会被kill。
2.1.6 如果动态注册,一定要在合适的位置unRegisterReceiver。
3.举例
如果手机开机,那么系统就会发送一条开机的广播;
如果网络状态改变,那么系统就会发送一条关于网络状态改变的广播等等。。。。。。
如果还不是很清楚的话,没关系,接下来会通过一个小demo跟大家一起来进行学习。
----------------------------------------------------重点来啦----------------------------------------------------我们来写代码啦---------------------------------------
首先我来介绍一下基本的用法:
发送:把信息装入一个Intent的实例对象,例如Action,通过调用相应的方法将Intent对象以广播的方式发送出去,方法如下:
sendBroadcast()
sendOrderBroadcast()
sendStickyBroadcast()
显而易见,这三种发送方法对应的就是三种广播。
接收:当Intent发送出去之后呢,所有已经进行注册的广播接收器都会检查注册时候的<IntentFilter>是否与所检查到的广播Intent相匹配,匹配的话就会调用广播接收器的onReceive()方法,所以当我们写一个BroadcasrReceiver的子类的时候记得实现这个方法。
首先我们来实现布局,一共由三个按钮组成:
<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btn_send_normal"
android:layout_width="match_parent"
android:layout_height="0dp"
android:text="@string/send_normal"
android:layout_weight="1"/>
<Button
android:id="@+id/btn_send_order"
android:layout_width="match_parent"
android:layout_height="0dp"
android:text="@string/send_order"
android:layout_weight="1"/>
<Button
android:id="@+id/btn_send_other"
android:layout_width="match_parent"
android:layout_height="0dp"
android:text="@string/send_other"
android:layout_weight="1"/>
</LinearLayout></span>
效果图是这样滴:
接下来我们来回到我们的Activity:
<span style="font-size:14px;">public class BroadcastReceiverTestActivity extends Activity implements View.OnClickListener {
private BroadcastReceiverChild3 bc3 = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broadcast_provider);
findViewById(R.id.btn_send_normal).setOnClickListener(this);
findViewById(R.id.btn_send_order).setOnClickListener(this);
findViewById(R.id.btn_send_other).setOnClickListener(this);
/* IntentFilter intentFilter = new IntentFilter("com.glimmer.myapplication.BroadcastReceiverTestActivity");
BroadcastReceiverChild2 brc2 = new BroadcastReceiverChild2();
registerReceiver(brc2, intentFilter);*/
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_send_normal:
Intent intent = new Intent();
intent.putExtra("BroadcastReceiverTestActivity", "我是广播君,么么哒~");
intent.setAction("com.glimmer.myapplication.BroadcastReceiverTestActivity");
sendBroadcast(intent);
break;
case R.id.btn_send_order:
Intent intent1 = new Intent();
intent1.putExtra("BroadcastReceiverTestActivity", "我是有序的广播君,么么哒~");
intent1.setAction("com.glimmer.myapplication.BroadcastReceiverTestActivity");
sendOrderedBroadcast(intent1,null);
break;
case R.id.btn_send_other:
Intent intent2 = new Intent();
intent2.putExtra("BroadcastReceiverTestActivity", "我是吊炸天的异步的广播君,么么哒~");
intent2.setAction("com.glimmer.myapplication.BroadcastReceiverTestActivity1");
sendStickyBroadcast(intent2);
IntentFilter intentFilter = new IntentFilter("com.glimmer.myapplication.BroadcastReceiverTestActivity1");
bc3 = new BroadcastReceiverChild3();
registerReceiver(bc3, intentFilter);
break;
default:
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(bc3);
}
}
</span>
在这里,我来说一下,动态注册与静态注册的问题。
动态注册:
<span style="font-size:14px;"> IntentFilter intentFilter = new IntentFilter("com.glimmer.myapplication.BroadcastReceiverTestActivity1");
bc3 = new BroadcastReceiverChild3();
registerReceiver(bc3, intentFilter);</span>
这样就实现了动态注册,大家也可以在代码中的onDestroy()看到我在这里将动态注册的广播接收器给取消注册啦。
静态注册:
在AndroidManifest.xml里面进行注册
<span style="font-size:14px;"> <receiver
android:name=".BroadcastReceiverChild2">
<intent-filter>
<action android:name="com.glimmer.myapplication.BroadcastReceiverTestActivity"/>
</intent-filter>
</receiver></span>
只有Intent的Action与广播接收器的Action一样的时候才能被接收到哦~
下面贴一下BroadcastReceiver的代码:
<span style="font-size:14px;">public class BroadcastReceiverChild extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("BroadcastReceiverTestActivity");
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
//abortBroadcast();
Bundle bundle = new Bundle();
bundle.putString("BC1","我是有序广播可以传消息哦~");
setResultExtras(bundle);
}
}</span>
那个abortBroadcast()是用来截断广播的哦~~大家去修改一下优先级,试试
优先级这么写哈:
<span style="font-size:14px;"> <receiver
android:name=".BroadcastReceiverChild">
<intent-filter
android:priority="100">
<action android:name="com.glimmer.myapplication.BroadcastReceiverTestActivity"/>
</intent-filter>
</receiver>
</span>
<span style="font-size:14px;">public class BroadcastReceiverChild2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("BroadcastReceiverTestActivity");
Toast.makeText(context, msg+"2", Toast.LENGTH_SHORT).show();
Bundle bundle = getResultExtras(true);
String msg2 = bundle.getString("BC1");
Toast.makeText(context, msg2, Toast.LENGTH_SHORT).show();
}
}</span>
<span style="font-size:14px;">public class BroadcastReceiverChild3 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("BroadcastReceiverTestActivity");
Toast.makeText(context,msg,Toast.LENGTH_SHORT).show();
}
}
</span>
不知道大家看懂了没~END