android 广播机制demo(实现短信截取)

      android中简单的线程通信一般使用Handler、Looper 实现,但是进程之间和频繁的线程间通信一般使用广播机制,包括手机的电量变化、短消息、来电等也是广播机制,此demo实现了静态和动态注册广播接收器,并且用动态注册实现了短消息的截取。


demo:下载地址


Manifest文件:

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

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

    <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=".StaticBroadcastReceiver">
            <intent-filter>
                <action android:name="fk.MyActionTest" />
            </intent-filter>
        </receiver>
    </application>

</manifest>

MainActivity文件:

package fk.androiddemo_011;

import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    Button but1;
    Button but2;
    Button but3;

    DynamicBroadcastReceiver myReceiver;
    static String SMS_ACTION="android.provider.Telephony.SMS_RECEIVED";//注意,收到短消息的action
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        but1=(Button)findViewById(R.id.but1);
        but1.setOnClickListener(this);
        but2=(Button)findViewById(R.id.but2);
        but2.setOnClickListener(this);
        but3=(Button)findViewById(R.id.but3);
        but3.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        if (view == but1) {
            Intent intent = new Intent();
            intent.setAction("fk.MyActionTest");
            intent.putExtra("info", "Hello, I am FengKui");
            sendBroadcast(intent);
        }else if (view == but2) {//动态注册广播接收器
            System.out.println("注册接收短消息的广播接收器");
            //生成一个BroadcastReceiver对象
            myReceiver = new DynamicBroadcastReceiver();
            //生成过滤器对象
            IntentFilter filter = new IntentFilter();
            //添加ACTION
            filter.addAction(SMS_ACTION);
            //注册接收器
            this.registerReceiver(myReceiver, filter);
        }else if (view == but3) {//动态注销广播接收器
            System.out.println("注销接收短消息的广播接收器");
            this.unregisterReceiver(myReceiver);
        }
    }
}

StaticBroadcastReceiver.java 静态广播接收器:

package fk.androiddemo_011;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

/**
 * Created by Administrator on 2016/9/26.
 */
public class StaticBroadcastReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("onReceive...StaticBroadcastReceiver");
        String ss=intent.getStringExtra("info");//(键值名)
        System.out.println("content:"+ss);
    }
}

DynamicBroadcastReceiver.java 动态广播比接收器:

package fk.androiddemo_011;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;

/**
 * Created by Administrator on 2016/9/26.
 */
public class DynamicBroadcastReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("onReceive...DynamicBroadcastReceiver");

        Bundle bundle = intent.getExtras();
        //在Bundle对象当中有一个成员名为pdus,它的值是一个Object数组
        Object[] myOBJpdus = (Object[]) bundle.get("pdus");
        //创建一个SmsMessage类型的数组
        SmsMessage[] messages = new SmsMessage[myOBJpdus.length];
        System.out.println(myOBJpdus.length);//几个消息
        for (int i = 0; i<myOBJpdus.length; i++)
        {
            //使用Object数组当中的对象创建SmsMessage对象
            messages[i] = SmsMessage.createFromPdu((byte[]) myOBJpdus[i]);
            //调用SmsMessage对象的getDisppalyMessageBody()方法,就可以得到消息的内容
            System.out.println(messages[i].getDisplayMessageBody());
        }
        try {
            Thread.sleep(3 * 1000);
            System.out.println("-------------------------------");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

运行截图:



PS:

1,有些手机截获不了短信,是因为某些系统限制,比如小米2S,需要关闭:短信》设置》高级设置》系统短信优先。

2,使用免费网络短信时截获不了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值