接收和发送广播

 要实现接收系统广播,一般需要分两步:

1  编写一个继承 BroadcastReceiver(抽象类)的子类 ,并实现onReceive方法,如果应用程序接收到系统发送到的广播,就会调用onReceive方法

2   在AndroidManifest.xml 文件中使用<receiver>标签来指定接收哪一个Broadcast  Action, 也可以不在AndroidManifest.xml文件中配置,直接在Java类通过registerReceiver 方法进行注册

以下示例一个可以开机启动的程序,代码见 ch07_startup工程,当手机或模拟器启动后,就会运行本例实现的程序,

要实现开机启动的功能,需要接收如下系统广播:  android.intent.action.BOOT_COMPLETED

主要代码:

第一步 编写一个StartupReceiver类,用于接收系统广播

public class StartupReceiver   extends  BroadcastReceiver  {

     @Override
     public void onReceive(Context context, Intent intent)  {
         Intent mainIntent = new Intent(context, Main.class);
         mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         context.startActivity(mainIntent);
     }

}

第二步 在AndroidManifest.xml 中配置StartupReceiver 类

<receiver android:name="StartupReceiver">
   <intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
    <category android:name="android.intent.category.HOME" />
   </intent-filter>
  </receiver>

------------------------------------------------------------------------

又一个示例,当用户接收到短信后,手机会向系统发送广播,如果我们的应用程序要在手机接收短信后做点什么,就需要先接收这个系统广播,再作进一步处理

主要代码:

第一步,编写java类:

public class SMSReceiver extends BroadcastReceiver
{
 @Override
 public void onReceive(Context context, Intent intent)
 { 
  if ("android.provider.Telephony.SMS_RECEIVED".equals(intent.getAction()))
  {
   StringBuilder sb = new StringBuilder();
   // 接收由SMS传过来的数据
   Bundle bundle = intent.getExtras();
   // 判断是否有数据
   if (bundle != null)
   {
    //  通过pdus可以获得接收到的所有短信消息
    Object[] objArray = (Object[]) bundle.get("pdus");
    /* 构建短信对象array,并依据收到的对象长度来创建array的大小 */
    SmsMessage[] messages = new SmsMessage[objArray.length];
    for (int i = 0; i < objArray.length; i++)
    {
      messages[i] = SmsMessage .createFromPdu((byte[]) objArray[i]);
    }

    /* 将送来的短信合并自定义信息于StringBuilder当中 */
    for (SmsMessage currentMessage : messages)
    {
     sb.append("短信来源:");
     // getDisplayOriginatingAddress()  方法获得接收短信的电话号码
     sb.append(currentMessage.getDisplayOriginatingAddress());
     sb.append("\n------短信内容------\n");
     // 获得短信的内容
     sb.append(currentMessage.getDisplayMessageBody());
    }
   }
   Intent mainIntent = new Intent(context, Main.class);
   mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
   context.startActivity(mainIntent);

    //这里的处理就是显示出接收的短信
   Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();
  }
 }

}

第二步,在配置中写入SMSReceiver 类

<receiver android:name="SMSReceiver">  
   <intent-filter>

    <!-- 指定SMSReceiver   可以接收的Broadcast  Action -->
    <action android:name="android.provider.Telephony.SMS_RECEIVED" />
   </intent-filter>
  </receiver>

注意: (1)  接收短信的Broadcast Action 是android.provider.Telephony.SMS_RECEIVED

           (2)  应用程序要接收SMS_RECEIVED广播,必须声明权限 <uses-permission android:name="android.permission.RECEIVE_SMS" />

示意图:

  

具体代码 参见 ch07_sms工程

第三个示例,显示手机电池的当前电量. 查看手机的电量需要接收一个系统广播,本示例中不在AndroidManifest.xml文件中配置,而是在Java类中通过registerReceiver 方法进行注册

主要代码:

public class Main extends Activity
{
 private TextView tvBatteryChanged;
 private BroadcastReceiver batteryChangedReceiver = new BroadcastReceiver()
 {

  @Override
  public void onReceive(Context context, Intent intent)
  {
   if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction()))
   {
    int level = intent.getIntExtra("level", 0);
    int scale = intent.getIntExtra("scale", 100);
    tvBatteryChanged.setText("电池用量:" + (level * 100 / scale) + "%");
   }
  }
 };

 @Override
 public void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  tvBatteryChanged = (TextView) findViewById(R.id.tvBatteryChanged);
  registerReceiver(batteryChangedReceiver, new IntentFilter(
    Intent.ACTION_BATTERY_CHANGED));
 }
}

具体代码参见 ch07_battery工程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值