释放双眼,带上耳机,听听看~!
所有的注意事项都在代码的注释里面 值得注意的是广播里面不能做耗时操作
package com.imooc.www.moocdemo;
import android.content.*;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
/**
* Created by Administrator on 2016/5/13.
*/
public class BroadCastActivity extends AppCompatActivity implements View.OnClickListener {
private Button Bc1, Bc2, Bc3;
private BR2 bc2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.broadcastactivity);
Bc1 = (Button) findViewById(R.id.bc1);
Bc2 = (Button) findViewById(R.id.bc2);
Bc3 = (Button) findViewById(R.id.bc3);
Bc1.setOnClickListener(this);
Bc2.setOnClickListener(this);
Bc3.setOnClickListener(this);
//动态注册广播接收器。来接收广播,动态注册的广播优先级要高于在清单文件注册的广播接收器要高。值注意的是在程序结束的时候记得释放资源(在ondestory方法里取消这个注册器)
IntentFilter intentFilter = new IntentFilter("BC_1");
bc2 = new BR2();
registerReceiver(bc2,intentFilter);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bc1:
Intent intent = new Intent();
intent.putExtra("msg", "这是一条普通广播");
intent.setAction("BC_1");//这里要设置一个唯一标示 要跟清单文件的action里面的标识要保持一致。
BroadCastActivity.this.sendBroadcast(intent);
// Toast.makeText(BroadCastActivity.this,"点击了",Toast.LENGTH_LONG).show();
break;
case R.id.bc2:
Intent intent2 = new Intent();
intent2.putExtra("msg", "这是一条有序广播");
intent2.setAction("BC_1");
BroadCastActivity.this.sendOrderedBroadcast(intent2,null);
break;
case R.id.bc3:
break;
}
}
//动态注册的广播一定要在程序结束 的时候 取消这个接收器
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(bc2);
}
}
清单文件注册receiver代码如下
两个接收器的代码BC1,BC1位静态注册 ,在清单文件里面注册 代码如上所示。
package com.imooc.www.moocdemo;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
/**
* Created by Administrator on 2016/5/13.
*/
public class BR1 extends android.content.BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String s = intent.getStringExtra("msg");
System.out.println("recelier1 收到消息:"+s);
Bundle bundle = getResultExtras(true);
String s2 = bundle.getString("test");
//这里在打印从BR1传来的数据s2的时候要给s2加上.toString()不知道为什么否则不能收到值 值为null
System.out.println("通过广播传递的数据为:"+s2.toString());
}
}
BC2接收器代码 动态注册
package com.imooc.www.moocdemo;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
/**
* Created by Administrator on 2016/5/13.
*/
public class BR2 extends android.content.BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//BC2为动态注册的广播 优先级要高于静态注册的BC1广播接受者所以BC2会优先
//收到广播,在发送有序广播的时候在BC2接收到广播之后对广播进行拦截(abortBroadcast();)这样BC1
//就不会收到广播,值得注意的是普通广播是不能被截获的 否则会发生异常
String s = intent.getStringExtra("msg");
System.out.println("recelier2 收到消息:"+s);
//截获,终止广播的发送
// abortBroadcast();
//BC2是动态注册的广播接收器优先级高于BC1的静态注册广播会先收到广播数据那么此时我们
//可以在BC2收到广播后传递一些数据到BC1的接收器当中 但是这里不要进行耗时操作
//此处通过Bundle 传递一个字符串数据 在BC1中接收
Bundle bundle = new Bundle();
bundle.putString("test","广播处理数据");
setResultExtras(bundle);
System.out.println("广播"+bundle.toString());
}
}