Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android的广播Receiver动态注册和静态注册示例大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

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

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

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

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

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

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

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

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

xml布局文件(activity_main.xml)

@H_675_35@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://scheR_220_11845@as.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>
@H_686_0@manifest.xml如下,这里面定义的权限信息和注册的广播

@H_675_35@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://scheR_220_11845@as.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>
@H_686_0@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,"接收系统动态注册广播消息"); 
   if (intent.getAction().equals(SYstemACTION)) 
   { 
    String msg = intent.getStringExtra("msg"); 
    Toast.makeText(context,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,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,DialogInterface.onClickListener cancelButtonClickListener) 
 { 
  return showAlert(context,title,message,"Yes",confirmButtonClickListener,null,"No",cancelButtonClickListener,true,null); 
 } 
 
 
 /** 
  * 显示一个提示框 
  * 
  * @param context  上下文对象,最好给Activity,否则需要android.permission.SYstem_ALERT_WINDOW 
  * @param message  提示的消息 
  * @param confirmButton 确定按钮的名字 
  */ 
 public static AlertDialog showPrompt(Context context,String confirmButton) 
 { 
  return showAlert(context,confirmButton,null); 
 } 
 
 
 
 /** 
  * 显示一个提示框 
  * 
  * @param context 上下文对象,最好给Activity,否则需要android.permission.SYstem_ALERT_WINDOW 
  * @param message 提示的消息 
  */ 
 public static AlertDialog showPrompt(Context context,String messagE) 
 { 
  return showAlert(context,"OK",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); 
  } 
 } 
} 

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

大佬总结

以上是大佬教程为你收集整理的Android的广播Receiver动态注册和静态注册示例全部内容,希望文章能够帮你解决Android的广播Receiver动态注册和静态注册示例所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:android广播