true

AsyncTask和Handler

20160502更新,添加代码 AsyncTask实现的原理AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程 优点:简单,快捷过程可控 缺点:在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. Handler异步实现的原理在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)运行并生成Message-Looper获取Message并传递给HandlerHandler逐个获取Looper中的Message,并进行UI变更。 优点:结构清晰,功能定义明确对于多个后台任务时,简单,清晰 缺点:在单个后台异步处理时,显得代码过多,结构过于复杂(相对性) AsyncTask介绍Android的AsyncTask比Handler更轻量级一些(只是代码上轻量一些,而实际上要比handler更耗资源),适用于简单的异步处理。首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。 Android为了降低这个开发难度,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。AsyncTask直接继承于Object类,位置为android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载几个方法(至少重载一个)。 AsyncTask定义的三种泛型类型 Params,Progress和Result。Params 启动任务执行的输入参数,比如HTTP请求的URL。Progress 后台任务执行的百分比。Result 后台执行任务最终返回的结果,比如String。使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法: doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。 onPostExecute(Result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回有必要的话你还得重写以下这三个方法,但不是必须的: onProgressUpdate(Progress…) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。 onPreExecute() 这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。 onCancelled() 用户调用取消时,要做的操作 使用AsyncTask类,必须遵守的准则: Task的实例必须在UI thread中创建; execute方法必须在UI thread中调用; 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params…), onProgressUpdate(Progress…)这几个方法; 该task只能被执行一次,否则多次调用时将会出现异常;     继续阅读
MXlwq's avatar
MXlwq 4月 15, 2016
 | 

PackageManager

PackageManager的功能:1、安装,卸载应用2、查询permission相关信息3、查询Application相关信息(application,activity,receiver,service,provider及相应属性等)4、查询已安装应用5、增加,删除permission6、清除用户数据、缓存,代码段等 PackageManager相关类和方法介绍:PackageManager类说明: 获得已安装的应用程序信息 。可以通过getPackageManager()方法获得。 常用方法:public abstract PackageManager getPackageManager()功能:获得一个PackageManger对象 public abstract Drawable getApplicationIcon(String packageName)参数: packageName 包名功能:返回给定包名的图标,否则返回null public abstract ApplicationInfo getApplicationInfo(String packageName, int flags)参数:  packagename 包名  flags 该ApplicationInfo是此flags标记,通常可以直接赋予常数0即可功能:返回该ApplicationInfo对象 public abstract List getInstalledApplications(int flags)参数:  flag为一般为GET_UNINSTALLED_PACKAGES,那么此时会返回所有ApplicationInfo。我们可以对ApplicationInfo  的flags过滤,得到我们需要的。功能:返回给定条件的所有PackageInfo public abstract List getInstalledPackages(int flags)参数如上功能:返回给定条件的所有PackageInfo public abstract ResolveInfo resolveActivity(Intent intent, int flags)参数:  intent 查寻条件,Activity所配置的action和category  flags: MATCH_DEFAULT_ONLY :Category必须带有CATEGORY_DEFAULT的Activity,才匹配       GET_INTENT_FILTERS :匹配Intent条件即可       GET_RESOLVED_FILTER :匹配Intent条件即可功能 :返回给定条件的ResolveInfo对象(本质上是Activity)     继续阅读
MXlwq's avatar
MXlwq 4月 13, 2016
 | 

Intent

Intent简介Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent,它允许在应用程序与其它的应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。还可以通过intent.putExtra()等方法携带数据。 两种Intent区别显式Intent:通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,去调用Intent.setComponent()\Intent.setClassName()或Intent.setClass()方法 或者在new Intent(A.this,B.class)指明需要转向到的Activity,显式意图明确指定了要激活的组件是哪个组件,一般是在相同的应用程序内部实现的。隐式Intent:通过Intent Filter来实现的,它一般用在没有明确指出目标组件名称的前提下。Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。一般是用于在不同应用程序之间。 隐式Intent我们在编写需要被隐式调用的界面的清单文件时,会指定一个Intent Filter(意图过滤器),它是用来匹配隐式Intent的,当一个意图对象被一个意图过滤器进行匹配测试时,会有三个方面会被参考到: 动作(action)数据(data)类别(catagory) Intent FilterIntent Filter是用来注册Activity Service和Broadcast Receiver具有能在某种数据上执行一个动作的能力。使用Intent Filter,应用程序组件告诉 Android,它们能为其它程序的组件的动作请求提供服务,包括同一个程序的组件、本地的或第三方的应用程序。 为了注册一个应用程序组件为 Intent 处理者,在组件的 manifest 节点添加一个 intent-filter 标签。 在 Intent Filter 节点里使用下面的标签(关联属性),你能指定组件支持的动作、种类和数据: 动作测试元素中可以包括子元素,比如:12345<intent-filter ><action android:name="com.example.project.SHOW_CURRENT" /><action android:name="com.example.project.SHOW_RECENT" /><action android:name="com.example.project.SHOW_PENDING" /></intent-filter > 一条元素至少应该包含一个,否则任何Intent请求都不能和该匹配。如果Intent请求的Action和中个某一条匹配,那么该Intent就通过了这条的动作测试。如果Intent请求或中没有说明具体的Action类型,那么会出现下面两种情况。(1) 如果中没有包含任何Action类型,那么无论什么Intent请求都无法和这条匹配;(2) 反之,如果Intent请求中没有设定Action类型,那么只要中包含有Action类型,这个Intent请求就将顺利地通过的行为测试。 类别测试元素可以包含子元素,比如:1234<intent-filter . . . ><category android:name="android.Intent.Category.DEFAULT" /><category android:name="android.Intent.Category.BROWSABLE" /></intent-filter> 只有当Intent请求中所有的Category与组件中某一个IntentFilter的完全匹配时,才会让该 Intent请求通过测试,IntentFilter中多余的声明并不会导致匹配失败。一个没有指定任何类别测试的 IntentFilter仅仅只会匹配没有设置类别的Intent请求。 数据测试数据在中的描述如下:1234<intent-filter . . . ><data android:type="video/mpeg" android:scheme="http" . . . /><data android:type="audio/mpeg" android:scheme="http" . . . /></intent-filter > 元素指定了希望接受的Intent请求的数据URI和数据类型,URI被分成三部分来进行匹配:scheme、 authority和path。其中,用setData()设定的Inteat请求的URI数据类型和scheme必须与IntentFilter中所指定的一致。若IntentFilter中还指定了authority或path,它们也需要相匹配才会通过测试。     继续阅读
MXlwq's avatar
MXlwq 4月 12, 2016
 | 

Android开启自启动Service或Activity

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

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
 |