BroadcastRceiver是android四大组件的其中一个,可以用于活动和服务,应用和应用,应用和系统之间的通信。
下面是对广播进行简单的学习
广播的分类有:1.系统广播 由系统发出
2.应用广播 由应用程序发出,也称自定义广播
广播同时也分:异步广播,发送使用sendBroadcast(intent);
方法和有序广播,发送使用sendOrderedBroadcast(intent, null);
方法。
广播的注册有:
1.动态注册 用代码做, 适合用在应用广播(自定义的),可节省一些资源.
2.静态注册 在清单文件标签中注册, 适合用在系统广播,但会消耗更多资源
1.应用(自定义)异步广播
首先我们新建一个子类,继承自广播类,重写生命周期onReceive()方法,用于接收广播。
此处只是测试,所以只是用Tost提示一个信息而已。
package com.ql.broadcastrceiverdemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver1 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, intent.getStringExtra("bc"), Toast.LENGTH_SHORT).show();
}//"bc"->Intent通信的标签
}
因为是自定义的广播,所以需要有触发才能发送,在此使用一个按钮的点击事件进行触发。在Activity的按钮事件中
case R.id.btn_send1:
//发送自定义广播(应用广播)
Intent intent=new Intent();
intent.setAction("com.ql.broadcastrceiverdemo.action1");//设置动作字符串(常量) 用来匹配intent的动作决定启动接收器,必须与清单文件中的一致
intent.putExtra("bc", "this is my broadcast1....");
sendBroadcast(intent);//发送一个异步广播
break;
注册广播
setAction为在清单文件中进行注册的action,表明发给谁,谁来收,如下:
<receiver android:name="com.ql.broadcastrceiverdemo.MyReceiver1" >
<!--为MyReceiver1注册广播 -->
<intent-filter>
<action android:name="com.ql.broadcastrceiverdemo.action1" />
</intent-filter>
</receiver>
2.系统广播
不需要自己发送广播,由系统发出的广播触发
同样需要新建子类,并重写生命周期onReceive方法,用于接收广播。在这我们进行监听程序安装和卸载的两个系统广播。
package com.ql.broadcastrceiverdemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
/**
* 调用系统广播(由系统发出)
* @author qinlang
*
*/
public class MyReceiver2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//如果是安装程序
if(intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)){
String pkgName=intent.getData().getSchemeSpecificPart();//获得应用的包名
Log.e("ql debug", pkgName+"应用安装成功!!!");
}
//如果是卸载程序
if(intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)){
String pkgName=intent.getData().getSchemeSpecificPart();//获得应用的包名
Log.e("ql debug", pkgName+"应用卸载成功!!!");
}
}
}
然后在清单文件中注册我们的广播
<receiver android:name="com.ql.broadcastrceiverdemo.MyReceiver2" >
<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>
3.动态注册广播
前面两种方法都是静态注册的广播,这个方法是用代码讲如何动态的注册广播。
首先还是新建一个广播子类,用于接收广播。
package com.ql.broadcastrceiverdemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver3 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, intent.getStringExtra("bc"), Toast.LENGTH_SHORT).show();
}
}
然后活动java代码部分
public class TestActivity extends Activity {
private MyReceiver3 receiver;
private IntentFilter filter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
receiver = new MyReceiver3(); //构造接收器对象
filter = new IntentFilter(); //构造过滤器对象
filter.addAction("com.ql.broadcastrceiverdemo.action3"); //给过滤器设置动作字符串 用来匹配intent的动作决定启动接收器
Button button = (Button) findViewById(R.id.sendBr);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
intent.setAction("com.ql.broadcastrceiverdemo.action3");
intent.putExtra("bc", "this is my broadcast3....");
sendBroadcast(intent);//发送一个异步广播
}
});
}
@Override
protected void onResume() {
super.onResume();
registerReceiver(receiver, filter); // 注册广播接收器,在程序可以交互时注册
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(receiver); // 注销广播接收器
}
}
4.发送有序广播
有序,就是几个广播接收者有先后顺序,广播接收者需要提前设置优先级,优先级高的先接收到广播,优先级数值可为任意数值,一般是-1000~1000之间(数值越大越高)。在清单文件的标签中设置android:priority="10"
属性。如果没有指定优先级则按在清单文件中的注册先后顺序接收。
下面我们建了个广播子类
public class MyReceiver4 extends BroadcastReceiver {
private static final String TAG = "QL Debug";
@Override
public void onReceive(Context context, Intent intent) {
Log.e(TAG, "Myreceiver4:" + intent.getStringExtra("bc"));
Bundle bundle = new Bundle();//用bundle打包数据发送
bundle.putString("receiver4", "this is my receiver4 data.");
this.setResultExtras(bundle);
// this.abortBroadcast();//取消有序广播传递(可取消对后续广播接收者的继续发送)
}
}
public class MyReceiver5 extends BroadcastReceiver {
private static final String TAG = "QL Debug";
@Override
public void onReceive(Context context, Intent intent) {
Log.e(TAG, "Myreceiver5:" + this.getResultExtras(true).getString("receiver4"));
}
}
然后不要忘了在清单文件AndroidManifest.xml中注册。
<receiver android:name="com.ql.broadcastrceiverdemo.MyReceiver4" >
<intent-filter android:priority="1">
<action android:name="com.ql.broadcastrceiverdemo.action" />
</intent-filter>
</receiver>
<receiver android:name="com.ql.broadcastrceiverdemo.MyReceiver5" >
<intent-filter android:priority="9">
<action android:name="com.ql.broadcastrceiverdemo.action" />
</intent-filter>
</receiver>
最后在活动Activity中我们用按钮触发
case R.id.btn_send2:
Intent intent1=new Intent();
intent1.setAction("com.ql.broadcastrceiverdemo.action");
intent1.putExtra("bc", "I come from order broadcast!");
sendOrderedBroadcast(intent1, null);//发有序广播
break;