Android沉浸顶栏

沉浸式状态栏 效果看图:Android4.4Android5.0只有Android版本大于等于4.4版本支持这个半透明状态栏的效果,但是4.4和5.0的显示效果有一定的差异 实现方法定义颜色res/values/color.xml123456<?xml version="1.0" encoding="utf-8"?><resources> <color name="primary">#FF03A9F4</color> <color name="primary_dark">#FF0288D1</color> <color name="status_bar_color">@color/primary_dark</color></resources>     继续阅读
MXlwq's avatar
MXlwq 4月 30, 2016
 | 

Intent传递对象的两种方法(Serializable,Parcelable)

Intent在不同的组件中传递对象数据的应用非常普遍。下面介绍两种通过Intent传递对...     继续阅读
MXlwq's avatar
MXlwq 4月 16, 2016
 | 

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
 | 

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
 |