您的位置:首页 > 其它

初学安卓的踩过的坑和心得体会(三)——Broadcast Receiver

2018-01-09 19:45 169 查看

一、广播接收器基本传值

首先我们要知道Broadcast Receiver是一个低效的广播,在需要频繁使用或者数据量很大的时候不建议使用,否则会导致程序运行缓慢。

Broadcast Reveicer的声明注册同Activity一样,先在mainActivity的同级目录下新建一个java类,然后到Androidmanifest中声明即可。
在新建Broadcast Receiver 之后会有一个方法onReveicer(),我们在期中打印一句话“onReveicer”。
public class BroadcastReveicer extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("onReceiver");
}
}


在xml文件中新建一个按钮,并且回到主类进行声明,给按钮一个监听器,监听器里面直接调用sendBroadcastReveicer方法即可。
接着在MainActivity类中绑定一个单击事件,由于本类继承了Activity所以可以直接调用sendBroadcast方法然后进行广播接收。
public class MainActivity extends AppCompatActivity {
private Button butReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
butReceiver=findViewById(R.id.button);
butReceiver.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sendBroadcast(new Intent(MainActivity.this, BroadcastReceiver.class));
}
});
}
}
我们将intent提出来,将文本放入其中就可以实现传递值的操作
public class MainActivity extends AppCompatActivity {
private Button butReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
butReceiver=findViewById(R.id.button);
butReceiver.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i=new Intent(MainActivity.this, BroadcastReceiver.class);
i.putExtra("name","value");
sendBroadcast(i);
}
});
}
}
回到BroadcastReceiver获取值
public class BroadcastReveicer extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("onReceiver"+intent.getStringExtra("name"));
}
}



二、动态注册和注销广播接收器

先回到andriodmanifest中删除掉刚刚注册的Receiver语句
<receiver android:name=".BroadcastReveicer"></receiver>

接着在mainActivity中新建两个按钮,分别是注册和注销,然后分别加上两个监听器
public class MainActivity extends AppCompatActivity {
private Button butReceiver,zhuce,zhuxiao;
private final BroadcastReceiver2 mybc=new BroadcastReceiver2();

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
butReceiver=findViewById(R.id.button);
zhuce=findViewById(R.id.zhuce);
zhuce.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
registerReceiver(mybc,new IntentFilter(BroadcastReceiver2.action));
}
});
zhuxiao=findViewById(R.id.zhuxiao);
zhuxiao.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
unregisterReceiver(mybc);
}
});

butReceiver.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i=new Intent(BroadcastReceiver2.action);
i.putExtra("name","value");
sendBroadcast(i);
}
});
}

}


我们将intent的构造方法也换为使用action的而在broadcast中也新增了一个变量,作为寻址使用,只要监听器寻找这个地址,就可以建立连接。
public class BroadcastReceiver2 extends BroadcastReceiver {

public static final String action="com.example.koogllz.myBroadcastReceiver.intent.action.BroadcastReceiver";
public void onReceive(Context context, Intent intent) {
System.out.println("onReceiver"+intent.getStringExtra("name"));
}
}
我们运行之后发现在注册之后才能进行广播,否则不可以,在注销之后也是同样不能广播。

三、总结

在命名的时候一定要符合规范并且无误,今天因为打反字母顺序导致一个bug卡了半天,耽误了很多时间。
要记住一些方法名字,尽量能够手敲而不是用编译器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息