PendingIntent这个类用于处理即将发生的事情。比如在通知Notification中用于点击后跳转页面,但不是马上跳转。还有诸如短信息发送报告,都是在稍晚的时候返回处理结果。PendingIntent 可以看作是对intent的包装,通常通过getActivity,getBroadcast ,getService来得到pendingintent的实例。
以下通过一个自定义发送短信实例来说明它的用法。
(1)短信服务需要权限
<uses-permission android:name="android.permission.SEND_SMS" />
通过android.telephony.SmsManager类可以编程方式发送SMS消息,这个类不能直接实例化,而是调用它的getDefault()静态方法获得一个SmsManager对象,然后调用sendTextMessage来发送SMS。
void sendTextMessage (String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent)。
destinationAddress:目标电话号码;scAddress:服务中心地址;text:短信文本;sentIntent:发送消息后调用的意图;deliveryIntent:消息投递后调用的意图。通过这种方式发送的SMS不会出现在系统消息应用中。
(2)一个页面中的按钮发送特定短信,然后以toast返回信息报告结果。
String SENT = "SMS_SENT"; //broadcast message when send
String DELIVERED = "SMS_DELIVERED"; //broadcast message when deliverd
PendingIntent sentPI, deliveredPI;
BroadcastReceiver smsSentReceiver, smsDeliveredReceiver;
给PendingIntent 赋待触发发送的广播值
sentPI = PendingIntent.getBroadcast(this, 0,new Intent(SENT), 0);
deliveredPI = PendingIntent.getBroadcast(this, 0,new Intent(DELIVERED), 0);
定义receiver
public void onResume(){
super.onResume();
smsSentReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS sent",Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(), "Generic failure",Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(), "No service",Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(), "Null PDU",Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(getBaseContext(), "Radio off",Toast.LENGTH_SHORT).show();
break;
}
}
};
//---create the BroadcastReceiver when the SMS is delivered---
smsDeliveredReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS delivered",Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(getBaseContext(), "SMS not delivered",Toast.LENGTH_SHORT).show();
break;
}
}
};
//---register the two BroadcastReceivers---
registerReceiver(smsDeliveredReceiver, new IntentFilter(DELIVERED));
registerReceiver(smsSentReceiver, new IntentFilter(SENT));
}
在onPause()中注销receiver
unregisterReceiver(smsSentReceiver);
unregisterReceiver(smsDeliveredReceiver);
发送的函数:
public void onClick(View v){
sendSMS("136xxxxxxxx","TEST HI");
}
private void sendSMS(String string, String string2) {
// TODO Auto-generated method stub
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(string, null, string2, sentPI, deliveredPI); //发送SMS后一旦pending的结果发生后就发送约定的广播Message,receiver收到就以toast提示结果
}
======================================================================================================
拦截特定拨号的功能应用,只需要在一个receiver中接收intent (android.intent.action.NEW_OUTGOING_CALL),onReceive的处理入下:
public void onReceive(Context context, Intent intent) {
if("5556".equals(this.getResultData())) this.setResultData(null); //如果电话是5556,则清空,不调用拨号器
}
======================================================================================================
一片网文对推送总结的比较全面,参见 http://www.cnblogs.com/hanyonglu/archive/2012/03/04/2378971.html。还有一篇基于MQTT协议实现的推送功能,有工程实例,请参见 http://blog.csdn.net/johnny901114/article/details/8898727。
参考原文:http://blog.csdn.net/zeng622peng/article/details/6180190
参考原文:http://www.eoeandroid.com/thread-181050-1-1.html