Broadcast广播的使用

来源:互联网 发布:淘宝发空包什么意思 编辑:程序博客网 时间:2024/04/29 19:52

broadcast作为Android四大组件之一,当然只要要使用都必须的先注册,当然broadcast的注册可以分为静态,和动态注册两种情况

1,broadcast的静态注册

 //--静态注册广播        btn = (Button)findViewById(R.id.btn);        //--触发广播        btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//--发送广播Intent intent = new Intent("myReceiver");sendBroadcast(intent);}});

还需要有一个类是继承Braodcast接受广播

public class MyReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "广播被触发", 500).show();}}

还有就是在注册文件中注册

 <receiver android:name="com.htwx.receiver.MyReceiver">            <intent-filter >                <action android:name="myReceiver"></action>            </intent-filter>        </receiver>


2,broadcast的动态注册

  //--动态注册广播        receiver = new DtReceiver();        IntentFilter filter = new IntentFilter();        filter.addAction("dt_receiver");        registerReceiver(receiver, filter);                        btn_dt = (Button)findViewById(R.id.btn_dt);        //--触发广播        btn_dt.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent("dt_receiver");intent.putExtra("name", "张三");sendBroadcast(intent);}});

再看看继承Broadcast的类

public class DtReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String name = intent.getStringExtra("name");Toast.makeText(context, "动态广播被触发:"+name, 500).show();}}

这里面同样是可以传输数据,通过intent的putExtra()方法,再在广播这边进行接受用到了getStringExtra()方法,因为在接受的一方的这个有一个参数intent,就是传输过来的intent,所以可以直接使用getStrngExtra不用在new一个Intent对象

  

还有一个就是在broadcast里面通过intent进行一个activity之间的跳转,由于这个broadcast没有界面显示

public void onReceive(Context context, Intent intent) {Toast.makeText(context, "broadcast--------------", Toast.LENGTH_LONG).show();Intent  next = new Intent(context,Other.class);next.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(next);}

注意这里不能使用隐身intent,因为这个这里没有显示这个界面显示。再就是在一个broadcast中调用一个Activity,因为没有上下文对象这个需要在给这个intent需要必须重启一个新任务.

一个广播接收者有一个回调方法:void onReceive(Context curContext, Intent broadcastMsg)。当一个广播消息到达接收者是,Android调用它的onReceive()方法并传递给它包含消息的Intent对象。广播接收者被认为仅当它执行  这个方法时是活跃的。当onReceive()返回后,它是不活跃的。 
有一个活跃的广播接收者的进程是受保护的,不会被杀死。但是系统可以在任何时候杀死仅有不活跃组件的进程,当占用的内存别的进程需要时。 
这带来一个问题,当一个广播消息的响应时费时的,因此应该在独立的线程中做这些事,远离用户界面其它组件运行的主线程。如果onReceive()衍生线程然后返回,整个进程,包括新的线程,被判定为不活跃的(除非进程中的其它应用程序组件是活跃的),将使它处于被杀的危机。解决这个问题的方法是onReceive()启动一个服务,及时服务做这个工作,因此系统知道进程中有活跃的工作在做。


0 0