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); } } }

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

时间: 2024-04-17 23:05:52

Android的广播Receiver动态注册和静态注册示例的相关文章

Oracle Listener 动态注册 与 静态注册_oracle

一.什么是注册 注册就是将数据库作为一个服务注册到监听程序.客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库.这个服务名可能与实例名一样,也有可能不一样. 在数据库服务器启动过程中,数据库服务器会向监听程序注册相应的服务(无论何时启动一个数据库,默认地都有两条信息注册到监听器中:数据库服务器对应的实例和服务.) 相当于是这样:在数据库服务器和客户端之间有一监听程序(Listener),在监听程序中,会记录相应数据库对应的服务名(一个数据库可能对应有多个服

ORACLE 动态注册和静态注册的区别(转)

1, oracle 10g 用netca方式建立的都默认为动态注册方式2,如果想改为静态注册的方式则在listener.ora 中加入如下内容即可 SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1) (PROGRAM = extproc) ) (SID_DESC = (SID_NAME = JEFF ) (OR

动态库调用静态库示例讲解_Linux

生成动态库: 需要的目标文件得用-fPIC选项生成. 而静态库所需的目标文件可以不用-fPIC选项. 例: 复制代码 代码如下: /////// static.h void static_print(); ///////static.cpp #include <iostream> #include "static.h" void static_print() {      std::cout<<"This is static_print functio

JSP页面的动态包含和静态包含示例及介绍_JSP编程

一.静态包含 本文介绍JSP静态包含语句,即使用JSP的include指令来完成的包含操作. JSP中,有两种包含其它文件的方式,一种是静态包含,一种是动态包含.本文介绍其中的静态包含. 所谓静态包含,跟ASP中的包含是一样的效果,即将所有包含的文件,先静态的包含进来,组成一个大的JSP文件,然后再经过编译器统一编译,生成HTML代码. JSP静态包含的语句为: 复制代码 代码如下: <%@ include file="file.jsp" %> 这里的file.jsp就是要

使用java将动态网页生成静态网页示例_java

复制代码 代码如下: package com.tools;import java.io.*;import java.net.URL; /** * Title:动态页面静态化 */public class GoToHtml {/** *  * @param page *            存放静态页面的本地文件路径(c,d,e,f,g) * @param url_addr *            所要生成的静态页的URL地址(http://) * @return */public boole

Android BroadcastReceiver广播注册方式总结

Android:BroadcastReceiver注册的方式分为两种: 静态注册 动态注册 1. 静态注册 在AndroidManifest.xml里通过标签声明 属性说明: <receiver android:enabled=["true" | "false"] //此broadcastReceiver能否接收其他App的发出的广播 //默认值是由receiver中有无intent-filter决定的:如果有intent-filter,默认值为true,否则

Oracle静态注册与动态注册详解_oracle

一.概述: Oracle的注册就是将数据库作为一个服务注册到监听程序.客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到这个数据库.这个服务名可能与实例名一样,也有可能不一样. 在数据库服务器启动过程中,数据库服务器会向监听程序注册相应的服务(无论何时启动一个数据库,默认地都有两条信息注册到监听器中:数据库服务器对应的实例和服务.) 相当于是这样:在数据库服务器和客户端之间有一监听程序(Listener),在监听程序中,会记录相应数据库对应的服务名(一个数据库可

Android BroadcastReceiver广播机制概述_Android

Android广播机制概述Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通信方式,可以使用的场景如下: 1.同一app内部的同一组件内的消息通信(单个或多个线程之间): 2.同一app内部的不同组件之间的消息通信(单个进程):  3.同一app具有多个进程的不同组件之间的消息通信:  4.不同app之间的组件之间消息通信:  5.Android系统在特定情况下与App之间的消息

Android BroadcastReceiver广播机制概述

Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通信方式,可以使用的场景如下: 1.同一app内部的同一组件内的消息通信(单个或多个线程之间): 2.同一app内部的不同组件之间的消息通信(单个进程):  3.同一app具有多个进程的不同组件之间的消息通信:  4.不同app之间的组件之间消息通信:  5.Android系统在特定情况下与App之间的消