应用已经开发出来了,下一步我们需要思考推广方面的工作。那么如何才能让更多的用户知 道并使用我们的应用程序呢?在手机领域,最常见的做法就是将程序发布到某个应用商店中,这 样用户就可以通过商店找到我们的应用程序,然后轻松地进行下载和安装。
说到应用商店,在Android领域真的可以称得上是百家争鸣,除了谷歌官方推出的GooglePlay 之外,在中国还有像360、豌豆荚、百度、应用宝等知名的应用商店。当然,这些商店所提供的功能都是比较类似的,发布应用的方法也大同小异,因此这里我们就只学习如何将应用发布到360应用商店,其他应用商店的发布方法相信你完全可以自己摸索出来。
15.1生成正式签名的APK文件
之前我们一直都是通过Android Studio来将程序安装到手机上的,而它背后实际的工作流程是,Android Studio会将程序代码打包成一个APK文件,然后将这个文件传输到手机上,最后再执行安装操作。Android系统会将所有的APK文件识别为应用程序的安装包,类似于Windows系统上的EXE文件。
但并不是所有的APK文件都能成功安装到手机上,Android系统要求只有签名后的APK文件才可以安装,因此我们还需要对生成的APK文件进行签名才行。那么你可能会有疑问了,直接通过Android Studio来运行程序的时候好像并没有进行过签名操作啊,为什么还能将程序安装到手机上呢?这是因为Android Studio使用了一个默认的keystore文件帮我们自动进行了签名。点击 Android Studio 右侧工具栏的 Gradle~~►项目名—>:app—>Tasks—>android,双击 signingReport, 结果如图15.1所示。
也就是说,我们所有通过Android Studio来运行的程序都是使用了这个debug.keystore文件来进行签名的。不过这仅仅适用于开发阶段而已,现在酷欧天气已经快要发布了,要使用一个正式的keystore文件来进行签名才行。下面我们就来学习一下,如何生成一个带有正式签名的APK文件。
15.1.1 使用 Android Studio 生成
先学习一下如何使用Android Studio来生成正式签名的APK文件。点击Android Studio导航栏上的Build^Generate Signed APK,首次点击可能会提示让我们输入操作系统的密码,如图15.2 所示。
输入密码之后点击0K,则会弹出如图15.3所示的创建签名APK对话框。
由于目前我们还没有一个正式的keystore文件,所以应该点击Create new按钮,然后会弹出一个新的对话框来让我们填写创建keystore文件所必要的信息。根据自己的实际情况进行填写就行了,如图15.4所示。
这里需要注意,在Validity那一栏填写的是key store文件的有效时长,单位是年,一般建议 时间可以填得长一些,比如我填了 30年。然后点击0K,这时我们刚才填写的信息会自动填充到 创建签名APK对话框当中,如图15.5所示。
如果你希望以后都不用再输keystore的密码了,可以将Remember passwords选项勾上。然后 点击Next,这时就要选择APK文件的输出地址了,如图15.6所示。
这里默认是将APK文件生成到项目的根目录下,我就不做修改了。现在点击Finish,然后 稍等一段时间,APK文件就都会生成好了,并且会在右上角弹出一个如图15.7所示的提示。
我们点击提示上的Show in Explorer可以立刻查看生成的APK文件,如图15.8所示。
这里的app-release.apk就是带有正式签名的APK文件了。
15.1.2使用Gradle生成
上一小节中我们使用了 Android Studio提供的可视化工具来生成带有正式签名的APK文件, 除此之外,Android Studio其实还提供了另外一种方式 用Gradle生成,下面我们就来学习 一下。
Gradle是一个非常先进的项目构建工具,在Android Studio中开发的所有项目都是使用它来 构建的。在之前的项目中,我们也体验过了 Gradle带来的很多便利之处,比如说当需要添加依 赖库的时候不需要自己再去手动下载了,而是直接在dependencies闭包中添加一句引用声明就可 以了。
不过这里我要提醒你一句,如果你想将Gradle完全精通的话,这个难度就比较大了。Gradle 的用法极为丰富,想要完全掌握它的用法,其复杂程度并不亚于学习一门新的语言(Gradle是使 用Groovy语言编写的)。而Android中主要只是使用Gradle来构建项目而已,因此这里我们掌握 一些它的基本用法就好了,重点还是要放在功能开发上面,不要本末倒置了。当然,如果你对 Gradle非常感兴趣,也可以到网上去查询它的更多用法。
下面我们开始学习如何使用Gradle来生成带有正式签名的APK文件。编辑app/build.gradle 文件,在android闭包中添加如下内容.
这里在android闭包中添加了一个signingConfigs闭包,然后在signingConfigs闭 包中又添加了一个config闭包。接着在config闭包中配置keystore文件的各种信息,storeFile用 于指定keystore文件的位置,storePassword用于指定密码,keyAlias用于指定别名,keyPassword 用于指定别名密码。
将签名信息都配置好了之后,接下来只需要在生成正式版APK的时候去应用这个配置就可 以了。继续编辑app/build,gradle文件,如下所示:
android { buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(1proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs・ config }]}
这里我们在buildTypes下面的release闭包中应用了刚才添加的签名配置,这样当生成正式版 APK文件的时候就会自动使用我们刚才配置的签名信息来进行签名了。
现在build.gradle文件已经配置完成,那么我们如何才能生成APK文件呢?其实非常简单, Android Studio中内置了很多的Gradle Tasks,其中就包括了生成APK文件的Task。点击右侧工 具栏的 Gradle~>项目名—>:app—>Tasks-^build,如图 15.9所示。
其中assembleDebug用于生成测试版的APK文件,assembleRelease用于生成正式版的APK 文件,assemble用于同时生成测试版和正式版的APK文件。在生成APK之前,先要双击clean 这个Task来清理一下当前项目,然后双击assembleRelease,结果如图15.10所示。
可以看到,这里提示我们BUILD SUCCESSFUL,说明assembleRelease执行成功了。APK 文件会自动生成在app/build/outputs/apk目录下,如图15.11所示。
其中,app-release.apk就是带有正式签名的APK文件了。另外还有一个app-release-unaligned. apk,这是一个没有经过对齐的正式版APK文件,我们直接忽略它就可以了。
虽说现在APK文件已经成功生成了,不过还有一个小细节需要注意一下。目前keystore文 件的所有信息都是以明文的形式直接配置在build.gradle中的,这样就不太安全。Android推荐的 做法是将这类敏感数据配置在一个独立的文件里面,然后再在build.gradle中去读取这些数据。
下面我们来按照这种方式实现。Android Studio项目的根目录下有一个gradle.properties文件, 它是专门用来配置全局键值对数据的,我们在gradle.properties文件中添加如下内容:
KEY_PATH=C:/Users/Administrator/Documents/guoHn. jksKEY[PASS=1234567ALIAS_NAME=guolindev ALIAS_PASS=1234567
可以看到,这里将keystore文件的各种信息以键值对的形式进行了配置,然后我们在build.gradle 中去读取这些数据就可以了。编辑app/build.gradle文件,如下所示:
android {
signingConfigs (
config {
storeFile file(KEY__PATH)
storePassword KEY_PASS
keyAlias ALIAS_NAME
keyPassword ALIAS_PASS
} _
}
}…
这里只需要将原来的明文配置改成相应的键值,一切就完工了。这样直接查看build.gradle 文件是无法看到keystore文件的各种信息的,只有查看gradle.properties文件才能看得到。然后我 们只需要将gradle.properties文件保护好就行了,比如说将它从Git版本控制中排除。这样 gradle.properties文件就只会保留在本地,从而也就不用担心keystore文件的信息会泄漏了。
15.1.3生成多渠道APK文件
现在你已经掌握了两种生成带有正式签名的APK文件的方式,从简易程度上来讲,两种方 式差不多,基本都还是比较简单的,选择使用哪一种全凭你自己的喜好。
现在APK文件已经生成好了,可能在大多数情况下,我们都只需要一个APK文件就足够了, 不过本小节中我们再来讨论一种比较特殊的情况——生成多渠道APK文件。
在本章的开头就已经提到过,目前Android领域的应用商店非常多,不像苹果只有一个App Store0当然我们完全可以使用同一个APK文件来上架不同的应用商店,但是如果你有一些特殊 需求的话,比如说针对不同的应用商店渠道来定制不同的界面,这就比较头疼了。
传统情况下,开发这种差异性需求非常痛苦,通常需要维护多份代码版本,然后逐个打成相 应渠道的APK文件。一旦有任何功能变更就苦不堪言,因为每份代码版本里面都需要逐个修改 一遍。
幸运的是,现在Android Studi。提供了一种非常方便的方法来应对这种差异性需求,极大程 度地解决了之前版本维护困难的问题,下面我们就来学习一下。
比如说这里我们准备生成360和百度两个渠道的APK文件,那么修改app/build.gradle文件, 如下所示:
android (compileSdkVersion buildToolsVersion defaultConfig { applicationld minSdkVersion24"24.0.2""com.coolweather.android15targetSdkVersion 24 versionCode 1 versionName "1.0" } productFlavors { qihoo { applicationld "com.coolweather.android.qihoo" } baidu {applicationld "com・coolweather.android.baidu" }}
可以看到,这里添加了一个productFlavors闭包,然后在该闭包中添加所有的渠道配置就 可以了。注意Gradle中的配置规定不能以数字开头,因此这里我将360的渠道名配置成了 qihoo。 渠道名的闭包中可以覆写defaultConfig中的任何一个属性,比如说这里将applicationld属性 进行了覆写,那么最终生成的各渠道APK文件的包名也将各不相同。
接下来我们开始针对不同渠道编写差异性需求。在app/src目录下(main的平级目录)新建 一个baidu目录,然后在baidu目录下再新建java和res这两个目录,如图15.12所示。
这样我们就可以在这里编写百度渠道特有的功能了,java目录用于存放代码,res目录用于 存放资源,如果需要覆写AndroidManifest文件中的内容,还可以在baidu目录下再新建一个 AndroidManifest.xml 文件。
当然,实际上我们并没有什么渠道差异性的需求,因此这里也只是为了演示一下,我们就给 不同渠道的APK起一个不同的应用名吧。
应用名之前是定义在main/res/values/string.xml文件中的,那么我们在baidu目录下也建立一 个相同的目录结构,然后将baidu/res/values/string.xml中的内容进行如下修改:
<resources>
<string name="app_name”>酷欧百度版v/string>
</resources>
这样百度渠道的APK就会使用baidu/res/values/string.xml中定义的应用名来覆盖原有的应用 名。同样的道理,我们再新建一个qihoo目录,然后在qihoo目录下也建立相同的目录结构,并 将string.xml中的内容进行如下修改:
<resources>
<string name="app_name">酷欧 360 版v/string> </resources>
这样我们就以一个简单的示例实现渠道差异性需求了,下面开始来生成多渠道的APK文件。观 察右侧工具栏的Gradle Tasks列表,你会发现里面多出了几个新的Task,如图15.13所示。
其中,如果你只想生成百度渠道的APK文件,那么就执行assembleBaidu;如果你只想生成 360渠道的APK文件,那么就执行assembleQihoo;如果你想一次性生成所有渠道的APK文件, 那么就还是执行assembleRelease o
除了使用Gradle的方式生成之外,使用Android Studio提供的可视化工具也是能生成多渠道 APK文件的,如图15.14所示。
这里我们可以选择是生成百度渠道的APK文件,还是生成360渠道的APK文件,如果你想 一次性生成多个渠道的APK文件,按住CTRL键就可以进行多选了。
接下来我们可以通过adb install命令将生成好的APK文件安装到模拟器上,如图15.15 所示。
adb install命令的后面加上APK文件的路径,就可以将该APK文件安装到模拟器上了。 我们使用同样的方法将百度和360这两个渠道的APK文件都安装到模拟器上,结果如图15.16 所示。
可以看到,目前模拟器上有3个版本的酷欧天气,这是由于之前我们在productFlavors中覆 写了各渠道的applicationld属性,保证每个APK文件的包名都不相同,因而它们才能安装到 同一个设备上面。另外,从应用名上来看,渠道差异性开发工作也顺利完成了。
不过,上面的例子只是为了演示生成多渠道APK功能而特意编写的,实际上我们并没有 这个需求。现在将productFlavors闭包删除,恢复成之前的APK文件,我们准备进行上架 操作。
15.2申请360开发者账号
目前,酷欧天气的APK安装包已经准备好了,但如果想要把它发布到360应用商店,还需 要去申请一个360开发者账号才行,申请地址是:http://dev.360.cno
打开该网页,在页面顶部有登录和注册按钮。如果你还没有360账号,则需要在这里注册一 个新的账号,如果你之前已经有360账号了,那么直接登录就可以了。
登录成功之后打开http://dev.360.cn/mod/developer这个网址,来申请成为开发者,如图15.17这个网址,来申请成为开发者,如图15.17http://dev.360.cn/mod/developer这个网址,来申请成为开发者,如图15.17 所示。
这里可以选择是申请成为个人开发者还是企业开发者。很显然,我们是以个人的身份来发布 应用的,那么点击个人开发者就可以了。
接下来需要填写一些基本信息和联系方式,如图15.18所示。
填写完基本信息之后向下滚动继续填写联系方式,全部填写完成之后,点击屏幕最下方的“同 意并注册开发者”按钮来完成注册,如图15.19所示。
这样你就成功成为一名360开发者了!
15.3发布应用程序
接下来我们开始发布酷欧天气这个应用,还是在浏览器访问地址:http://dev.360.cn,你会在 界面上看到如图15.20所示的内容。
然后点击软件发布,就会显示如图15.21所示的界面。
我们需要选择是发布软件类应用还是电子书类应用,这里点击软件。接下来会弹岀一个新的 界面让我们上传APK以及填写应用信息。首先来上传APK吧,点击上传按钮,选择带有正式签 名的APK文件,然后就会自动开始上传了,上传完成之后会显示如图15.22所示的界面。
这个界面提醒我们,目前应用的安全系数较低,建议对APK进行加固。实际上这个是360 应用商店的特殊需求,并不是所有应用商店都要求进行加固的。但是我们还是得按照它的要求来 修改,不然审核可能会不通过。
这里点击立即加固按钮,360会帮忙我们将原APK文件进行加固,并生成一个新的APK文 件,如图15.23所示。
不过这个加固后的APK文件是没有经过签名的,也就是说我们还需要将它下载下来,然后 手动进行签名才行。
点击下载应用按钮,先将加固后的APK文件下载下来。接下来的工作就有点烦琐了,因为 Android Studio中并没有提供对一个未签名的APK直接进行签名的功能,因此我们只能通过最原 始的方式,使用jarsigne「命令来进行签名。
在命令行界面按照以下格式输入签名命令:
jarsigner -verbose -sigalg SHAlwithRSA -digestalg SHA1 -keystore [keystore 文件路径] -storepass [keystore文件密码][待签名APK路径][keystore文件别名]
将[]中的描述替换成keystore文件的具体信息就能签名成功了,注意[]符号是不需要的。接 着我们将签名后的APK文件重新上传就可以了。
APK±传成功之后,接下来需要选择应用的分类,如图15.24所示。
这里我们将应用分类选择成实用工具-天气。下面还有一个上传版权证明的选项,这是一个 选填项,我们直接忽略就可以了。
接着向下滚动网页,设置支持的语言以及资费类型,如图15.25所示。
继续滚动网页,下面需要填写应用简介以及当前版本介绍,如图15.26所示。
在版本介绍的下面,360还要求填写一项隐私权限说明,由于酷欧天气只申请了一个网络权 限,因此没什么需要说明的,我们直接忽略这一项就可以了。
继续向下滚动网页,接下来需要上传一张高分辨率的应用图标,图标要求是512x512像素 的PNG格式图片,如图15.27所示。
上传好了图标,我们还需要提供5张酷欧天气的屏幕截图,点击上传截图按钮,然后选择准 备好的图片即可,如图15.28所示。
继续向下滚动,还有一个审核辅助说明的选填项,我们也直接忽略就可以了。最后就是一些 额外的定制选项,如图15.29所示。
这里我们选择不进行云测试,并在审核后立即发布。
激动人心的时刻终于到了,现在点击一下提交审核按钮就可以将酷欧天气发布到360应用商 店了,这时会显示如图15.30所示的提示。
由于360会对我们的应用程序进行审核,接下来又进入了等待当中。不过还好,根据提木来 看,这次也许不需要等太久。
果不其然,过了几个小时之后在360手机助手上搜索酷欧天气关键字,就可以看到这个应用 已经成功上线了,如图15.31所示。
点击进去可以查看应用的详情,如图15.32所示。
到了这里,我们就将应用程序的发布工作全部完成了,之后你应该尽可能地多为你的应用进 行宣传,因为用户越多,你能得到的回报就越大。那么如何才能从我们辛辛苦苦编写的程序中得 到回报呢?方式有很多种,其中较为常见的做法就是通过广告来进行盈利,因此下一节我们就学 习一下,如何在应用程序中嵌入广告。
15.4嵌入广告进行盈利
谷歌充分考虑到了可以在Android应用程序中嵌入广告来让开发者获得收入,因此早早地就 收购了 AdMob公司。AdMob创立于2006年,是全球最早致力于在移动设备上提供广告服务的 公司之一,如今成为了谷歌的子公司,AdMob的广告更加适合在Android系统以及Google Play 上面进行投放。
不过对于国内开发者来说,AdMob可能就不是那么适合了。因为AdMob平台上的广告大多 都是英文的,中文广告数有限,并且将AdMob账户中的钱提取到银行账户中也比较麻烦,因此 这里我们就不准备使用AdMob T,而是将眼光放在一些国内的移动广告平台上面。在国内的这 一领域,做得比较好的移动广告平台也不少,其中我个人认为腾讯广告联盟(原广点通)特别专 业,因此我们就选择它来为酷欧天气提供广告服务吧。
15.4.1注册腾讯广告联盟账号
下面开始动手,首先第一步我们需要注册一个腾讯广告联盟的账号,注册地址为http:// :http://e.qq. com/dev/index.html 打开该网页,选择使用QQ号登录,然后就会自动跳转到腾讯广告联盟的注册界面,如图15.33 所示。图15.33中的所有内容都是必填项,我们按照实际情况来填写就可以了,填写完成之后点 击下一步,如图15.34所示。
15.4.2新建媒体和广告位
审核通过之后,我们就可以进入到腾讯广告联盟的后台,开始给酷欧天气添加广告了。首先 需要进入媒体管理界面,点击新建媒体按钮,这时会显示一个页面来让你填写应用的相关信息, 我们根据提示一一填好即可,如图15.37所示。
注意这里需要填写一个详情页地址,也就是酷欧天气在360应用商店上的详情页地址。打开 http://zhushou.360.cn,在搜索框上输入“酷欧天气”,就能找到该地址了。
填写完成之后点击下一步,接下来需要下载SDK,如图15.38所示。
点击Android SDKT载按钮,先把SDK下载下来,我们稍后就会进行接入。继续点击下一 步,如图15.39所示。
这里要求填入一个APK的下载的地址,我们直接就填入图15.37当中的详情页地址就可以
了。点击完成按钮,现在又会进入到审核等待当中。
为什么新建媒体也需要进行审核呢?这是因为腾讯为了防止某些开发者在垃圾软件上面投 放广告,因此要求开发者必须提交应用程序的APK文件进行审核,只有审核通过的应用才允许 进行广告投放。那么我们只能继续等待。审核通过之后,在媒体管理界面查看新建媒体的状态, 如图15.40所示。
可以看到,联盟开通状态显示已开通,业务状态显示正常,说明新建的媒体已经通过审核了。 注意这里还自动生成了一个应用ID,我们稍后就会用到。
现在点击新建广告位,就可以来创建一个广告位了,如图15.41所示。
首先要输入广告位的名称,然后选择广告位的类型。腾讯广告联盟支持Banner.应用墙、插 屏和开屏这4种广告类型,具体每种广告类型的区别你可以通过查阅文档进行了解,这里我们选 择开屏广告。接下来还可以对一些敏感行业的广告进行屏蔽,选择完成之后点击创建按钮完成广 告位创建。
就能查看到我们刚刚新建的广告位了,如图15.42所示。
其中,4010212448179536是广告位ID, 1105585573是应用ID。有了这两个数据之后,我们
就可以开始接入广告SDK To
15.4.3接入广告SDK
首先将刚才下载的广告SDK压缩包解压,里面的内容非常简单,如图15.43所示。
其中resources文件夹中放的是一些资源图片,我们使用不到。GDTDEVguide.4.9.html是广 告 SDK 的对接文档,GDTUnionDemo.zip 是广告 SDK 的对接示例,GDTUnionSDK49.533.min.jar 则是广告SDK中最主要的一个Jai•包文件了。
由于腾讯广告SDK中的功能还是挺多的,这里不可能面面俱到,将每一个功能都进行详细 地讲解。因此我准备只讲解开屏广告这一种类型的广告用法,剩下的其他功能你可以通过阅读文 档来进行学习。
我们先将 GDTUnionSDK49.533.min.jar 复制到 app/libs 目录当中,并点击一下 Android Studio 顶部工具栏中的Sync按钮完成同步。
接着在AndroidManifest.xml中声明以下权限,其中网络访问权限是之前声明过的,不需要声 明两遍。
注意,其中 READ PHONE STATE. ACCESS COARSE LOCATION 和 WRITE_EXTERNAL_STORAGE 这3个权限是危险权限,因此我们待会还需要进行运行时权限处理。
接下来在<application>标签中添加如下内容:
<activity
android:name="com.qq.e.ads.ADActivity"
android:configChanges=Hkeyboard|keyboardHidden|orientation|screenSize" /> <service
android:name="com.qq.e.comm.DownloadService"
android:exported="false" />
这样就将配置工作完成了。
然后我们还需要创建一个用于显示开屏广告的活动,右击com.coolweather.android >New
Activity—>Empty Activity,创建一个 SplashActivity,并将布局名指定成 activity splash.xmlo 修 改activity splash.xml中的代码,如下所示:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android: id=,,(a+id/container"
android:layout_width="match_pa rent"
android:layout_height="match_parent">
</RelativeLayout>
这里只有一个空的RelativeLayout,我们并不需要在RelativeLayout当中放入什么内容,但是 必须给它定义一个id。
接着修改SplashActivity中的代码,如下所示:
public class SplashActivity extends AppCompatActivity {
private RelativeLayout container;
/**
*用于判断是否可以跳过广告,进入MainActivity
*/
private boolean canJump;
^Override
protected void onCreate(Bundle savedlnstanceState) { super.onCreate(savedlnstanceState); setContentView(R.layout.activitysplash); container = (RelativeLayout) findViewByld(R.id.container);
//进行运行时权限处理
List<String> permissionList = new ArrayList<>();
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_ STATE) != PackageManager.PERMISSIONGRANTED) { ~
permissionList.add(Manifest.permission.READPHONESTATE);
} 一 ~
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_ COARSE LOCATION) != PackageManager.PERMISSION GRANTED) { ~
permissionList.add(Manifest.permission.ACCESSCOARSELOCATION);
} 一 ~
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_ EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { -
permissionList.add(Manifest.permission.WRITEEXTERNALSTORAGE);
} ~ ~
if (!permissionList.isEmpty()) {
String [] permissions = permissionList.toArray(new String[permissionList. size()]);
ActivityCompat.requestPeemissions(this, permissions, 1);
} else {
requestAds();
}
}
/**
*请求开屏广告
*/
private void requestAds() {
String appld = n1105585573";
566 第15章 最后一步——将应用发布到360应用商店
String adld = "4010212448179536”;
new SplashADfthis, container, appld, adld, new SplashADListenerf) { ^Override public void onADDismissedf) (
//广告显示完毕
forward();
}
(QOverride
public void onNoAD(int i) {
//广告加载失败
forward();
}
(QOverride
public void onADPresent() {
//广告加载成功
}
^Override
public void onADClicked() {
//广告被点击
}
});
}
@0verride
protected void onPause() {
super,onPause(); canjump = false;
}
(QOverride
protected void onResume() { super.onResume(); if (canJump) { forward();
}
canJump = true;
}
private void forward() {
if (canJump) {
// 跳转到 MainActivity
Intent intent = new Intent(this, MainActivity.class); startActivity(intent);
finish();
} else (
canJump = true;
}
}
(QOverride
public void onRequestPermissionsResult(int requestcode, String!] permissions, int[] grantResults) (
switch (requestcode) { case 1:
if (grantResults.length > 0) { for (int result : grantResults) { if (result != PackageManager.PERMISSION_GRANTED) { Toast ,makeText(this, ”必须同意所有权限钎能使用本程序”, Toast.LENGTHSHORT).show();
finish(); return;
} } requestAds();
} else {
Toast. makeText( this, ”发生未知错误”,Toast. LENGTH_SHORT). show(); finishO;
} break;
default:
}
}
}
可以看到,在onCreate()方法中,我们先是获取到了 RelativeLayout的实例,紧接着就开 始进行运行时权限处理。由于这里也是需要在运行时一次性申请多个权限,因此采用了和11.3.2 小节同样的写法,相信你一定不会陌生吧。
当用户同意了所有的权限申请之后,就会调用requestAdsO方法来请求广告数据。在 requestAdsO方法中我们先是定义了 appld和adld这两个变量,它们的值就是在腾讯广告联 盟后台生成的应用ID和广告位ID,然后创建SplashAD的实例来获取广告数据。SplashAD的构 造函数接收5个参数,第1个参数是当前活动的实例,第2个参数是RelativeLayout的实例,第 3个参数是应用ID,第4个参数是广告位ID,相信前4个参数都没什么需要解释的。第5个参数 是一个SplashADListener的实例,用于监听广告数据的回调。其中onADDismissed()方法会在 广告显示完毕时回调,onNoADO方法会在广告加载失败时回调,onADPresent()方法会在广告 加载成功时回调,onADClicked()方法会在广告被点击时回调。当广告显示完毕或者广告加载失 败时,我们调用forwardO方法跳转到MainActivity,并将当前活动关闭即可。
另外注意这里还使用了一个canjump变量用于对活动跳转进行控制。这是因为如果用户点 击了广告,会启动一个新的活动来展示广告的详细内容,这个时候即使回调了 onADDismissed() 方法,显然也不应该启动MainActivity,因此我们在onPause()方法中将canJump设置成了 false。 然后在forward()方法中发现canJump是false,因此不会进行跳转,但是会将canJump设置成 trueo最后,当用户看完了广告回到SplashActivity时,onResume()方法将会执行,这个时候发 现canJump是true,因此就会调用forward()方法来启动MainActivityo
整体流程大概就是这个样子了,接下来我们还需要将主活动设置成SplashActivity而不再是 MainActivity,否则广告界面将无法得到展示。修改AndroidManifest.xml中的代码,如下所示:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.coolweather.android">
<application
android:name="org.litepal.LitePalApplication"
android:aflowBackup="true"
android: icon=,,(amipmap/logo"
android:label="@string/app name"
android:supportsRfl="true"
android :theme="(astyle/AppTheme,,>
<activity android:name=".MainActivity">
</activity>
<activity android:name=".SplashActivity">
<intent-filter>
<action android:name=uandroid.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
</activity>
</application>
</manifest>
这样我们就将广告SDK全部对接完成了,现在可以重新运行一下程序来看一看效果。不过 需要注意,广告在模拟器上是不会显示的,我们要用真正的手机测试才行。程序启动后首先会弹 岀运行时权限的申请对话框,全部都点击允许之后就能看到广告数据了,如图15.44所示。
开屏广告会持续5秒钟时间,然后就会自动跳转到MainActivity中,后面的流程就和之前是 完仝一样的了。
15.4.4重新发布应用程序
现在我们已经成功在酷欧天气中接入了广告功能,那么是时候将这个新版本更新到360应用 商店上了。
由于即将发布的会是新一版的酷欧天气,因此在生成安装包之前还需要修改一下应用程序的 版本号信息。编辑app/build.gradle文件,如下所示:
android {
compileSdkVersion buildToolsVersion defaultConfig { applicationld minSdkVersion
targetSdkVersion 24
versionCode 2 versionName "1.1"
可以看到,这里将versionCode改成了 2, versionName改成了 l.lo需要注意的是,每个版 本的versionCode和versionName都不能和其他版本相同,且新版应用的版本号必须大于老版应 用的版本号。
接下来我们就可以使用在15.1节学习的技术来生成新的APK文件,具体的步骤就不再重复 介绍了,最终会生成一个新的app-release.apk文件,下面我们将它重新发布到360应用商店。
打开360开发者后台的管理中心页面,然后点击酷欧天气的更新管理按钮,如图15.45所示。
点击编辑与更新按钮,就能上传新的APK文件了。注意上传之后仍然会提醒应用的安全系 数较低,我们只需要使用和之前同样的方式进行加固就可以了。
另外,由于新版的酷欧天气中增加了一些敏感隐私权限,因此我们还需要在这一项上面做出 说明,如图15.46所示。
现在只需要点击页面最下方的提交审核按钮,新版本的酷欧天气就发布成功了,当然还需要 通过360的审核才行。以后每当有用户观看或点击了应用程序中的广告时,我们就能真正地得到 收益。在腾讯广告联盟的后台管理界面可以查看到每天的收益情况,如图15.47所示。
你的应用越成功,所获得的广告收益也会越多,因此赶快去编写更多优秀的应用程序来赚更 多的钱吧,相信通过整本书的学习,你已经有足够的能力做到了!
15.5结束语
就这样,本书所有的内容你都学完了,现在你已经成功毕业,并且成为了一名合格的Android 开发者。但是如果想要成为一名出色的Android开发者,光靠本书中的这些理论知识以及少量的实 践还是不够的,你需要真正步入到工作岗位当中,通过更多的项目实战来不断地历练和提升自己。