PendingIntent与Intent

含义Intent表示意图,Pending表示即将发生的事情。 Intent是及时启动,Intent 随所在的activity 消失而消失。PendingIntent用于处理即将发生的事情。比如在通知Notification中用于跳转页面,但不是马上跳转。PendingIntent是一个可以在满足一定条件下执行的Intent,它相比于Intent的优势在于自己携带有Context对象,这样他就不必依赖于某个activity才可以存在。 PendingIntent可以看作是对Intent的包装,通常通过getActivity,getBroadcast,getService来得到PendingIntent的实例,当前activity并不能马上启动它所包含的Intent,而是在外部执行PendingIntent时,调用Intent的。正由于PendingIntent中保存有当前App的Context,使它赋予外部App一种能力,使得外部App可以如同当前App一样的执行pendingintent里的 Intent,就算在执行时当前App已经不存在了,也能通过存在PendingIntent里的Context照样执行Intent。另外还可以处理Intent执行后的操作。 PendingIntent常和AlarmManager 和NotificationManager一起使用,可以理解为延迟执行的Intent,PendingIntent是对Intent一个包装。 PendingIntent getBroadcast方法12345public static PendingIntent getBroadcast(Context context, int requestCode,Intent intent, @Flags int flags) { return getBroadcastAsUser(context, requestCode, intent, flags,new UserHandle(UserHandle.myUserId()));} 注意在AlarmManager中可以使用requestCode的不同(可以用闹钟的ID),让不同闹钟不会覆盖掉。AlarmManager是Android中的一种系统级别的提醒服务,它会为我们在特定的时刻广播一个指定的Intent。而使用Intent的时候,我们还需要它执行一个动作,如startActivity,startService,startBroadcast,才能使Intent有用。通常我们使用PendingIntent,它可以理解为对Intent的封装,包含了指定的动作。我们可以通过PendingIntent的静态方法得到一个PendingIntent对象,如下:1PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 使用PendingIntent的getBroadcast (Context context, int requestCode, Intent intent, int flags)方法可以得到一个发送广播动作的PendingIntent对象。其中getBroadcast的第4个参数可以为以下4个常量或其他支持使用Intent.fillIn()来控制它的变量:FLAG_CANCEL_CURRENT:如果描述的PendingIntent对象已经存在时,会先取消当前的PendingIntent对象再生成新的。FLAG_NO_CREATE:如果描述的PendingIntent对象不存在,它会返回null而不是去创建它。FLAG_ONE_SHOT:创建的PendingIntent对象只使用一次。FLAG_UPDATE_CURRENT:如果描述的PendingIntent对象存在,则保留它,并将新的PendingIntent对象的数据替换进去。 使用PendingIntent的getBroadcast (Context context, int requestCode, Intent intent, int flags)方法可以得到一个发送广播动作的PendingIntent对象。其中getBroadcast的第4个参数可以为以下4个常量或其他支持使用Intent.fillIn()来控制它的变量: FLAG_CANCEL_CURRENT如果描述的PendingIntent对象已经存在时,会先取消当前的PendingIntent对象再生成新的。FLAG_NO_CREATE如果描述的PendingIntent对象不存在,它会返回null而不是去创建它。FLAG_ONE_SHOT创建的PendingIntent对象只使用一次。FLAG_UPDATE_CURRENT如果描述的PendingIntent对象存在,则保留它,并将新的PendingIntent对象的数据替换进去。 接下来看AlarmManager,我们通过以下代码来取得AlarmManager对象。12AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); AlarmManager的常用方法set(int type,long startTime,PendingIntent pi)该方法用于设置一次性闹钟。第一个参数int type指定定时服务的类型,该参数接受如下值:ELAPSED_REALTIME: 在指定的延时过后,发送广播,但不唤醒设备(闹钟在睡眠状态下不可用)。如果在系统休眠时闹钟触发,它将不会被传递,直到下一次设备唤醒。ELAPSED_REALTIME_WAKEUP: 在指定的延时过后,发送广播,并唤醒设备(即使关机也会执行operation所对应的组件) 。延时是要把系统启动的时间SystemClock.elapsedRealtime()算进去的,具体用法看代码。RTC: 指定当系统调用System.currentTimeMillis()方法返回的值与triggerAtTime相等时启动operation所对应的设备(在指定的时刻,发送广播,但不唤醒设备)。如果在系统休眠时闹钟触发,它将不会被传递,直到下一次设备唤醒(闹钟在睡眠状态下不可用)。RTC_WAKEUP: 指定当系统调用System.currentTimeMillis()方法返回的值与triggerAtTime相等时启动operation所对应的设备(在指定的时刻,发送广播,并唤醒设备)。即使系统关机也会执行 operation所对应的组件。第二个参数表示闹钟执行时间。第三个参数PendingIntent pi表示闹钟响应动作:PendingIntent pi:是闹钟的执行动作,比如发送一个广播、给出提示等等。PendingIntent是Intent的封装类。需要注意的是,如果是通过启动服务来实现闹钟提示的话,PendingIntent对象的获取就应该采用Pending.getService(Context c,int i,Intentintent,int j)方法;如果是通过广播来实现闹钟提示的话,PendingIntent对象的获取就应该采用PendingIntent.getBroadcast(Context c,inti,Intent intent,int j)方法;如果是采用Activity的方式来实现闹钟提示的话,PendingIntent对象的获取就应该采用PendingIntent.getActivity(Context c,inti,Intent intent,int j)方法。如果这三种方法错用了的话,虽然不会报错,但是看不到闹钟提示效果。     继续阅读
MXlwq's avatar
MXlwq 4月 10, 2016
 | 

Android Fragment生命周期

Android在3.0版本引入了Fragment功能,它非常类似于Activity,可以...     继续阅读
MXlwq's avatar
MXlwq 4月 05, 2016
 | 

Android学习资源和链接

    继续阅读
MXlwq's avatar
MXlwq 4月 04, 2016
 | 

Android Activity启动模式

在Android中的Activity实例化操作时,Activity的启动模式决定了Act...     继续阅读
MXlwq's avatar
MXlwq 4月 04, 2016
 | 

Android Dialog汇总

Dialog在Android开发中,经常会需要在Android界面上弹出一些对话框。分类: 普通的对话框 多按钮对话框 列表对话框 选择对话框(单选和多选) 进度条对话框 读取对话框 上代码 MainActivity.class     继续阅读
MXlwq's avatar
MXlwq 4月 03, 2016
 | 

Android自定义ToggleButton

准备资源toggleButton是普通png格式的,我们可以使用工具将其改为9.png的,使用9patch工具时有个小技巧,那就是将show patches勾选上,方便我们画点。 res下新建一个选择器新建一个drawable目录,新建一个选择器:toggle_selector.xml:12345<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_checked="true" android:drawable="@drawable/toggle_button_on"></item> <item android:drawable="@drawable/toggle_button_off"></item></selector>     继续阅读
MXlwq's avatar
MXlwq 4月 03, 2016
 | 

Android TimePicker控件

在Android中使用TimePicker(时间选择器),可以进行时间的快速调整,此类定...     继续阅读
MXlwq's avatar
MXlwq 4月 01, 2016
 | 

px/dp/sp/

20160728修改 基本概念dp:Density-independent pixels,以160PPI屏幕为标准,则1dp=1px px是pixel的缩写 dp和px的换算公式dp*ppi/160 = px如1dp x 320ppi/160 = 2px。 sp:Scale-independent pixels,安卓的字体单位,以160PPI屏幕为标准,当字体大小为100%时,1sp=1px。 sp 与 px 的换算公式:sp*ppi/160 = px in表示英寸,是屏幕的物理尺寸。每英寸=2.54厘米。     继续阅读
MXlwq's avatar
MXlwq 3月 29, 2016
 | 

gravity/layout_gravity;padding/margin

LinearLayout两个非常相似的属性:android:gravity与an...     继续阅读
MXlwq's avatar
MXlwq 3月 29, 2016
 |