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,使用免费网络短信时截获不了。