关闭

PendingIntent详解

标签: PendingIntent
304人阅读 评论(0) 收藏 举报

首先看下pendingIntent和intent的区别

1、pendingIntent是将要发生的action。intent是立即发生的action

2、pendingIntent可以取消。Intent不能取消

3、intent必须在context内执行,所以当程序执行完,intent也终止。

pendingIntent自带context,没有限制。

4、intent在原来的task中运行,pendingIntent在不同的task中运行


pendingIntent主要用于 通知栏(NotificationManager)和发送短信(SmsManager)的监控


下边俩个例子

//获取通知管理器
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
int icon = R.drawable.logo;
long when = System.currentTimeMillis();//通知发生的时间为系统当前时间
//新建一个通知,指定其图标和标题
Notification notification = new Notification(icon, null, when);//第一个参数为图标,第二个参数为短暂提示标题,第三个为通知时间
notification.defaults = Notification.DEFAULT_SOUND;//发出默认声音
notification.flags |= Notification.FLAG_AUTO_CANCEL;//点击通知后自动清除通知
Intent openintent = new Intent(this, TouchTest.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, openintent, 0);//当点击消息时就会向系统发送openintent意图
notification.setLatestEventInfo(this, "标题", "我是内容", contentIntent);
mNotificationManager.notify(0, notification);//第一个参数为自定义的通知唯一标识


private final static String SEND_ACTION = "send";
private final static String DELIVERED_ACTION = "delivered";


private void sendSms(String receiver, String text) {
SmsManager s = SmsManager.getDefault();
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(
SEND_ACTION), PendingIntent.FLAG_CANCEL_CURRENT);
final PendingIntent deliveredPI = PendingIntent
.getBroadcast(this, 0, new Intent(DELIVERED_ACTION),
PendingIntent.FLAG_CANCEL_CURRENT);
// 发送完成
registerReceiver(new BroadcastReceiver() {


@Override
public void onReceive(Context context, Intent intent) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "Send Success!",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(),
"Send Failed because generic failure cause.",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(
getBaseContext(),
"Send Failed because service is currently unavailable.",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(),
"Send Failed because no pdu provided.",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(
getBaseContext(),
"Send Failed because radio was explicitly turned off.",
Toast.LENGTH_SHORT).show();
break;
default:
Toast.makeText(getBaseContext(), "Send Failed.",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(SEND_ACTION));


// 对方接受完成
registerReceiver(new BroadcastReceiver() {


@Override
public void onReceive(Context context, Intent intent) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "Delivered Success!",
Toast.LENGTH_SHORT).show();
break;
default:
Toast.makeText(getBaseContext(), "Delivered Failed!",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(DELIVERED_ACTION));


// 发送短信,sentPI和deliveredPI将分别在短信发送成功和对方接受成功时被广播
s.sendTextMessage(receiver, null, text, sentPI, deliveredPI);
}


另外总结下获取pendingIntent对象的方法

你可以通过getActivity(Context context, int requestCode, Intent intent, int flags)系列方法从系统取得一个用于启动一个Activity的PendingIntent对象,

       可以通过getService(Context context, int requestCode, Intent intent, int flags)方法从系统取得一个用于启动一个Service的PendingIntent对象

        可以通过getBroadcast(Context context, int requestCode, Intent intent, int flags)方法从系统取得一个用于向BroadcastReceiver的Intent广播的PendingIntent对象

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

说说PendingIntent的内部机制

博客源址:说说PendingIntent的内部机制 博客时间:2014-01-30 17:35 1 概述         在Android中,我们常常使用PendingIntent来表达一种“留待日后处理...
  • Buaaroid
  • Buaaroid
  • 2015-11-05 15:23
  • 989

利用pendingintent 和AlarmManager实现定时任务的一些分析

PendingIntent 获取 PendingIntent对象的方法: 可以通过getActivity(Context context, int requestCode, Intent intent, int flags)系列方法从系统取得一个用于启动一个Activity的PendingInt...
  • nuanguang1990
  • nuanguang1990
  • 2016-04-25 16:11
  • 516

关于Notification的一点愚见(PendingIntent工作流程)

PendingIntent,顾名思义,延迟的Intent。那么肯定会产生一个疑问,那就是PendingIntent究竟和Intent的区别在哪里呢? 其实PendingIntent其实就是对Intent的一个封装,不过Intent是立即触发效果,就像我们常用的这样: Intent i...
  • yujunyu12
  • yujunyu12
  • 2016-09-01 21:18
  • 1007

关于在接收推送消息后PendingIntent传参问题

一般接收到推送消息通过PendingIntent设置跳转到指定的Activity,同时也
  • lastTNT
  • lastTNT
  • 2014-10-20 13:14
  • 2084

Android消息通知PendingIntent传递参数出问题

这个bug比较坑,今天在测消息通知,要传几个参数,但是怎么都传不过去,最后搜了一下问题居然出在了这儿:
  • dabaoonline
  • dabaoonline
  • 2016-09-13 11:33
  • 950

Android PendingIntent 不能跳转的问题总结

PendingIntent可以看作是对Intent的包装,供当前App之外的其他App调用。PendingIntent主要持有的信息是它所包装的Intent和当前App的Context。外部App执行这个PendingIntent时,间接地调用里面的Intent。正由于PendingIntent中保...
  • wangbaochu
  • wangbaochu
  • 2016-01-27 09:54
  • 3151

android中pendingIntent的用法--状态栏通知、短信通知、告警通知

pendingIntent字面意义:等待的,未决定的Intent。 要得到一个pendingIntent对象,使用方法类的静态方法 getActivity(Context, int, Intent, int),getBroadcast(Context, int, Intent, ...
  • jackyxwr
  • jackyxwr
  • 2016-08-11 22:36
  • 1157

Android中的PendingIntent使用注意事项

在Android开发中,PendingIntent主要用于Notification、AlarmManager以及Widget中,获取PendingIntent主要有三种方式:getActivity(),getService()以及getBroadcast(),这三种方式的参数都相同,但其中的第2个参...
  • ivan_software
  • ivan_software
  • 2015-06-03 14:40
  • 1713

Android中AlarmManager详解以及利用PendingIntent设置闹钟

AlarmManager是提供一种访问系统闹钟服务的方式,允许你去设置在将来的某个时间点去执行你的应用程序。当你的闹钟响起(时间到)时,在它上面注册的一个意图(Intent)将会被系统以广播发出,然后自动启动目标程序,如果它没有正在运行。注册的闹钟会被保留即使设备处于休眠中(如果闹钟在给定时间响起可...
  • qq_28330221
  • qq_28330221
  • 2017-03-12 12:27
  • 3067

说说PendingIntent的内部机制

在Android中,我们常常使用PendingIntent来表达一种“留待日后处理”的意思。从这个角度来说,PendingIntent可以被理解为一种特殊的异步处理机制。不过,单就命名而言,PendingIntent其实具有一定误导性,因为它既不继承于Intent,也不包含Intent,它的核心可以...
  • codefly
  • codefly
  • 2015-01-01 16:36
  • 1609
    个人资料
    • 访问:9302次
    • 积分:395
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:2篇
    • 译文:0篇
    • 评论:3条
    最新评论