转载请注明出处:http://blog.csdn.net/chengbao315/article/details/51011358

相关阅读:

Android服务组件案例:http://blog.csdn.net/chengbao315/article/details/50997218

上回书我提到了想要编写安卓四大组件案例的想法,那么说到做到,这次我就来做一个Android广播组件的案例。这次想要模仿手机360软件的短信黑名单功能,可以实现号码加入黑名单,后台运行程序,短信来到时进行拦截,并可以在软件中查看信息内容的基本功能。比如这个手机360软件的截图:

读了郭神的《第一行代码》,再加上之前几篇博客的总结,我对这个功能的实现胸有成竹,不过没有思路的童鞋也不用急,请参考《第一行代码》第5章、第8章内容。

下面来实现功能,在Eclipse中新建一个Android项目,打开activity_main.xml文件,编写界面布局。这里只简单实现需求功能,所以布局起来比较简单,只包含几个TextView控件、一个EditText控件和一个Button控件,设计代码如下:

<LinearLayout 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:orientation="vertical" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:orientation="horizontal" ><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:layout_marginTop="10dp"android:text="@string/EnterNum" /><EditTextandroid:id="@+id/editNumber"android:layout_width="150dp"android:layout_height="wrap_content"/></LinearLayout><Buttonandroid:id="@+id/btnAddBlack"android:layout_width="200dp"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="加入黑名单" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="60dp" ><TextViewandroid:id="@+id/senderText"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="10dp"android:layout_gravity="bottom"android:text="黑名单号码:" /><TextViewandroid:id="@+id/sender"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="bottom" /></LinearLayout><LinearLayout android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/contentText"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="10dp"android:text="信息内容:" /><TextViewandroid:id="@+id/content"android:layout_width="210dp"android:layout_height="280dp" /></LinearLayout></LinearLayout>

以上代码实现的效果如图所示:

接下来实现接收信息的功能。安卓手机在接收短信的时候,系统会发出一条值为android.provider.Telephony.SMS_RECEIVED的广播,这条广播里携带着与短信相关的所有数据。通过对这条广播的监听,在接收到广播时对信息内容进行解析,根据发送号码判断决定是否截断广播,即可实现短信黑名单的功能。

打开MainActivity.java 文件,在onCreate()方法中添加动态注册监听短信广播的代码,同时获取信息号码、信息内容TextView和Button的实例,添加代码如下:

public class MainActivity extends Activity implements OnClickListener {private TextView sender;private TextView content;private IntentFilter receiveFilter;private MessageReceiver messageReceiver;private static String BlackNum = "";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);sender = (TextView) findViewById(R.id.sender);content = (TextView) findViewById(R.id.content);Button btnAdd = (Button) findViewById(R.id.btnAddBlack);btnAdd.setOnClickListener(this);receiveFilter = new IntentFilter();receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED");receiveFilter.setPriority(100);messageReceiver = new MessageReceiver();registerReceiver(messageReceiver, receiveFilter);}@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(messageReceiver);}

为了实现软件先于手机自带信息软件收到信息,通过调用 receiveFilter.setPriority(100);方法设置软件的优先级较高。接下来在MainActivity中新建MessageReceiver内部类,继承BroadcastReceiver,实现接收广播后的处理逻辑,代码如下所示:

private class MessageReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Log.d("MessageReceiver", "Receive");Bundle bundle = intent.getExtras();Object[] pdus = (Object[]) bundle.get("pdus");SmsMessage[] message = new SmsMessage[pdus.length];for (int i = 0; i < message.length; i++) {message[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);}// 获取手机号码String Number = message[0].getOriginatingAddress();String fullMessage = "";for (SmsMessage m : message) {fullMessage += m.getMessageBody();// 获取短信内容}Log.d("MessageReceiver[Number]", Number);Log.d("MessageReceiver[Message]", fullMessage);if (BlackNum.equals(Number)) {NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);Notification notification = new Notification(R.drawable.ic_launcher, "拦截黑名单信息",System.currentTimeMillis());Intent notificationIntent = new Intent(context,MainActivity.class);PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);notification.setLatestEventInfo(context, "新信息", "拦截黑名单信息",pendingIntent);notification.defaults = Notification.DEFAULT_ALL;manager.notify(1, notification);sender.setText(Number);content.setText(fullMessage);abortBroadcast();}}}

在接收到广播后,系统调用onReceive()方法,通过Bundle方式传递信息数据,通过对Bundle的解析,将信息内容存储到一个SmsMessage数组中,进而完成信息的接收。接下来对比来信号码与黑名单号码是否相等,如果相等,给出一个通知(这里不是需求的要求内容,以后再详细讲),在界面显示信息号码和信息内容,同时截断广播向手机的信息软件传播。
最后别忘了在AndroidManifest.xml中的代码中给程序声明一个接收短信的权限"android.permission.RECEIVE_SMS"(另一个权限是手机通知的震动权限),添加代码如下:

    <uses-permission android:name="android.permission.RECEIVE_SMS"/><uses-permission android:name="android.permission.VIBRATE"/>

以上代码实现了软件接收信息和拦截信息的功能,但是设置黑名单的功能还没有实现,继续编辑MainActivity.java文件,添加Button的监听代码,在代码中获取EditText的内容,保存为黑名单号码,添加代码如下:

public class MainActivity extends Activity implements OnClickListener {......@Overridepublic void onClick(View view) {EditText text = (EditText) findViewById(R.id.editNumber);if (!text.getText().toString().isEmpty()) {BlackNum = text.getText().toString();Toast.makeText(this, "设置黑名单号码为:" + BlackNum, Toast.LENGTH_LONG).show();Log.d("MainActivity[Number]", BlackNum);}}
}

还有一个隐含的功能,就是后台运行,其实这段代码完全可以不写,通过按Home键代替,但是提到了还是实现以下吧。其实原理很简单,就是捕捉Back点击事件,然后设置为后台运行,在MainActivity中继续添加代码如下:

 @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {moveTaskToBack(true);return true;}return super.onKeyDown(keyCode, event);}

激动人心的时刻到了,最后的最后就是来进行测试了。在郭神的《第一行代码》中,提供了DDMS模拟器的方法(可以参考8.2.1章节),但是我的电脑根本没装模拟器,又不想花信息费,那怎么办?机智的我决定给10086发信息吧,结果查了一下午的话费,估计10086也快疯了。测试结果如下:

  

下载源码,点击这里!

广播组件的实践——短信黑名单相关推荐

  1. android广播机制初步学习——短信黑名单

    andriod广播机制中主要使用到的两个类:Broadcast和BroadcastReceiver.即一个发送一个接受. 发送的时候是用Intent来携带数据(广播)的,利用Intent中的标识来匹配 ...

  2. Android 广播接收不到短信问题,Android中短信的广播接收问题

    首先,接收短信的机制是接收广播,由系统发出短信到来的广播,我们对短信广播进行注册,从而接收. import java.util.Date; import android.content.Broadca ...

  3. android 坚挺通话广播_关于短信黑名单 BroadCast

    看到Android中有关Broadcast Receiver组件方面的东西,广播被分为两种不同的类型:"普通广播(Normal broadcasts)"和"有序广播(Or ...

  4. 一个关于短信黑名单的想法

    刚刚在看有关BroadcastReceiver组件方面的东西,广播被分为两种不同的类型:"普通广播(Normal broadcasts)"和"有序广播(Ordered b ...

  5. 关于短信黑名单 BroadCast

    2011-06-02 10:52 佚名 开发者社区 我要评论(0) 字号:T | T BroadCast Receiver顾名思义是指广播接受者,它和时间处理机制类似,只不过事件吃力机制是程序组件级别 ...

  6. 5.5 短信黑名单拦截

    1.在黑名单服务中, 动态代码创建短信广播接受者, 在服务开启时注册短信拦截广播意图过滤器, 在服务销毁时取消广播事件 2. 在广播接受者内部类中,判断来电号码是否在黑名单短信拦截和全部拦截模式中, ...

  7. android学习笔记---37_采用广播接收者实现系统短信操作_获取短信_收发短信等

    37_采用广播接收者实现短信操作 1.       原理:当系统接收到短信时候,会发出一个广播Intent,Intent的action名称为android.provider.Telephony.SMS ...

  8. Android - xml动画,识别手势动作,代码抽取,获取手机SIM卡串号,获取联系人数据,开机广播,发送/解析短信,报警音乐

    转载请注明出处:https://blog.csdn.net/mythmayor/article/details/72878059 1.Activity的任务栈 1.类似一个木桶,每层只能放一个木块,我 ...

  9. android无法接收短信广播,android – 广播接收器不适用于短信

    首先,我已经搜索了可能的解决方案,尝试了一切,但仍然无效.我肯定错过了什么. 我正在尝试创建一个接收/读取和写入SMS的应用程序. 写部分工作正常,我的广播接收器只是没有捕捉广播. AndroidMa ...

最新文章

  1. 能在xcode5中开发基于IOS7sdk的应用程序兼容ios4.3之后的系统吗?
  2. 修改 keystore密码
  3. CUDA Libraries简介
  4. less的一些用法整理
  5. python在线投票系统 统计票数_python投票统计程序,统计序列中各个数值的份数,字典的应用。...
  6. ABAP和Java的单元测试Unit Test
  7. RestTemplate入门案例
  8. 第九节:基于MVC5+AutoFac+EF+Log4Net的基础结构搭建
  9. 在JavaScript中创建命名空间的几种写法
  10. commit 规范性提交
  11. 微软邮件系统Exchange 2013系列(五)配置CAS负载平衡 NLB
  12. DELL电脑系统恢复出常值
  13. java套接字通信_Java网络通信套接字 | 学步园
  14. 【GMSK】研究PCM/FM和GMSK的调制和解调方法
  15. Mac版网易云音乐打不开
  16. 梦三显示服务器列表,梦三国开服表_梦三国开服时间表_梦三国最新开服_9K9K手游网...
  17. 沁恒CH32F103C8T6(一): Keil5环境配置,示例运行和烧录
  18. 基于u3d_FPS_Demo
  19. Linux 环境下部署Hexagon SDK 开发环境
  20. Twitter技术主管回怼马斯克:不懂技术乱评价!马斯克:He’s fired

热门文章

  1. 2022长城杯Reverse-baby_reWP
  2. windows 电脑常用快捷键
  3. 在线生成地图geojson数据格式以及手绘乡镇级json数据
  4. PowerBI 新手入门 ---- 新建一个表(直接输入或粘贴表内容)
  5. 【Unity3d游戏开发】Unity3D中常用的物理学公式
  6. java去掉时间字符串的T字母
  7. 2021年《财富》世界500强中国企业有多少?能源行业利润降幅高达97%
  8. 录录(高清录屏) - Video321 如何快速分享视频
  9. python语言编程入门-Python编程从入门到精通 PDF 下载
  10. mongodb官方客户端可视化工具Compass,免费,官方值得信赖