Android的广播Receiver动态注册和静态注册示例

广播接收器注册一共有两种形式 : 静态注册和动态注册.

两者及其接收广播的区别:

1.动态注册的广播 永远要快于 静态注册的广播,不管静态注册的优先级设置的多高,不管动态注册的优先级有多低。

2.动态注册广播不是 常驻型广播 ,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收器。

静态注册是常驻型 ,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

3.在同一个优先级下,谁先启动的快,谁将先接收到广播。

下面这个Demo,界面如下,注册两个动态接收器(接收自定义广播和系统广播)和注册静态广播(接收自定义静态和广播、手机USB的插拔事件、接收短信并读取短信息)

工程目录如下:注意看代码中的注释

xml布局文件(activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent"> 

 <Button
   android:id="@+id/send_static"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="发送自定义静态注册广播"/> 

 <Button android:id="@+id/send_dynamic"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="发送自定义动态注册广播"/> 

 <Button
   android:id="@+id/send_system"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="发送系统动态注册广播"/> 

</LinearLayout>

Manifest.xml如下,这里面定义的权限信息和注册的广播

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.nii.receiver" > 

 <!--监听短信息-->
 <uses-permission android:name="android.permission.RECEIVE_SMS" />
 <uses-permission android:name="android.permission.READ_SMS" /> 

 <application
  android:allowBackup="true"
  android:icon="@mipmap/ic_launcher"
  android:label="@string/app_name"
  android:supportsRtl="true"
  android:theme="@style/AppTheme" >
  <activity android:name=".MainActivity" >
   <intent-filter>
    <action android:name="android.intent.action.MAIN" /> 

    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity> 

  <!-- 注册自定义静态广播接收器 -->
  <receiver android:name=".StaticReceiver">
   <intent-filter>
    <action android:name="com.byread.static" />
   </intent-filter>
  </receiver> 

  <!-- 注册系统静态广播接收器 -->
  <receiver android:name=".SystemReceiver">
   <intent-filter>
    <action android:name="android.intent.action.BATTERY_LOW" />
    <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    <action android:name="android.hardware.usb.action.USB_STATE"/>
  </intent-filter>
  </receiver> 

 </application> 

</manifest>

MainActivity.Java

package com.nii.receiver;
import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.nii.receiver.type.RequestPermissionType;
import com.nii.receiver.util.PermissionUtil; 

public class MainActivity extends AppCompatActivity
{ 

 /**
  * 发送静态广播按钮
  */
 private Button sendStaticBtn; 

 /**
  * 发送动态广播按钮
  */
 private Button sendDynamicBtn; 

 /**
  * 发送系统广播按钮
  */
 private Button sendSystemBtn; 

 /**
  * 静态action
  */
 private static final String STATICACTION = "com.byread.static"; 

 /**
  * 动态action
  */
 private static final String DYNAMICACTION = "com.byread.dynamic"; 

 /**
  * USB设备连接
  */
 private static final String SYSTEMACTION = Intent.ACTION_POWER_CONNECTED; 

 private Context mContext; 

 @Override
 protected void onCreate(Bundle savedInstanceState)
 {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  this.mContext = this; 

  sendStaticBtn = (Button) findViewById(R.id.send_static);
  sendDynamicBtn = (Button) findViewById(R.id.send_dynamic);
  sendSystemBtn = (Button) findViewById(R.id.send_system);
  sendStaticBtn.setOnClickListener(new MyOnClickListener());
  sendDynamicBtn.setOnClickListener(new MyOnClickListener());
  sendSystemBtn.setOnClickListener(new MyOnClickListener()); 

  //申请读取短信的权限
  PermissionUtil.requestPermission(mContext, Manifest.permission.READ_SMS,
    RequestPermissionType.REQUEST_CODE_ASK_READ_SMS); 

  PermissionUtil.requestPermission(mContext, Manifest.permission.RECEIVE_SMS,
    RequestPermissionType.REQUEST_CODE_ASK_RECEIVE_SMS);
 }
 class MyOnClickListener implements View.OnClickListener
 {
  @Override
  public void onClick(View v)
  {
   // 发送自定义静态注册广播消息
   if (v.getId() == R.id.send_static)
   {
    Log.e("MainActivity", "发送自定义静态注册广播消息");
    Intent intent = new Intent();
    intent.setAction(STATICACTION);
    intent.putExtra("msg", "接收静态注册广播成功!");
    sendBroadcast(intent);
   }
   // 发送自定义动态注册广播消息
   else if (v.getId() == R.id.send_dynamic)
   {
    Log.e("MainActivity", "发送自定义动态注册广播消息");
    Intent intent = new Intent();
    intent.setAction(DYNAMICACTION);
    intent.putExtra("msg", "接收动态注册广播成功!");
    sendBroadcast(intent);
   }
   // 发送系统动态注册广播消息。当手机连接充电设备时会由系统自己发送广播消息。
   else if (v.getId() == R.id.send_system)
   {
    Log.e("MainActivity", "发送系统动态注册广播消息");
    Intent intent = new Intent();
    intent.setAction(SYSTEMACTION);
    intent.putExtra("msg", "正在充电。。。。");
   }
  }
 } 

 @Override
 protected void onStart()
 {
  super.onStart();
  Log.e("MainActivity", "注册广播事件"); 

  // 注册自定义动态广播消息
  IntentFilter filter_dynamic = new IntentFilter();
  filter_dynamic.addAction(DYNAMICACTION);
  registerReceiver(dynamicReceiver, filter_dynamic); 

  // 注册系统动态广播消息
  IntentFilter filter_system = new IntentFilter();
  filter_system.addAction(SYSTEMACTION);
  registerReceiver(systemReceiver, filter_system);
 } 

 private BroadcastReceiver dynamicReceiver = new BroadcastReceiver()
 { 

  @Override
  public void onReceive(Context context, Intent intent)
  {
   Log.e("MainActivity", "接收自定义动态注册广播消息");
   if (intent.getAction().equals(DYNAMICACTION))
   {
    String msg = intent.getStringExtra("msg");
    Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
   }
  }
 }; 

 private BroadcastReceiver systemReceiver = new BroadcastReceiver()
 {
  @Override
  public void onReceive(Context context, Intent intent)
  {
   Log.e("MainActivity", "接收系统动态注册广播消息");
   if (intent.getAction().equals(SYSTEMACTION))
   {
    String msg = intent.getStringExtra("msg");
    Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
   }
  }
 };
}

StaticReceiver.java

package com.nii.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.widget.Toast; 

/**
 * Created by wzj on 2017/2/19.
 */
public class StaticReceiver extends BroadcastReceiver
{ 

 /**
  * 接收广播
  * @param context context
  * @param intent intent
  */
 @Override
 public void onReceive(Context context, Intent intent)
 {
  String msg = intent.getStringExtra("msg");
  Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
 }
}

SystemReceiver.java这里面处理一些系统的事件

package com.nii.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.telephony.SmsMessage;
import android.text.format.DateFormat;
import android.util.Log;
import android.widget.Toast;
import com.nii.receiver.util.DialogUtil; 

import java.util.Date; 

/**
 * Created by wzj on 2017/2/19.
 */
public class SystemReceiver extends BroadcastReceiver
{ 

 /**
  * 接收系统静态广播
  *
  * @param context context
  * @param intent intent
  */
 @Override
 public void onReceive(Context context, Intent intent)
 {
  if (intent.getAction().equals(Intent.ACTION_BATTERY_LOW))
  {
   Log.e("SystemReceiver", "电量低提示");
   Toast.makeText(context, "您的手机电量偏低,请及时充电", Toast.LENGTH_SHORT).show();
  }
  else if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED"))
  {
   if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED"))
   {
    Bundle bundle = intent.getExtras();
    if (bundle != null)
    {//如果数据不为空
     //获得收到的短信数据
     Object[] objArray = (Object[]) bundle.get("pdus");
     //根据objArray的大小创建一个SmsMessage数组,用于封装短信内容
     SmsMessage[] smsMessage = new SmsMessage[objArray.length];
     StringBuffer sb = new StringBuffer();
     sb.append("时间:" + new DateFormat().format("yyyy - MM - dd hh.mm.ss", new Date())); 

     //遍历smsMessage数组取出所有短信
     for (int i = 0; i < smsMessage.length; i++)
     {
      //将每条字节类型的短信数据转换成SmsMessage对象
      smsMessage[i] = SmsMessage.createFromPdu((byte[]) objArray[i]);
      //获取短信发送地址
      sb.append("发送者:" + smsMessage[i].getOriginatingAddress());
      //获取短信内容
      sb.append("短信内容:" + smsMessage[i].getDisplayMessageBody() + "\n");
     } 

     DialogUtil.showPrompt(context,sb.toString());
     Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();
    }
   }
  }
  else if(intent.getAction().equals("android.hardware.usb.action.USB_STATE"))
  {
   if (intent.getExtras().getBoolean("connected"))
   {
    Toast.makeText(context, "USB插入", Toast.LENGTH_LONG).show();
   }
   else
   {
    Toast.makeText(context, "USB拔出", Toast.LENGTH_LONG).show();
   }
  }
 }
}

RequestPermissionType.java是权限请求的时候,Qequest Code(请求码)

package com.nii.receiver.type; 

/**
 * Created by wzj on 2017/2/19.
 */
public interface RequestPermissionType
{
 /**
  * 请求打电话的权限码
  */
 int REQUEST_CODE_ASK_CALL_PHONE = 100; 

 /**
  * 请求接收短信息
  */
 int REQUEST_CODE_ASK_RECEIVE_SMS = 101; 

 /**
  * 请求读短信
  */
 int REQUEST_CODE_ASK_READ_SMS = 102;
}

DialogUtil.java是界面弹窗工具类

package com.nii.receiver.util;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.WindowManager;
/**
 * 对话框工具箱
 *
 * @author xiaopan
 */
public class DialogUtil
{
 /**
  * 显示一个对话框
  *
  * @param context     上下文对象,最好给Activity,否则需要android.permission.SYSTEM_ALERT_WINDOW
  * @param title      标题
  * @param message     消息
  * @param confirmButton    确认按钮
  * @param confirmButtonClickListener 确认按钮点击监听器
  * @param centerButton    中间按钮
  * @param centerButtonClickListener 中间按钮点击监听器
  * @param cancelButton    取消按钮
  * @param cancelButtonClickListener 取消按钮点击监听器
  * @param onShowListener    显示监听器
  * @param cancelable     是否允许通过点击返回按钮或者点击对话框之外的位置关闭对话框
  * @param onCancelListener   取消监听器
  * @param onDismissListener   销毁监听器
  * @return 对话框
  */
 public static AlertDialog showAlert(Context context, String title, String message,
          String confirmButton, DialogInterface.OnClickListener confirmButtonClickListener,
          String centerButton, DialogInterface.OnClickListener centerButtonClickListener,
          String cancelButton, DialogInterface.OnClickListener cancelButtonClickListener,
          DialogInterface.OnShowListener onShowListener, boolean cancelable,
          DialogInterface.OnCancelListener onCancelListener,
          DialogInterface.OnDismissListener onDismissListener)
 {
  AlertDialog.Builder promptBuilder = new AlertDialog.Builder(context);
  if (title != null)
  {
   promptBuilder.setTitle(title);
  }
  if (message != null)
  {
   promptBuilder.setMessage(message);
  }
  if (confirmButton != null)
  {
   promptBuilder.setPositiveButton(confirmButton, confirmButtonClickListener);
  }
  if (centerButton != null)
  {
   promptBuilder.setNeutralButton(centerButton, centerButtonClickListener);
  }
  if (cancelButton != null)
  {
   promptBuilder.setNegativeButton(cancelButton, cancelButtonClickListener);
  }
  promptBuilder.setCancelable(true);
  if (cancelable)
  {
   promptBuilder.setOnCancelListener(onCancelListener);
  } 

  AlertDialog alertDialog = promptBuilder.create();
  if (!(context instanceof Activity))
  {
   alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
  }
  alertDialog.setOnDismissListener(onDismissListener);
  alertDialog.setOnShowListener(onShowListener);
  alertDialog.show();
  return alertDialog;
 } 

 /**
  * 显示一个对话框
  *
  * @param context     上下文对象,最好给Activity,否则需要android.permission.SYSTEM_ALERT_WINDOW
  * @param title      标题
  * @param message     消息
  * @param confirmButtonClickListener 确认按钮点击监听器
  * @param cancelButtonClickListener 取消按钮点击监听器
  * @return 对话框
  */
 public static AlertDialog showConfirm(Context context, String title, String message,
          DialogInterface.OnClickListener confirmButtonClickListener,
          DialogInterface.OnClickListener cancelButtonClickListener)
 {
  return showAlert(context, title, message, "Yes",
    confirmButtonClickListener, null, null, "No", cancelButtonClickListener, null, true, null, null);
 } 

 /**
  * 显示一个提示框
  *
  * @param context  上下文对象,最好给Activity,否则需要android.permission.SYSTEM_ALERT_WINDOW
  * @param message  提示的消息
  * @param confirmButton 确定按钮的名字
  */
 public static AlertDialog showPrompt(Context context, String message, String confirmButton)
 {
  return showAlert(context, null, message, confirmButton, null, null, null, null, null, null, true, null, null);
 } 

 /**
  * 显示一个提示框
  *
  * @param context 上下文对象,最好给Activity,否则需要android.permission.SYSTEM_ALERT_WINDOW
  * @param message 提示的消息
  */
 public static AlertDialog showPrompt(Context context, String message)
 {
  return showAlert(context, null, message, "OK", null, null, null, null, null, null, true, null, null);
 }
}

PermissionUtil.java是权限申请工具类

package com.nii.receiver.util;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat; 

/**
 * Created by wzj on 2017/2/19.
 */
public abstract class PermissionUtil
{
 /**
  * 请求权限
  * @param mContext mContext
  * @param permission permission
  * @param requestCode requestCode
  */
 public static void requestPermission(Context mContext,String permission,int requestCode)
 {
  if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
  {
   return;
  } 

  int checkCallPhonePermission = ContextCompat.checkSelfPermission(mContext,permission); 

  if (checkCallPhonePermission != PackageManager.PERMISSION_GRANTED)
  {
   ActivityCompat.requestPermissions((Activity) mContext, new String[]{permission},requestCode);
  }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android 监听apk安装替换卸载广播的实现代码

    首先是要获取应用的安装状态,通过广播的形式以下是和应用程序相关的Broadcast ActionACTION_PACKAGE_ADDED 一个新应用包已经安装在设备上,数据包括包名(最新安装的包程序不能接收到这个广播)ACTION_PACKAGE_REPLACED 一个新版本的应用安装到设备,替换之前已经存在的版本ACTION_PACKAGE_CHANGED 一个已存在的应用程序包已经改变,包括包名ACTION_PACKAGE_REMOVED 一个已存在的应用程序包已经从设备上移除,包括包名(正

  • Android 开机广播的使用及配置

    相关文章 Android 4.0 无法接收开机广播的问题 在配置文件AndroidManifest.xml中向系统注册receiver,子节点 intent-filter 表示接收android.intent.action.BOOT_COMPLETED消息 复制代码 代码如下: <receiver android:name="com.ray.ray.receiver.BootCompletedReceiver" > <intent-filter> <act

  • Android中的广播(BroadCast)详细介绍

    什么是广播 在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制.我们拿广播电台来做个比方.我们平常使用收音机收音是这样的:许许多多不同的广播电台通过特定的频率来发送他们的内容,而我们用户只需要将频率调成和广播电台的一样就可以收听他们的内容了.Android中的广播机制就和这个差不多的道理. 电台发送的内容是语音,而在Android中我们要发送的广播内容是一个Intent.这个Intent中可以携带我们要传送的数据. 电台通过大功率的发射器发送内容,而在Androi

  • Android实现静态广播监听器的方法

    本文实例讲述了Android实现静态广播监听器的方法.分享给大家供大家参考.具体实现方法如下: package lab.sodino.broadcastaction; import lab.sodino.util.DatabaseOpenHelper; import lab.sodino.util.SodinoOut; import android.app.Activity; import android.content.ContentResolver; import android.datab

  • Android基于广播事件机制实现简单定时提醒功能代码

    本文实例讲述了Android基于广播事件机制实现简单定时提醒功能代码.分享给大家供大家参考,具体如下: 1.Android广播事件机制 Android的广播事件处理类似于普通的事件处理.不同之处在于,后者是靠点击按钮这样的组件行为来触发,而前者是通过构建Intent对象,使用sentBroadcast()方法来发起一个系统级别的事件广播来传递信息.广播事件的接收是通过定义一个继承Broadcast Receiver的类实现的,继承该类后覆盖其onReceive()方法,在该方法中响应事件.And

  • Android编程四大组件之BroadcastReceiver(广播接收者)用法实例

    本文实例讲述了Android编程四大组件之BroadcastReceiver(广播接收者)用法.分享给大家供大家参考,具体如下: 这里介绍如何创建广播.如何发送一个无序广播和有序广播.以及监听短信以及监听呼出电话(当我们发短信和打电话,系统就会发一个广播,我们可以拦截此广播进行监听短信以及监听呼出电话). 定义广播接收者 1.定义类继承BroadcastReceiver,重写onReceive方法 2.当接收到匹配广播之后就会执行onReceive方法 3.清单文件中声明<receiver>,

  • Android广播接收机制详细介绍(附短信接收实现)

    Android中广播(BroadcastReceiver)的详细讲解. 1. BroadcastReceiver的注册过程: (1).广播消息发出来后,只有订阅了该广播的对象才会接收发出来的广播消息并做出相应处理. **(2).**Android广播分为两个方面:广播发送者和广播接收者.Android中的广播使用了观察者模式,基于消息的发布/订阅事件模型.广播接收者通过Binder机制向AMS进行注册,AMS查找符合相应条件的Broadcastreceiver,将广播发送到BroadcastRe

  • Android中BroadcastReceiver(异步接收广播Intent)的使用

    Broadcast Receiver简介 Broadcast Receiver是Android的五大组件之一,使用频率也很高. 用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast().广播接收者(BroadcastReceiver)用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast().Context.sendOrderedBroadcast()或者Context.sendStickyBr

  • Android中的广播和广播接收器代码实例

    BroadcastReceiver不仅可以接收系统广播,也可接收自定义的广播   1.定义一个广播接收器 复制代码 代码如下: public class MyReceiver extends BroadcastReceiver {          public MyReceiver()          {                    Log.i(TAG,"MyReceiver");          }                  //可用Intent的getAct

  • android连接wifi时获取广播地址代码

    复制代码 代码如下: private InetAddress getBroadcastAddress() throws IOException { WifiManager myWifiManager = (WifiManager) getSystemService(WIFI_SERVICE); DhcpInfo myDhcpInfo = myWifiManager.getDhcpInfo(); if (myDhcpInfo == null) { System.out.println("Could

随机推荐