import android.content.BroadcastReceiver; |
import android.content.Context; |
import android.content.Intent; |
import android.os.Bundle; |
import android.telephony.SmsMessage; |
import android.widget.Toast; |
public class BroadcastReceiverTest extends BroadcastReceiver { |
/* 该字符串并不像我们前面的发短信程序中的action一样是自定义的,因为这里我们要接受的是由其他手机的系统 |
短信程序发送的短信,所以这里要用android.provider.Telephony.SMS_RECEIVED来匹配系统发送的Intent |
*/ |
private final String Receive_Message = "android.provider.Telephony.SMS_RECEIVED" ; |
@Override |
public void onReceive(Context context, Intent intent) { |
// 获取该Intent的action名称 |
String intentActionName = intent.getAction(); |
if (Receive_Message.equals(intentActionName)){ |
StringBuilder stringBuilder = new StringBuilder(); |
/* |
*Bundle本质上是一个map,以键值对的形式存放着值。 |
*其内存放着通过putExtra()方法添加进去的数据,当然这个数据有可能是开发人员添加,也有可能是系统默认添加的。 |
*当没有任何数据的时候,返回null |
* */ |
Bundle bundle = intent.getExtras(); |
/* 系统默认的发短信程序会将信息内容通过putExtra方法放入bundle中,其map中的key为pdus,这个是写死的噢 |
*从下面的代码我们还可以看到,系统将数据以一个包含byte数组的数组的形式,放入了map中。 |
*类似putExtra("pdus",Object[] obj); 其中obj的元素为byte数组。 |
*/ |
Object[] objects = (Object[]) bundle.get( "pdus" ); |
SmsMessage[]messages = new SmsMessage[objects.length]; |
for ( int i = 0 ; i < objects.length; i++) { |
// createFromPdu创建一个SmsMessage对象 |
messages[i] = SmsMessage.createFromPdu(( byte []) objects[i]); |
} |
/* |
* 我们这里其实还有一个getOriginatingAddress方法可以用来获取信息内容。 |
* 它与getDisplayOriginatingAddress的区别在于前者只针对于短信,后者还可以处理油email得到的SmsMessge对象 |
* 与此类似,我们还有一个getDisplayMessageBody和getDisplayMessageBody方法,两者的区别和上面的一样。 |
* */ |
for (SmsMessage message:messages){ |
stringBuilder.append( "接收到来自:/n" ); |
// 获取信息来源地址 |
stringBuilder.append(message.getDisplayOriginatingAddress()); |
stringBuilder.append( "/n-------传来的信息---------/n" ); |
// 获取信息内容 |
stringBuilder.append(message.getDisplayMessageBody()); |
} |
Toast.makeText(context,stringBuilder.toString(), Toast.LENGTH_LONG).show(); |
/* 新建一个意图并发给系统以启动一个activity,在此我们通过i.addFlags()为其设置响应方式, |
*系统会创建一个新的task来存放SmsReceiver这个Activity,并且启动了它, |
*这就保证了SmsReceiver这个activity我们始终都能看到 |
*/ |
Intent i = new Intent(context,SmsReceiver. class ); |
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); |
context.startActivity(i); |
} |
} |
} |