第015天:将APP发布到应用商店(完结)

news2024/11/26 10:19:33

        应用已经开发出来了,下一步我们需要思考推广方面的工作。那么如何才能让更多的用户知 道并使用我们的应用程序呢?在手机领域,最常见的做法就是将程序发布到某个应用商店中,这 样用户就可以通过商店找到我们的应用程序,然后轻松地进行下载和安装。

        说到应用商店,在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. jks

KEY[PASS=1234567

ALIAS_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 minSdkVersion
24
"24.0.2"
"com.coolweather.android
15
targetSdkVersion 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目录下再新建javares这两个目录,如图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方法中我们先是定义了 appldadld这两个变量,它们的值就是在腾讯广告联 盟后台生成的应用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()方法中发现canJumpfalse,因此不会进行跳转,但是会将canJump设置成 trueo最后,当用户看完了广告回到SplashActivity时,onResume()方法将会执行,这个时候发 现canJumptrue,因此就会调用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需要注意的是,每个版 本的versionCodeversionName都不能和其他版本相同,且新版应用的版本号必须大于老版应 用的版本号。

        接下来我们就可以使用在15.1节学习的技术来生成新的APK文件,具体的步骤就不再重复 介绍了,最终会生成一个新的app-release.apk文件,下面我们将它重新发布到360应用商店。

        打开360开发者后台的管理中心页面,然后点击酷欧天气的更新管理按钮,如图15.45所示。

        点击编辑与更新按钮,就能上传新的APK文件了。注意上传之后仍然会提醒应用的安全系 数较低,我们只需要使用和之前同样的方式进行加固就可以了。

        另外,由于新版的酷欧天气中增加了一些敏感隐私权限,因此我们还需要在这一项上面做出 说明,如图15.46所示。

        现在只需要点击页面最下方的提交审核按钮,新版本的酷欧天气就发布成功了,当然还需要 通过360的审核才行。以后每当有用户观看或点击了应用程序中的广告时,我们就能真正地得到 收益。在腾讯广告联盟的后台管理界面可以查看到每天的收益情况,如图15.47所示。

        你的应用越成功,所获得的广告收益也会越多,因此赶快去编写更多优秀的应用程序来赚更 多的钱吧,相信通过整本书的学习,你已经有足够的能力做到了!

15.5结束语

        就这样,本书所有的内容你都学完了,现在你已经成功毕业,并且成为了一名合格的Android 开发者。但是如果想要成为一名出色的Android开发者,光靠本书中的这些理论知识以及少量的实 践还是不够的,你需要真正步入到工作岗位当中,通过更多的项目实战来不断地历练和提升自己。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/333105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端修行 - 与后端配合的那些事情

最近总结一下个人作为前端&#xff0c;与后端、测试、以及产品经理、UI设计之间配合的那些事情&#xff0c;想到哪里说到哪里 1 关于正确认识项目研发一号位都是后端的这个事情 项目研发一号位&#xff0c;在有的公司可能会叫做SDM&#xff08;software development manger&am…

springboot 接入websocket实现定时推送消息到客户端

目录说明代码实现说明 如标题&#xff0c;举例需求场景&#xff1a; 前端与后端websocket连接上后&#xff0c;多用户登录&#xff0c;后端根据不同用户定时发消息给前端用于展示 代码实现 1、 <dependency><groupId>org.springframework.boot</groupId>…

vit-pytorch实现 MobileViT注意力可视化

项目链接 https://github.com/lucidrains/vit-pytorch 注意一下参数设置&#xff1a; Parameters image_size: int. Image size. If you have rectangular images, make sure your image size is the maximum of the width and heightpatch_size: int. Number of patches. im…

git:详解git rebase命令

背景 今天无意中打开 git 官网&#xff0c;发现 git 命令还是很多的&#xff0c;然而我们常用的就那几个&#xff0c;今天来学习一个也不怎么常用的命令 rebase 官网链接 都说学一个东西最好的方式就是读他的 官方文档&#xff0c;这里我读了一遍&#xff0c;把一些核心的地…

读书思考:步步惊心的《技术陷阱》

《技术陷阱》这本书450页&#xff0c;43万字之巨&#xff0c;信息量密密麻麻&#xff0c;采集的资料极其丰富&#xff0c;复习了一遍大停滞、大分流、大平衡、大逆转时代&#xff0c;并展望未来。看完了有很多想法&#xff0c;随手写了下来&#xff0c;希望不是蹭热点。&#x…

vue 最详细教学篇(一)

文章目录前言前景Vue 的长期技术支持 (LTS)、终止支持 (EOL) 及其延长版服务学习vue 要掌握那些技能-为什么学习 vue走进vueHello World 起手提示&#xff1a;示例&#xff1a;示例解析编辑器 VSCodevsCode 插件正式使用 vue.js要使用 vue 就绕不开生命周期 下面是生命周期图&a…

全国青少年编程等级考试scratch一级真题2022年9月(含题库答题软件账号)

青少年编程等级考试scratch真题答题考试系统请点击电子学会-全国青少年编程等级考试真题Scratch一级&#xff08;2019年3月&#xff09;在线答题_程序猿下山的博客-CSDN博客_小航答题助手1点击绿旗&#xff0c;下列哪个选项可以实现播放马叫声并在声音全部播放完后&#xff0c;…

Java常见数据结构的排序与遍历(包括数组,List,Map)

数组遍历与排序 数组定义 //定义 int a[] new int[5]int[] a new int[5];//带初始值定义 int b[] {1,2,3,4,5};赋值 //定义时赋值 int b[] {1,2,3,4,5};//引用赋值 a[6] 1 a[9] 9 //未赋值为空取值 //通过下表取值&#xff0c;从0开始 b[1] 1 b[2] 2遍历 Test p…

C语言操作符详解 一针见血!

目录算数操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符逗号表达式下标引用、函数调用和结构成员表达式求值11.1 隐式类型转换算数操作符&#x1f4ad; 注意/ 除法 --得到的是商% 取模&#xff08;取余&#xff09;--得到的是余数如果除法操作符…

CentOS 根路径下各个目录的作用及介绍

前言 很多小伙伴刚刚开始接触Linux系统时肯定和我一样&#xff0c;都很懵&#xff0c;黑黢黢的界面&#xff0c;一个个目录&#xff0c;没有图形化界面&#xff0c;看着难受&#xff0c;多接触了一些后会好受一些&#xff0c;不过&#xff0c;对各个目录的了解肯定也很基础&am…

若依框架---PageHelper分页(十)

在前几天的文章中&#xff0c;我们介绍了PageHelper的分页方法&#xff0c;研读代码定位到了ExecutorUtil.pageQuery(...)方法&#xff0c;并阅读到了其中的部分代码。 今天我们将看到重要的SQL修改代码。 getPageSql 我们接着看代码&#xff1a; if (!dialect.beforePage(…

2023爬虫学习笔记 -- 批量爬取图片

一、目标网址http://img.itlun.cn/uploads/allimg/180703/1-1PF3160531-lp.jpg二、右击图片获取图片地址http://img.itlun.cn/uploads/allimg/180703/1-1PF3160531-lp.jpg三、以二进制形式返回响应数据响应requests.get(网页,headers头) 响应内容响应.content四、存储二进制数据…

SpringBoot整合Mybatis的核心原理

0. 前言&#xff1a;1. 自动配置类MybatisAutoConfiguration&#xff1a;1.1. SqlSessionFactory的生成&#xff1a;1.2. Mapper的扫描和代理生成&#xff1a;1.2.1. MapperScannerConfigurer1.2.2. MapperFactoryBean1.2.3. getMapper生成代理对象2. 小结&#xff1a;0. 前言&…

Vue2仿网易云风格音乐播放器(附源码)

Vue2仿网易云风格音乐播放器1、整体效果2、使用技术3、实现内容4、源码5、使用图片1、整体效果 2、使用技术 使用了HTML5 CSS3进行页面布局及美化使用Vue2进行数据渲染与页面交互使用Axios发送http请求获取数据 3、实现内容 实现了搜索歌曲功能&#xff0c;输入歌手或歌曲关…

如果企业遭受到攻击应该进行怎样的处理

声明 本文是学习2018勒索病毒白皮书政企篇. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 政企遭遇勒索攻击分析 由于感染政企客户更有可能获得赎金&#xff0c;再加上勒索病毒本身也以服务器定向攻击为主&#xff0c;所以&#xff0c;2018年政企客…

构建工具tsup入门第三部分

&#x1f384;Hi~ 大家好&#xff0c;我是小鑫同学&#xff0c;一位长期从事前端开发的编程爱好者&#xff0c;我将使用更为实用的案例输出更多的编程知识&#xff0c;同时我信奉分享是成长的唯一捷径&#xff0c;在这里也希望我的每一篇文章都能成为你技术落地的参考~ 目录&am…

“慌不择路”周鸿祎,昔日大炮忙跟风【短评】

文|智能相对论作者| 凯文2月7日下午360经历两次急速拉升后涨停了&#xff0c;作为一个被套牢的股民&#xff0c;我是羡慕的&#xff0c;但理智告诉我&#xff0c;360的后续难以为继。360涨停的原因很简单&#xff0c;只因其在投资者互动平台上对类ChatGPT技术的布局做出了回应&…

安装Sentinel控制台与初始化演示工程

目录 一、Sentinel 二、安装Sentinel控制台 &#xff08;一&#xff09;sentinel组件由2部分构成 &#xff08;二&#xff09;安装步骤 三、初始化演示工程 四、流控模式 &#xff08;一&#xff09;快速失败 &#xff08;二&#xff09;关联资源 &#xff08;三&…

第四章——随机变量的数字特征

文章目录1、数字特征的定义2、数学期望&#xff08;均值&#xff09;2.1、数学期望的定义及性质2.1.1、定义2.1.2、性质2.2、数学期望相关例题2.3、Yg(X)的数学期望2.4、Zg(X,Y)的数学期望2.5、随机变量函数的数学期望例题3、方差3.1、方差的定义与性质3.2、相关例题3.3、切比雪…

3.2 埃尔米特转置

定义 对于复矩阵&#xff0c;转置又不一样&#xff0c;常见的操作是共轭转置&#xff0c;也叫埃尔米特转置Hermitian transpose。埃尔米特转置就是对矩阵先共轭&#xff0c;再转置&#xff0c;一般来说用三种符号表示埃尔米特转置&#xff1a; 第一种符号是AHA^HAH&#xff0c…