Android Gradle总结

部分内容来源地址Stormzhang 什么是构建工具?大家都知道Gradle是一种构建工具,那么什么是构建工具呢? 以Android开发为例。 以前开发都是用Eclipse,而 Eclipse最初是用来做Java开发的,而Android的应用层软件是基于 Java 语言开发的,所以最初 Google 还是希望 Android 能在 Eclipse 上进行开发,为了满足这个需求,Google 开发了一个叫 ADT (Android Developer Tools)的东西,正是因为有了 ADT ,从此我们只需要码好代码,然后直接在 Eclipse 上进行编译、运行、签名、打包等一系列流程,而这背后的工作都是 ADT 的功劳。某种意义上 ADT 就是我们的构建工具。 而自 Google 推出 Android Studio 以来,就宣布默认使用 Gradle 来作为构建工具,并且之后放弃更新 ADT ,从此 Gradle 走入 Android 开发者的视野。 一般来说,构建工具除了以上提到的编译、运行、签名、打包等,还具备依赖管理的功能,什么是依赖管理呢?以前在用Eclipse做Java开发,如果需要用到第三方库的时候,一般都是先下载 jar 文件,然后把 jar 文件添加到 libs 目录,bulidpath中配置,然后项目中就可以引用了。但是这种管理方式,假设第三方库有更新,需要下载最新的 Jar 文件,然后替换掉原来的,引用的库少还好,一旦引用的第三方库多,就会很麻烦,可以说这种方式只有依赖,而没有管理。 现在大家不陌生的 Gradle 引用第三方库方式是这样的:1compile 'com.android.support:support-v4:24.0.1'     继续阅读
MXlwq's avatar
MXlwq 7月 01, 2016
 | 

requestWindowFeature方法

Android开发中经常会在setContentView(R.layout.XXX); 之前设置requestWindowFeature(XXXX)。可以实现软件全屏显示、自定义标题(使用按钮等控件)和其他的需求首先介绍一个重要方法那就是requestWindowFeature(featrueId),它的功能是启用窗体的扩展特性。参数是Window类中定义的常量。 枚举常量1.DEFAULT_FEATURES:系统默认状态,一般不需要指定 2.FEATURE_CONTEXT_MENU:启用ContextMenu,默认该项已启用,一般无需指定 3.FEATURE_CUSTOM_TITLE:自定义标题。当需要自定义标题时必须指定。如:标题是一个按钮时 4.FEATURE_INDETERMINATE_PROGRESS:不确定的进度 5.FEATURE_LEFT_ICON:标题栏左侧的图标 6.FEATURE_NO_TITLE:没有标题 7.FEATURE_OPTIONS_PANEL:启用“选项面板”功能,默认已启用。 8.FEATURE_PROGRESS:进度指示器功能 9.FEATURE_RIGHT_ICON:标题栏右侧的图标     继续阅读
MXlwq's avatar
MXlwq 6月 09, 2016
 | 

Gradle多渠道打包

转载自stormzhang 由于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了Gradle,这再也不是事了。 友盟多渠道打包废话不多说,以友盟统计为例,在AndroidManifest.xml里面会有这么一段:123<meta-data android:name="UMENG_CHANNEL" android:value="Channel_ID" /> 里面的Channel_ID就是渠道标示。我们的目标就是在编译的时候这个值能够自动变化。 第一步 在AndroidManifest.xml里配置PlaceHolder123<meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}" />     继续阅读
MXlwq's avatar
MXlwq 5月 23, 2016
 | 

Gradle命令与导入第三方包

转载自stormzhang Android Studio + Gradle的组合用起来非常方便,很多第三方开源项目也早都迁移到了Studio,为此今天就来介绍下查看、编译并导入第三方开源项目的方法。 Sublime + Terminal编译并查看源码首先来给大家介绍一种简便并且个人最喜欢的一种办法。很多时候我们在GitHub上看到一个不错的开源项目,一般有两种需求,阅读源码和查看运行效果,如果是单纯的查看源码我更喜欢用一些轻量级编辑器,如vim,sublime等,vim不是很熟练,所以个人一种都习惯用sublime来查看并阅读源码(实际开发还是Android Studio、Eclipse等IDE更有效率);至于查看运行效果首先得需要apk,对于一些开源项目已提供apk下载,那就好办,直接安装到手机即可。 而对于一些没有提供apk下载的,则需要自己手动编译打包。 下面以9GAG为例来讲解下命令行Gradle编译的过程。 切换到9GAG项目的根目录,执行 ./gradlew -v 来查看下项目所用的Gradle版本     继续阅读
MXlwq's avatar
MXlwq 5月 23, 2016
 | 

Gradle基础

转载自stormzhang Gradle 基本概念Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言。 下面就以我的开源项目9GAG来详细讲解下和Gradle相关的知识, 和Gradle相关的几个文件一般有如下几个:红色标记部分从上到下咱们来一步步分析:     继续阅读
MXlwq's avatar
MXlwq 5月 23, 2016
 | 

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
 |