Android广播基础了解(非有序)

来源:互联网 发布:后窗解析知乎 编辑:程序博客网 时间:2024/06/13 11:26
Android广播监听系统广播(这里以系统电量变化举例,其他广播监听也可以这样实现)
一、广播的基本流程:
1、建立广播。
2、添加过滤器。
3、注册广播。
4、发送广播。(如果系统广播,系统会发送,在接收广播处理处添加代码即可)
5、接收广播并处理。
6、注销广播:(这个要么注册、注销各一次,先注册,后注销。或者是成对出现,成对出现也要遵循先注册后注销)
二、具体步骤:
1、广播创建:(接收处理代码也在此处)
//代码创建广播  可以监听系统广播和自定义sendBroadcast的广播
  /* create BroadcastReceiver */
  private BroadcastReceiver mBatInfoReceiver=new BroadcastReceiver()
  {
    public void onReceive(Context context, Intent intent)
    {
      String action = intent.getAction();
      /* 如果捕捉到的action是ACTION_BATTERY_CHANGED,
       * 就执行onBatteryInfoReceiver() */
      if (Intent.ACTION_BATTERY_CHANGED.equals(action))
      {
        intLevel = intent.getIntExtra("level", 0);
        intScale = intent.getIntExtra("scale", 100);
        onBatteryInfoReceiver(intLevel,intScale);     //监听到广播后的处理方式 这个可以根据需求来自己写
      }
    }
  };
2、添加过滤器,注册广播:
        /* 注册几个系统 BroadcastReceiver,作为访问电池计量之用 */
    //广播的过滤,注册广播
        registerReceiver  ( mBatInfoReceiver,    new IntentFilter(Intent.ACTION_BATTERY_CHANGED) );
3、发送广播:
由于Android电量变化是系统广播,此处不用添加sendBroadcast(intent i);代码的实现。
4、处理广播在1中实现。
5、注销广播 : 
 unregisterReceiver(mBatInfoReceiver);    //与注册广播成对使用

如果多个动作要监听可以这样实现:
  IntentFilter filter = new IntentFilter();
  filter.addAction(“hi.hello”);
  filter.addAction(“hello.world”);
  registerReceiver(mBatInfoReceiver, filter);
然后通过sendBroadcast(intent i);发送广播
比如:
    Intent intent1 = new Intent(“hi.hello”);  
    sendBroadcast(intent1);

 Intent intent2 = new Intent(“hello.world”);  
    sendBroadcast(intent2);

相关代码:(该代码是网上找的demo,忘记了出处,贴出来做参考)
package irdc.ex06_02;
/* import相关class */
import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class EX06_02 extends Activity
{
  /* 变量声明 */
  private int intLevel;
  private int intScale;
  private Button mButton01;
  private AlertDialog d;
 
//代码创建广播
  /* create BroadcastReceiver */
  private BroadcastReceiver mBatInfoReceiver=new BroadcastReceiver()
  {
    public void onReceive(Context context, Intent intent)
    {
      String action = intent.getAction();
      /* 如果捕捉到的action是ACTION_BATTERY_CHANGED,
       * 就执行onBatteryInfoReceiver() */
      if (Intent.ACTION_BATTERY_CHANGED.equals(action))
      {
        intLevel = intent.getIntExtra("level", 0);
        intScale = intent.getIntExtra("scale", 100);
        onBatteryInfoReceiver(intLevel,intScale);     //监听到广播后的处理方式 这个可以根据需求来自己写
      }
    }
  };
   
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    /* 加载main.xml Layout */
    setContentView(R.layout.main);
   
    /* 初始化Button,并设定按下后的操作 */
    mButton01 = (Button)findViewById(R.id.myButton1);
    mButton01.setOnClickListener(new Button.OnClickListener()
    {
      @Override
      public void onClick(View v)
      {
        /* 注册几个系统 BroadcastReceiver,作为访问电池计量之用 */
    //广播的过滤
        registerReceiver  ( mBatInfoReceiver,    new IntentFilter(Intent.ACTION_BATTERY_CHANGED) );
      }


对应的广播接收代码添加多几个判断即可。
    });
  }
 
  /* 拦截到ACTION_BATTERY_CHANGED时要执行的method */
  public void onBatteryInfoReceiver(int intLevel, int intScale)
  {
    /* create 弹出的对话窗口 */
    d = new AlertDialog.Builder(EX06_02.this).create();
    d.setTitle(R.string.str_dialog_title);
    /* 将取得的电吕计量显示于Dialog中 */
    d.setMessage(getResources().getString(R.string.str_dialog_body)+
                 String.valueOf(intLevel * 100 / intScale) + "%");
    /* 设定返并加画面的按钮 */
    d.setButton(getResources().getString(R.string.str_button2),
                new DialogInterface.OnClickListener()
      {
        @Override
        public void onClick(DialogInterface dialog, int which)
        {   
          /* 反注册Receiver,并关闭对话窗口 */
          unregisterReceiver(mBatInfoReceiver);    //与注册广播成对使用
          d.dismiss();
        }
      });
    d.show();
  }
}


Android广播代码简单实现:(以点击按钮,成功发送一个广播为例)
一、Android广播基本流程是:
1、建立广播。
2、添加过滤器。
3、注册广播。
4、发送广播。
5、接收广播并处理。
6、注销广播。

二、具体实现。
1、建立广播:复写onReceive,通过 intent.getAction();获取接收到的广播。此广播可以是系统广播或者自定义广播。
private String msg="bc.bc.lin";
 private BroadcastReceiver myBroadCast=new BroadcastReceiver() {
 
  @Override
  public void onReceive(Context context, Intent intent) {
   // TODO Auto-generated method stub
   intent.getAction();
   if(msg.equals(intent.getAction()))
   {
    System.out.println("success BCTEST");
   }
   
  }
 }; 
2、添加过滤器:此处可以添加多个动作。用filter.addAtion()方法。
  IntentFilter filter = new IntentFilter();
  filter.addAction(msg);

3、注册广播:
  registerReceiver(myBroadCast, filter ); //确保注册广播和销毁广播只执行一次,或只是先后执行成对出现。不然会报错。

4、发送广播:
    Intent i=new Intent(msg);
    sendBroadcast(i); 
5、接收广播并处理:代码看1中的判断。
6、注销广播:一般在onDestroy()中处理。
 unregisterReceiver(myBroadCast);
 System.out.println("UnRegister BCTEST"); 

简单代码:
package com.example.mybroadcast;
import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
 private Button btnSendBC=null;
 private String msg="hi.hello.bc";
 private BroadcastReceiver myBroadCast=new BroadcastReceiver() {
 
  @Override
  public void onReceive(Context context, Intent intent) {
   // TODO Auto-generated method stub
   intent.getAction();
   if(msg.equals(intent.getAction()))
   {
    System.out.println("success BCTEST");
   }
   
  }
 };
 
 
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  btnSendBC=(Button)findViewById(R.id.btnSendBroadCast);
  IntentFilter filter = new IntentFilter();
  filter.addAction(msg);
  registerReceiver(myBroadCast, filter );
  System.out.println("Register BCTEST");   //确保注册广播和销毁广播只执行一次,或只是先后执行成对出现。不然会报错。
//本代码中在onDestory ()中注销广播。
  btnSendBC.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    Intent i=new Intent(msg);
    sendBroadcast(i);
    System.out.println("send BCTEST");
   }
  });
 }
@Override
protected void onDestroy() {
 // TODO Auto-generated method stub
 unregisterReceiver(myBroadCast);
 System.out.println("UnRegister BCTEST");
 super.onDestroy();
}
@Override
protected void onResume() {
 // TODO Auto-generated method stub
 super.onResume();
}
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.activity_main, menu);
  return true;
 }
}

Android广播在 AndroidManifest.xml文件中 添加过滤器:(以应用程序要开机自启动为例)
开机自启动主要是监听到Android开机完成的广播"android.intent.action.BOOT_COMPLETED"

代码如下:
1、主文件代码:
package com.example.healthp;
import com.example.healthp.MainActivity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
/**
 * 开机自启动类
 */
public class BootBroadcastReceiver extends BroadcastReceiver {
//如果监听到开机完成广播后,用intent 跳转到相应的Activity 或者做相应的代码处理。
 static final String ACTION = "android.intent.action.BOOT_COMPLETED";
    // MainActivity m=new MainActivity();
 @Override
 public void onReceive(Context context, Intent intent) {
  if (intent.getAction().equals(ACTION))
  {
 
   Intent intentHello=new Intent();  
    intentHello.setComponent(new ComponentName(context,MainActivity.class));
   intentHello.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
   context.startActivity(intentHello);
  }
 }
}

2、在Android AndroidManifest.xml文件中 的Application 标签域内添加红色字体的广播注册
         
         <application
                                *****
                                *****
              <receiver android:name="com.example.healthp.BootBroadcastReceiver" >    
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"></action>
            </intent-filter>
        </receiver>
                                ********
                                *****
    </application>
说明:
com.example.healthp 为BootBroadCastReceive.java文件所在的包名

android.intent.action.BOOT_COMPLETED   过滤开完成广播


Android 广播官方网址 http://developer.android.com/reference/android/content/BroadcastReceiver.html 





0 0
原创粉丝点击