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
 | 

POJ1458动态规划

Common SubsequenceTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 46006 Accepted: 18845 DescriptionA subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, …, xm > another sequence Z = < z1, z2, …, zk > is a subsequence of X if there exists a strictly increasing sequence < i1, i2, …, ik > of indices of X such that for all j = 1,2,…,k, xij = zj. For example, Z = < a, b, f, c > is a subsequence of X = < a, b, c, f, b, c > with index sequence < 1, 2, 4, 6 >. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y. InputThe program input is from the std input. Each data set in the input contains two strings representing the given sequences. The sequences are separated by any number of white spaces. The input data are correct. OutputFor each set of data the program prints on the standard output the length of the maximum-length common subsequence from the beginning of a separate line. Sample Inputabcfbc abfcabprogramming contest abcd mnpSample Output42 0 分析最长公共子序列,题目意思是给出两个字符串,求他们的最长公共子序列LCS的入门题 模板     继续阅读
MXlwq's avatar
MXlwq 4月 09, 2016
 | 

POJ1163动态规划

TopCoder文章:Dynamic Programming: From novice to advanced The TriangleTime Limit: 1000MS Memory Limit: 10000K Total Submissions: 43089 Accepted: 26054Description    7   3  8  8  1  0 2  7  4  44  5  2  6  5  (Figure 1)Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right. InputYour program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle, all integers, are between 0 and 99.Output Your program is to write to standard output. The highest sum is written as an integer. Sample Input573 88 1 02 7 4 44 5 2 6 5 Sample Output30 分析简单动态规划,这道题如果用枚举法,在数塔层数稍大的情况下,则需要列举出的路径条数将是一个非常庞大的数目,最终会导致TLE。因此我们可以从下往上推,相邻的两个数中找较大的与上层相加,得出的结果相邻的两个数中再找较大的与上层相加,以此类推。     继续阅读
MXlwq's avatar
MXlwq 4月 09, 2016
 | 

C/C++指针

例子int p; ///这是一个普通的整型变量int p; ///首先从P处开始,先与结合,所以说明P是一个指针,然后再与int结合,说明指针所指向的内容的类型为int型.所以P是一个返回整型数据的指针int p[3]; ///首先从P处开始,先与[]结合,说明P是一个数组,然后与int结合,说明数组里的元素是整型的,所以P是一个由整型数据组成的数组int p[3]; ///首先从P处开始,先与[]结合,因为其优先级比高,所以P是一个数组,然后再与结合,说明数组里的元素是指针类型,然后再与int结合,说明指针所指向的内容的类型是整型的,所以P是一个由返回整型数据的指针所组成的数组int (p)[3]; ///首先从P处开始,先与结合,说明P是一个指针然后再与[]结合(与”( )”这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int结合,说明数组里的元素是整型的.所以P是一个指向由整型数据组成的数组的指针int **p; ///首先从P开始,先与结合,说是P是一个指针,然后再与结合,说明指针所指向的元素是指针,然后再与int结合,说明该指针所指向的元素是整型数据.由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更复杂的类型我们就不考虑多级指针了,最多只考虑一级指针.int p(int); ///从P处起,先与( )结合,说明P是一个函数,然后进入( )里分析,说明该函数有一个整型变量的参数然后再与外面的int结合,说明函数的返回值是一个整型数据Int (p)(int); ///从P处开始,先与指针结合,说明P是一个指针,然后与( )结合,说明指针指向的是一个函数,然后再与( )里的int结合,说明函数有一个int型的参数,再与最外层的int结合,说明函数的返回类型是整型,所以P是一个指向有一个整型参数且返回类型为整型的函数的指针int (p(int))[3]; ///从P开始,先与( )结合,说明P是一个函数,然后进入( )里面,与int结合,说明函数有一个整型变量参数,然后再与外面的结合,说明函数返回的是一个指针,,然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与结合,说明数组里的元素是指针,然后再与int结合,说明指针指向的内容是整型数据.所以P是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数. 细说指针指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的 类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。先声明几个指针放着做例子:例一:  (1)intptr;  (2)charptr;  (3)int*ptr;  (4)int(ptr)[3];  (5)int(ptr)[4]; 指针的类型  从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:  (1)intptr;///指针的类型是int  (2)charptr;///指针的类型是char  (3)intptr;///指针的类型是int  (4)int(ptr)[3];///指针的类型是int()[3]  (5)int(ptr)[4];///指针的类型是int()[4]   指针所指向的类型  当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。  从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符去掉,剩下的就是指针所指向的类型。例如:  (1)intptr; ///指针所指向的类型是int  (2)charptr; ///指针所指向的的类型是char  (3)int**ptr; ///指针所指向的的类型是int  (4)int(ptr)[3]; ///指针所指向的的类型是int( )[3]  (5)int(ptr)[4]; ///指针所指向的的类型是int( )[4]  在指针的算术运算中,指针所指向的类型有很大的作用。  指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的”类型”这个概念分成”指针的类型”和”指针所指向的类型”两个概念,是精通指针的关键点之一。 指针的值—-或者叫指针所指向的内存区或地址指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。 指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为si zeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里?(重点注意) 指针本身所占据的内存区  指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在32位平台里,指针本身占据了4个字节的长度。  指针本身占据的内存这个概念在判断一个指针表达式(后面会解释)是否是左值时很有用。     继续阅读
MXlwq's avatar
MXlwq 4月 07, 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自定义渐变背景

工程目录->res->drawable->新建*.xml文件如下:123456789101112131415<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!--颜色和方向--> <gradient android:startColor = "#666666" android:centerColor="#000FFF" android:endColor = "#666666" android:angle = "270"/> <!--圆角半径--> <corners android:radius="4dip"/> </shape> startColor起始颜色centerColor中间颜色endColor最终颜色angle方向     继续阅读
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
 |