BroadcastReceiver最全实例——静态、动态、系统(监听短信、网络连接状态、SD卡、应用安装……)
来源:互联网 发布:流畅的python 编辑:程序博客网 时间:2024/06/05 22:37
BroadcastReceiver 原理推荐看这篇博客:http://yangguangfu.iteye.com/blog/1063732
有一部分实例参考了这篇博客http://blog.csdn.net/qq_26787115/article/details/51113053
最全实例,请看本文。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.cctvjiatao.broadcastreceiverdemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="13" android:targetSdkVersion="21" /> <!-- 监听收发短信的权限 --> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" /> <!-- 监听网络连接状态的权限 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 监听拨手机号码的权限 --> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> <!-- 监听开机状态的权限 --> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 静态广播 --> <receiver android:name="com.cctvjiatao.broadcastreceiverdemo.StaticAction" > <intent-filter> <action android:name="com.action.static" /> </intent-filter> </receiver> <!-- 系统广播:监听短信 --> <receiver android:name="com.cctvjiatao.broadcastreceiverdemo.SystemAction" > <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> <!-- 系统广播:监听网络连接状态 --> <receiver android:name="com.cctvjiatao.broadcastreceiverdemo.System2Action" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver> <!-- 系统广播:监听拨号 --> <receiver android:name="com.cctvjiatao.broadcastreceiverdemo.System3Action" > <intent-filter> <action android:name="android.net.conn.NEW_OUTGOING_CALL" /> </intent-filter> </receiver> <!-- 系统广播:拦截指定号码的短信 --> <receiver android:name="com.cctvjiatao.broadcastreceiverdemo.System4Action" > <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> <!-- 系统广播:监听SD卡 --> <receiver android:name="com.cctvjiatao.broadcastreceiverdemo.System5Action" > <intent-filter> <!-- SD卡就绪广播 --> <action android:name="android.intent.action.MEDIA_MOUNTED" /> <!-- SD卡拔出广播 --> <action android:name="android.intent.action.MEDIA_REMOVED" /> <!-- SD卡卸载广播 --> <action android:name="android.intent.action.MEDIA_UNMOUNTABLE" /> <data android:scheme="file" /> </intent-filter> </receiver> <!-- 系统广播:监听开机状态 --> <receiver android:name="com.cctvjiatao.broadcastreceiverdemo.System6Action" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> <!-- 系统广播:监听应用安装卸载 --> <receiver android:name="com.cctvjiatao.broadcastreceiverdemo.System7Action" > <intent-filter> <!-- 安装应用 --> <action android:name="android.intent.action.PACKAGE_ADDED" /> <!-- 更新应用 --> <action android:name="android.intent.action.PACKAGE_REPLACED" /> <!-- 卸载应用 --> <action android:name="android.intent.action.PACKAGE_REMOVED" /> <!-- 携带包名 --> <data android:scheme="package" /> </intent-filter> </receiver> <!-- 有序广播1 --> <receiver android:name=".OrderReceiverOne" > <intent-filter android:priority="1000" > <action android:name="com.action.order" /> </intent-filter> </receiver> <!-- 有序广播2 --> <receiver android:name=".OrderReceiverTwo" > <intent-filter android:priority="600" > <action android:name="com.action.order" /> </intent-filter> </receiver> <!-- 有序广播3 --> <receiver android:name=".OrderReceiverThree" > <intent-filter android:priority="300" > <action android:name="com.action.order" /> </intent-filter> </receiver> </application></manifest>
MainActivity.java
import com.cctvjiatao.broadcastreceiverdemo.R;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.Toast;/** * @作者: jiatao * @修改时间:2016-4-11 上午8:17:20 * @包名:com.cctvjiatao.broadcastreceiverdemo * @文件名:MainActivity.java * @版权声明:www.cctvjiatao.com * @功能: BroadcastReceiver 静态广播、动态广播、系统广播、有序广播 * 原理详见:http://yangguangfu.iteye.com/blog/1063732 */public class MainActivity extends Activity {private final String TAG = getClass().getSimpleName() ;private ListView lv_list;private ArrayAdapter<String> mArrayAdapter;private String[] strList;private static final String STATICACTION = "com.action.static";private static final String DYNAMICACTION = "com.action.dynamic";private static final String ORDERACTION = "com.action.order";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initAdapter();initView();IntentFilter filter = new IntentFilter();filter.addAction(DYNAMICACTION); registerReceiver(dynamicReceiver, filter);}private void initAdapter() {strList = new String[]{"发送静态注册广播消息","发送动态注册广播消息","有序广播"};mArrayAdapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, strList);}private void initView() {lv_list = (ListView) findViewById(R.id.lv_list);lv_list.setAdapter(mArrayAdapter);lv_list.setOnItemClickListener(listenerBroadcastReceiver);}private OnItemClickListener listenerBroadcastReceiver = new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//Toast.makeText(MainActivity.this, strList[position], 1000).show();switch(strList[position]){case "发送静态注册广播消息":Log.e(TAG, "发送静态注册广播消息");Intent intentStatic = new Intent();intentStatic.setAction(STATICACTION);intentStatic.putExtra("msg", "接收静态注册广播消息成功");sendBroadcast(intentStatic);break;case "发送动态注册广播消息":Log.e(TAG, "发送动态注册广播消息");Intent intentDynamic = new Intent(DYNAMICACTION); intentDynamic.putExtra("msg", "接收动态注册广播消息成功"); sendBroadcast(intentDynamic); break;case "有序广播":Log.e(TAG, "有序广播");Intent intentOrder = new Intent(ORDERACTION); /*上面这行,等同于下面这两行Intent intentOrder = new Intent(); intentOrder.setAction(ORDERACTION);*/sendOrderedBroadcast(intentOrder, null, null, null, 0, "自定义广播内容", null);break;default:break;}}};protected void onDestroy() {super.onDestroy(); unregisterReceiver(dynamicReceiver);};private BroadcastReceiver dynamicReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals(DYNAMICACTION)) {String msg = intent.getStringExtra("msg");Toast.makeText(context, msg, 5000).show();}}};/** * 重写onBackPressed()方法,是返回键无效,配合System6Action可实现流氓软件 *//*@Override public void onBackPressed() { //禁止返回键 // super.onBackPressed(); }*/}activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.cctvjiatao.broadcastreceiverdemo.MainActivity" > <ListView android:id="@+id/lv_list" android:layout_width="match_parent" android:layout_height="wrap_content" /></RelativeLayout>StaticAction.java
package com.cctvjiatao.broadcastreceiverdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast;/** * @作者: jiatao * @修改时间:2016-4-11 上午8:17:20 * @包名:com.cctvjiatao.broadcastreceiverdemo * @文件名:StaticAction.java * @版权声明:www.cctvjiatao.com * @功能: 当出发静态广播按钮时时,会启动本类 */public class StaticAction extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String msg = intent.getStringExtra("msg");Toast.makeText(context, msg, 5000).show();}}SystemAction.java
package com.cctvjiatao.broadcastreceiverdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.telephony.SmsMessage;import android.util.Log;import android.widget.Toast;/** * @作者: jiatao * @修改时间:2016-4-11 上午8:17:20 * @包名:com.cctvjiatao.broadcastreceiverdemo * @文件名:SystemAction.java * @版权声明:www.cctvjiatao.com * @功能: 当手机收到短信时,会启动本类 */public class SystemAction extends BroadcastReceiver {private final String TAG = getClass().getSimpleName();@Overridepublic void onReceive(Context context, Intent intent) {Log.e(TAG, "接收系统广播信息——短信");//接收Intent对象当中的数据 Bundle bundle=intent.getExtras(); //在Bundle对象中有一个属性为pdus,该属性为Object数组 Object[] myOBJpdus=(Object[])bundle.get("pdus"); //创建一个SmsMessage类型的数组 SmsMessage[] messages=new SmsMessage[myOBJpdus.length]; System.out.println(messages.length); for (int i = 0; i < myOBJpdus.length; i++) { //使用Object数组中的对象创建SmsMessage对象 messages[i]=SmsMessage.createFromPdu((byte[])myOBJpdus[i]); //获取到信息对象的内容 System.out.println(messages[i].getDisplayOriginatingAddress()); System.out.println(messages[i].getDisplayMessageBody()); Toast.makeText(context, "接收系统广播信息,短信内容为:"+messages[i].getDisplayOriginatingAddress()+"\n"+messages[i].getDisplayMessageBody(), 5000).show(); }}}
System2Action.java
package com.cctvjiatao.broadcastreceiverdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.net.ConnectivityManager;import android.net.NetworkInfo;import android.util.Log;import android.widget.Toast;/** * @作者: jiatao * @修改时间:2016-4-11 上午8:17:20 * @包名:com.cctvjiatao.broadcastreceiverdemo * @文件名:System2Action.java * @版权声明:www.cctvjiatao.com * @功能: 当网络状态发生变化时,会启动本类 */public class System2Action extends BroadcastReceiver {private final String TAG = getClass().getSimpleName();@Overridepublic void onReceive(Context context, Intent intent) {Log.e(TAG, "接收系统广播信息——网络状态发生变化");if (!isNetworkAvailable(context)) {Toast.makeText(context, "网络不可用!", 5000).show();}}/** * 网络是否可用,如果网络可用,再判断网络连接方式 */public boolean isNetworkAvailable(Context context) {ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo[] info = mgr.getAllNetworkInfo();NetworkInfo mobileInfo = mgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);NetworkInfo wifiInfo = mgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);NetworkInfo vpnInfo = mgr.getNetworkInfo(ConnectivityManager.TYPE_VPN);NetworkInfo activeInfo = mgr.getActiveNetworkInfo();if (info != null) {for (int i = 0; i < info.length; i++) {if (info[i].getState() == NetworkInfo.State.CONNECTED) {Log.e(TAG, "mobile:" + mobileInfo.isConnected() + "\nwifi:" + wifiInfo.isConnected() + "\nvpn:" + vpnInfo.isConnected() + "\nactive:" + activeInfo.getTypeName());Toast.makeText(context, "mobile:" + mobileInfo.isConnected() + "\nwifi:" + wifiInfo.isConnected() + "\nvpn:" + vpnInfo.isConnected() + "\nactive:" + activeInfo.getTypeName(), 5000).show();return true;}}}return false;}}
System3Action.java
package com.cctvjiatao.broadcastreceiverdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;/** * @作者: jiatao * @修改时间:2016-4-11 下午8:46:38 * @包名:com.cctvjiatao.broadcastreceiverdemo * @文件名:System3Action.java * @版权声明:www.cctvjiatao.com * @功能: 电话广播 ,例如拨号110时,最终播出86110 */public class System3Action extends BroadcastReceiver {private final String TAG = getClass().getSimpleName();@Overridepublic void onReceive(Context context, Intent intent) {Log.e(TAG, "用户拨完号码了");String phoneNum = getResultData();Log.e(TAG, "用户拨打的号码是"+ phoneNum);//给号码添加数字String newPhoneNum = "+86" + phoneNum;//把修改后的号码放回去setResultData(newPhoneNum);Log.e(TAG, "实际拨打的号码是"+ newPhoneNum);}}
System4Action.java
package com.cctvjiatao.broadcastreceiverdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.telephony.SmsMessage;import android.util.Log;/** * @作者: jiatao * @修改时间:2016-4-11 下午9:03:56 * @包名:com.cctvjiatao.broadcastreceiverdemo * @文件名:System4Action.java * @版权声明:www.cctvjiatao.com * @功能: 拦截指定号码的短信 */public class System4Action extends BroadcastReceiver {private final String TAG = getClass().getSimpleName();@Overridepublic void onReceive(Context context, Intent intent) {Log.e(TAG, "收到短信");// 获取短信内容Bundle bundle = intent.getExtras();// 返回的是一个Object数组Object[] objects = (Object[]) bundle.get("pdus");// 遍历数组得到短信内容for (Object object : objects) {// 把数组元素转换成短信对象SmsMessage sms = SmsMessage.createFromPdu((byte[]) object);// 获取发件人号码String toPhone = sms.getOriginatingAddress();// 获取短信内容String smsContent = sms.getMessageBody();Log.e(TAG, "发件人号码:" + toPhone + "短信内容" + smsContent);// 判断是否是拦截的号码if (toPhone.equals("10086")) {// 拦截广播abortBroadcast();Log.e(TAG, "短信来自10086,已被拦截");}}}}/* * 虽然程序能走到拦截这一步,但是并没有阻止显示在短信收件箱里 * 这里,我们要注意一个优势,就是广播接收者是有优先级定义的, * 我们只需要在清单注册根节点的intent-filter标签里定义一个:android:priority="1000" * 官方文档规定的优先级数值在-1000到1000之间,1000最大 */
System5Action.java
package com.cctvjiatao.broadcastreceiverdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;/** * @作者: jiatao * @修改时间:2016-4-11 下午9:12:53 * @包名:com.cctvjiatao.broadcastreceiverdemo * @文件名:System5Action.java * @版权声明:www.cctvjiatao.com * @功能: 监听SD卡状态 */public class System5Action extends BroadcastReceiver {private final String TAG = getClass().getSimpleName();@Overridepublic void onReceive(Context context, Intent intent) {//判断广播 String action = intent.getAction(); if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) { Log.e(TAG, "SD卡就绪"); } else if (action.equals(Intent.ACTION_MEDIA_REMOVED)) { Log.i(TAG, "SD卡拔出"); } else if (action.equals(Intent.ACTION_MEDIA_UNMOUNTABLE)) { Log.i(TAG, "SD卡卸载"); }}}
System6Action.java
package com.cctvjiatao.broadcastreceiverdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;/** * @作者: jiatao * @修改时间:2016-4-11 下午9:15:02 * @包名:com.cctvjiatao.broadcastreceiverdemo * @文件名:System6Action.java * @版权声明:www.cctvjiatao.com * @功能: 流氓软件,监听到开机就启动这个软件,而且不让其退出,达到流氓的效果,需配合MainActivity中的onBackPressed()方法 */public class System6Action extends BroadcastReceiver {private final String TAG = getClass().getSimpleName();@Overridepublic void onReceive(Context context, Intent intent) {Log.e(TAG, "开机"); //启动 Intent i = new Intent(context, MainActivity.class); //在Activity之外启动需要设置Flags i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(i);}}
System7Action.java
package com.cctvjiatao.broadcastreceiverdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.net.Uri;import android.util.Log;/** * @作者: jiatao * @修改时间:2016-4-11 下午9:21:38 * @包名:com.cctvjiatao.broadcastreceiverdemo * @文件名:System7Action.java * @版权声明:www.cctvjiatao.com * @功能: TODO */public class System7Action extends BroadcastReceiver {private final String TAG = getClass().getSimpleName();@Overridepublic void onReceive(Context context, Intent intent) {//判断广播类型 String action = intent.getAction(); //获取包名 Uri appName = intent.getData(); if (Intent.ACTION_PACKAGE_ADDED.equals(action)) { Log.e(TAG, "安装" + appName); } else if (Intent.ACTION_PACKAGE_REPLACED.equals(action)) { Log.e(TAG, "更新" + appName); } else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) { Log.e(TAG, "卸载" + appName); }}}OrderReceiverOne.java
package com.cctvjiatao.broadcastreceiverdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast;/** * @作者: jiatao * @修改时间:2016-4-11 下午9:40:04 * @包名:com.cctvjiatao.broadcastreceiverdemo * @文件名:OrderReceiverOne.java * @版权声明:www.cctvjiatao.com * @功能: 有序广播1 */public class OrderReceiverOne extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "One", 3000).show();}}OrderReceiverTwo.java
package com.cctvjiatao.broadcastreceiverdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast;/** * @作者: jiatao * @修改时间:2016-4-11 下午9:40:04 * @包名:com.cctvjiatao.broadcastreceiverdemo * @文件名:OrderReceiverTwo.java * @版权声明:www.cctvjiatao.com * @功能: 有序广播2 */public class OrderReceiverTwo extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "Two", 3000).show();}}
OrderReceiverThree.java
package com.cctvjiatao.broadcastreceiverdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast;/** * @作者: jiatao * @修改时间:2016-4-11 下午9:40:04 * @包名:com.cctvjiatao.broadcastreceiverdemo * @文件名:OrderReceiverThree.java * @版权声明:www.cctvjiatao.com * @功能: 有序广播3 */public class OrderReceiverThree extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context, "Three", 3000).show();}}
0 0
- BroadcastReceiver最全实例——静态、动态、系统(监听短信、网络连接状态、SD卡、应用安装……)
- Android实训案例(六)——四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听
- Android实训案例(六)——四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听
- Android实训案例(六)——四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听
- Android实训案例(六)——四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听
- Android-监听SD卡状态(BroadcastReceiver)
- android BroadcastReceiver动态监听网络连接
- BroadcastReceiver监听网络状态
- SD卡监听---BroadcastReceiver
- Android BroadcastReceiver之监听外置SD卡状态
- BroadcastReceiver之动态注册监听网络状态变化
- 关于BroadcastReceiver 监听网络状态
- 使用BroadcastReceiver监听网络状态
- Android 广播BroadcastReceiver静态/动态注册,获取系统电量广播【开机广播】,获取网络状态广播,Timer的使用简介
- 监听SD卡状态
- 网络连接状态监听
- 动态监听网络状态
- Android监听网络状态实现(BroadcastReceiver + Service)
- git分支原理命令图文解析
- 3720: Gty的妹子树 块状树
- 3809: Gty的二逼妹子序列 莫队算法+分块
- Windows不重装系统,使用分区助手分区
- oc数组的四种遍历方法
- BroadcastReceiver最全实例——静态、动态、系统(监听短信、网络连接状态、SD卡、应用安装……)
- SQL中Group By的使用
- 1951: [Sdoi2010]古代猪文 费马小定理+中国剩余定理+卢卡斯定理+快速幂
- android studio修改module名称
- Jquery即点既改
- 算法_Rome to Integer
- pie 饼子问题
- 3306: 树 树上倍增
- Windows+Apache搭建PHP开发环境