首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络游戏 >

游戏开发3_02 交互式通信-BroadcastReceiver

2012-08-22 
游戏开发3_02 交互式通信---BroadcastReceiverBroadcastReceiver是Android中用处巨大的异步消息机制。它有

游戏开发3_02 交互式通信---BroadcastReceiver
    BroadcastReceiver是Android中用处巨大的异步消息机制。它有轻量和跨进程的性质。一个BroadcastReceiver对象的生命周期不超过5秒,不能绑定服务和做一些耗时的操作,但是用来收发信号和消息则戳戳有余。系统也经常有BroadcastReceiver发送消息。一下为用到的一些BroadcastReceiver的一些性质,与大家分享。

1.把耗内存很多的操作,(如:下载或流量统计)注册在一个跨进程的Service里面,通过BroadcastReceiver与前台通信。

<service android:name="NotiService" android:process=":remote" />

   private void sendBroad() {

      Intent it = new Intent();

      it.putExtra("netTraffic", getTotal());

      it.setAction("com.dragon.net");

      this.sendBroadcast(it);

   }



2.一些线程需要修改其他对象的属性,但是没有任何方法能确保杀死线程时、可以同通过解除注册BroadcastReceiver的方法与线程断开。

   @Override

   protected void onResume() {

      super.onResume();

      this.registerReceiver(mReceiver, new IntentFilter("org.rintail"));

   }

  

   @Override

   protected void onStop(){

      super.onStop();

      this.unregisterReceiver(mReceiver);

   }



   BroadcastReceiver mReceiver = new BroadcastReceiver() {

      @Override

      public void onReceive(Context context, Intent intent){

        long value = intent.getLongExtra("net", getCurrentValue());

        Log.d(this.getClass().getName(), "Rintail :" + value);

        changeSavedNum(value);

      }

   };



   private void changeSavedNum(long value) {

      netTraffic += value;

      if(netTraffic > getUplimit())

        this.unregisterReceiver(mReceiver);

   }



3.接收系统的消息,如开机启动消息, 短信消息,网络消息等。

      <receiver android:name="SystemStartReceiver"

   android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

        <intent-filter>

           <action android:name="android.intent.action.BOOT_COMPLETED" />

        </intent-filter>

      </receiver>







消息机制一般用于跨进程的通信,但是在我们的服务里面,也可以有很好的应用,

BroadcastReceiver是service与前台通信的一种途径。加之BroadcastReceiver的生命周期比较短,把临时耗内存多的行为通过此处理,在内存回收的时候会有一定优势。






在 Android 中使用 Activity, Service, Broadcast, BroadcastReceiver
  活动(Activity) - 用于表现功能
  服务(Service) - 相当于后台运行的 Activity
  广播(Broadcast) - 用于发送广播
  广播接收器(BroadcastReceiver) - 用于接收广播
  Intent - 用于连接以上各个组件,并在其间传递消息
  ==========================================================================
  BroadcastReceiver:
  在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件。下面将详细的阐述如何发送Broadcast和使用BroadcastReceiver过滤接收的过程:
  首先在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。
  当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法。
  注册BroadcastReceiver有两种方式:
  一种方式是,静态的在AndroidManifest.xml中用<receiver>标签生命注册,并在标签内用<intent- filter>标签设置过滤器。
  另一种方式是,动态的在代码中先定义并设置好一个 IntentFilter 对象,然后在需要注册的地方调Context.registerReceiver()方法,如果取消时就调用 Context.unregisterReceiver()方法。如果用动态方式注册的BroadcastReceiver的Context对象被销毁时,BroadcastReceiver也就自动取消注册了。(特别注意,有些可能需要后台监听的,如短信消息)
  另外,若在使用sendBroadcast()的方法是指定了接收权限,则只有在AndroidManifest.xml中用<uses- permission>标签声明了拥有此权限的BroascastReceiver才会有可能接收到发送来的Broadcast。同样,若在注册BroadcastReceiver时指定了可接收的Broadcast的权限,则只有在包内的AndroidManifest.xml中 用<uses-permission>标签声明了,拥有此权限的Context对象所发送的Broadcast才能被这个 BroadcastReceiver所接收。
  1.静态注册BroadcastReceiver:
  静态注册比动态注册麻烦点,先新建一个类继承BroadcastReceiver,如:
clsReceiver2.java
package com.testBroadcastReceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
/*
* 接收静态注册广播的BroadcastReceiver,
* step1:要到AndroidManifest.xml这里注册消息
*         <receiver android:name="clsReceiver2">
            <intent-filter>
                <action
                    android:name="com.testBroadcastReceiver.Internal_2"/>
            </intent-filter>
        </receiver>
    step2:定义消息的字符串
    step3:通过Intent传递消息来驱使BroadcastReceiver触发
*/
public class clsReceiver2 extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Toast.makeText(context, "静态:"+action, 1000).show();
    }
}
然后到AndroidManifest.xml 添加receive标签
<receiver android:name="clsReceiver2"> 
    <intent-filter> 
        <action 
            android:name="com.testBroadcastReceiver.Internal_2"/> 
    </intent-filter> 
</receiver>
第一个name是类名,即你的继承BroadcastReceiver的类的名字,里面实现了BroadcastReceive的onReceive()方法,来处理你接到消息的动作。
第二个name是action的名称,即你要监听的消息名字(其它消息都会被过滤不监听)。
2.动态注册BroadcastReceiver:
  主要代码部分为:
     IntentFilter intentFilter = new IntentFilter();
  intentFilter.addAction(String); //为BroadcastReceiver指定action,即要监听的消息名字。
     registerReceiver(MyBroadcastReceiver,intentFilter); //注册监听
     unregisterReceiver(MyBroadcastReceiver); //取消监听
  (一般:在onStart中注册,onStop中取消unregisterReceiver)
     private class MyBroadcastReceive extends BroadcastReceiver
     {
           public void onReceive(Context context, Intent intent)
           {
               String action = intent.getAction();
                if(intent.ACTION_BATTERY_CHANGED.equals(action)) //判断是否接到电池变换消息
                {
                   //处理内容
                 }
            }
      }
========================================================================
Broadcast:
发送广播消息,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法,把 Intent对象以广播方式发送出去。
例如:
Intent intent = new Intent(INTENAL_ACTION_3);
intent.putExtra("Name", "hellogv");
intent.putExtra("Blog", "http://blog.csdn.net/hellogv");
sendBroadcast(intent);//传递过去

热点排行