精华内容
下载资源
问答
  • Android Studio实战 快速、高效地构建Android应用

    千次下载 热门讨论 2016-09-06 11:01:24
    《Android Studio实战 快速、高效地构建Android应用 全面涵盖关于Android Studio及其庞大工具生态系统的内容,包括Git和Gradle:除了介绍Android Studio与Git(用于源代码管理)和Gradle(一款构建及测试工具)的无缝...
  • c#开发Android应用实战

    千次下载 热门讨论 2012-12-25 17:29:29
    《C#开发Android应用实战——使用Mono for Android和.NET/C# 全面透彻地讲解Android应用编程知识,分析如何结合使用C#和Mono来编写在Android设备系列上运行的应用程序。在这本由多位专家联袂撰写的必备精品书籍的...
  • 本书中按照Android5.0新改版的API进行创作,既包括大型商务软件、3D游戏以及2D游戏,也详细讲解了软件、游戏开发时的思路,真实项目的策划方案等。本书能够快速帮助读者提高在Android平台下进行实际项目和游戏开发的...
  • C#开发Android应用实战 使用Mono for Android和.NET C# PDF扫描版,希望对你有用处。 一般下载的都7.07MB的,那个只是一个样章,这个是书的全部。
  • Android应用程序输入事件处理机制

    千次下载 热门讨论 2013-10-23 09:42:00
    Android应用程序中,有一类特殊的消息,是专门负责与用户进行交互的,它们就是触摸屏和键盘等输入事件。触摸屏和键盘事件是统一由系统输入管理器InputManager进行分发的。也就是说,InputManager负责从硬件接收...
  • 7个代表性的Android应用程序完整源代码

    万次下载 热门讨论 2011-06-14 15:04:30
    7个比较具有代表性的Android应用程序源代码!
  • android应用开发范例精解

    热门讨论 2012-05-12 13:09:34
    Android应用开发范例精解》通过通俗易懂的开发实例及项目案例,详细介绍了Android应用开发的知识体系及实用开发技术。 《Android应用开发范例精解》共14章,分为3篇。第1篇为基础篇,涵盖Android背景及开发环境和...
  • C#开发Android应用实战.pdf ,百度云下载链接,上次传失败了,这次补上,本书是 C#开发Android应用实战 整本扫描版
  • Android应用开发全程实录 图书简介: 《Android应用开发全程实录》内容上覆盖了用Android开发需要的大部分知识储备。开发者通过本书的学习轻松开发出企业级的Android应用。  《Android应用开发全程实录》以Android...
  • Android应用监听自身卸载

    热门讨论 2015-01-08 17:27:26
    详情请参考我的博客:http://blog.csdn.net/allen315410/article/details/42521251
  • Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...
  • Android应用密码的Demo

    热门讨论 2014-03-27 01:10:29
    android的一个小demo,实现功能是访问应用时需要输入密码,并且每次锁屏之后再访问需要重新输入密码。
  • Android应用自动更新代码实现

    千次下载 热门讨论 2012-04-27 21:37:34
    Android应用自动更新代码实现,完美实现代码的自动更新。
  • 7个经典Android应用程序实例源代码

    千次下载 热门讨论 2014-01-15 14:40:16
    7个经典Android应用程序实例源代码 CityWeather FileManager MobileMap MusicPlayer MyContacts RingProfile TodayDate
  • 使用android:process和Process.killProcess和UncaughtExceptionHandler完成Android应用程序不异常退出
  • Android应用案例开发大全 吴亚峰等 PDF扫描版

    千次下载 热门讨论 2014-09-26 12:28:12
    Android应用案例开发大全》是以Android手机综合应用程序开发为主题 通过11个典型范例全面且深度地讲解了单机应用 网络应用 商业案例 2D和3D游戏等多个开发领域 全书共分12章 主要以范例集的方式来讲述Android的...
  • Android应用开发实战.pdf

    千次下载 热门讨论 2012-12-18 15:25:17
    Android应用开发实战》是一本实践与理论紧密结合的Android应用开发参考书。实践部分以一个完整的大型案例(功能完善的微博客户端)贯穿始终,以迭代的方式详细演示和讲解了该案例的开发全过程,旨在帮助读者迅速...
  • Android应用程序消息处理机制

    千次下载 热门讨论 2013-10-23 01:22:30
    Android应用程序与传统的PC应用程序一样,都是消息驱动的。也就是说,在Android应用程序主线程中,所有函数都是在一个消息循环中执行的。Android应用程序其它线程,也可以像主线程一样,拥有消息循环。Android应用...
  • 首先,在Android应用程序层面,详细讲解了应用程序开发的各项技术,着重讲解了应用程序的开发基础、应用程序的结构、4大组件工作原理与功能,以及它们之间通信的基础Intent类。此外,给出了一些实例让读者能够更深刻...
  • Android应用图标微技巧,8.0系统中应用图标的适配

    万次阅读 多人点赞 2018-03-13 07:56:38
    大家好,2018年的第一篇文章到的稍微有点迟,也是因为在上一个Glide系列...三星今年推出的最新旗舰机Galaxy S9已经搭载了Android 8.0系统,紧接着小米、华为、OV等国产手机厂商即将推出的新年旗舰机也会搭载Android 8.0

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/79417483

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每个工作日都有文章更新。

    大家好,2018年的第一篇文章到的稍微有点迟,也是因为在上一个Glide系列结束之后一直还没想到什么好的新题材。

    现在已经进入了2018年,Android 8.0系统也逐渐开始普及起来了。三星今年推出的最新旗舰机Galaxy S9已经搭载了Android 8.0系统,紧接着小米、华为、OV等国产手机厂商即将推出的新年旗舰机也会搭载Android 8.0系统。因此,现在已经是时候需要让我们的应用程序对Android 8.0系统进行适配了。

    其实在去年Android 8.0系统刚推出的时候,我就仔细翻阅过Google官方的功能变更文档。变更项着实不少,但是真正需要我们去进行功能适配的地方却并不多。总结了一下,最主要需要进行适配的地方有两处:应用图标和通知栏。那么我们就分为上下两篇来分别对这两处功能适配进行讲解,先从应用图标开始。

    为什么要进行应用图标适配?

    可能有些朋友觉得困惑,应用图标这种东西从Android远古时代就已经有了,而且功能格外的简单,就是放张图片而已,这有什么好适配的呢?但实际上,在当前Android环境下,应用图标功能是极其混乱的。

    如果说要讲一讲手机应用图标的历史,其实要从苹果开始讲起。在上世纪80年代,苹果还在设计Lisa和Macintosh电脑的时候,乔布斯就是个圆角矩形的狂热支持者。当时苹果的工程师写出了一套绝妙的算法,可以在电脑上绘制出圆和椭圆,所有观看者都被震惊了,除了乔布斯,因为乔布斯觉得圆和椭圆虽然也不错,但是如果能绘制出带圆角的矩形就更好了。当时那位工程师觉得这是不可能实现的,而且也完全用不着圆角矩形,能满足基本的绘图需求就可以了。乔布斯愤怒地拉着他走了3条街,指出大街上各种应用圆角矩形的例子,最后那位工程师第二天就做出了绘制圆角矩形的功能。

    因此,在2007年一代iPhone诞生的时候,所有应用程序的图标都毫不出乎意料地使用了圆角矩形图标,即使是第三方应用也被强制要求使用圆角矩形图标,并且这一规则一直延续到了今天的iOS 11当中,如下图所示:

    相反,Android系统在设计的时候就不喜欢苹果这样的封闭与强制,而是选择了自由与开放,对应用图标的形状不做任何强制要求,开发者们可以自由进行选择:

    可以看到,在Android上,应用图标可以是方形、圆形、圆角矩形、或者是其他任意不规则图形。

    本来就是两家公司不同的设计理念,也说不上孰高孰低。但由于Android操作系统是开源的,国内一些手机厂商在定制操作系统的时候就把这一特性给改了。比如小米手机,就选择了向苹果靠拢,强制要求应用图标圆角化。如果某些应用的图标不是圆角矩形的呢?小米系统会自动给它加上一个圆角的效果,如下图所示:

    小米的这种做法看上去是向苹果学习,但实际上是相当恶心的。因为谁都可以看出来,这种自动添加的圆角矩形非常丑,因此很多公司就索性直接将应用的图标都设计成圆角矩形的,正好Android和iOS都用同一套图标还省事了。

    但是这就让Google不开心了,这不是变向强制要求开发者必须将图标设计成圆角矩形吗?于是在去年的Google I/O大会上,Google点名批评了小米的这种做法,说其违反了Android自由和开放的理念。

    除了变向强制要求应用图标圆角化,小米的这种处理方式还有一个弊端,就是如果应用图标的圆角弧度和小米系统要求的不同,那么会出现异常丑陋的效果:

    看到这样的应用图标,真的是一脸尴尬症都要犯了。就因为这两款应用图标的圆角弧度设计得大于了小米系统要求的圆角弧度,就被自动添加上了这样丑陋的白边。

    问题是已经存在了,那么应该怎么解决呢?说实话,这确实是一个长期以来都让人头疼的问题,Google多年来对此也是睁一只眼闭一只眼。终于在Android 8.0系统中,Google下定决心要好好整治一下Android应用图标的规范性了,今天我们就来学习一下。

    8.0系统的应用图标适配

    这个问题对于Google来说还是挺难解决的。因为Google一直在强调自由与开放,那么小米强制要求所有应用图标都必须圆角化也是人家的自由呀,你不准人家这么干是不是本身就违背了自由和开放的理念呢?当然我们在这里讨论这个,有点像讨论先有鸡还是先有蛋的感觉,不过Google还是想出了一套完美的解决方案。

    从Android 8.0系统开始,应用程序的图标被分为了两层:前景层和背景层。也就是说,我们在设计应用图标的时候,需要将前景和背景部分分离,前景用来展示应用图标的Logo,背景用来衬托应用图标的Logo。需要注意的是,背景层在设计的时候只允许定义颜色和纹理,但是不能定义形状。

    那么应用图标的形状由谁来定义呢?Google将这个权利就交给手机厂商了。不是有些手机厂商喜欢学习苹果的圆角图标吗?没问题,由于应用图标的设计分为了两层,手机厂商只需要在这两层之上再盖上一层mask,这个mask可以是圆角矩形、圆形或者是方形等等,视具体手机厂商而定,就可以瞬间让手机上的所有应用图标都变成相同的规范。原理示意图如下:

    可以看到,这里背景层是一张蓝色的网格图,前景层是一张Android机器人Logo图,然后盖上一层圆形的mask,最终就裁剪出了一张圆形的应用图标。

    我一定要适配吗?

    有些朋友可能会觉得这种分成两层的应用图标设计太过于麻烦,不适配可以吗?也有些朋友可能会说,自己的APP并没有做过应用图标适配,在Android 8.0手机上也照样跑得好好的。

    事实上,这个新功能Google是准备让它慢慢过渡的,而不是一次性就强推给所有的开发者。如果你的APP中的targetSdkVersion是低于26的,那么就可以不用进行应用图标适配,Android 8.0系统仍然是向下兼容的。但是如果你将targetSdkVersion指定到了26或者更高,那么Android系统就会认为你的APP已经做好了8.0系统的适配工作,当然包括了应用图标的适配。

    如果你将targetSdkVersion指定到了26,但是却没有进行Android 8.0系统的应用图标适配,那么会出现什么样的效果呢?这里我举几个反面示例:

    这是Google Pixel手机上的截图,操作系统是Android 8.0。可以看到,这两个应用的图标都非常奇怪,本来设计的都是一个圆角矩形的图标,但是却又在外面套上了一个白色的圆圈。为什么会出现这种情况呢?就是因为这两个应用都将targetSdkVersion指定到了26以上,但是却又没有做8.0系统的应用图标适配,而Pixel手机设定的mask是圆形的,所以就自动在应用图标的外层套了一个白色的圆圈。

    由此可以看出,爱奇艺和饿了么这两款应用都是没有在Pixel上进行兼容性测试的。不过考虑到它们都是只在国内市场提供服务,因此也情有可原。

    当然了,国内的Android 8.0手机很快也要开始普及了,我相信没有任何人会希望自己的APP也出现上述的效果,因此下面我们就来开始具体学习,如何进行8.0系统的应用图标适配。

    新建一个项目

    如果有人问我8.0系统应用图标适配到底难不难?这里我会回答,一点都不难。相信所有看完这篇文章的人立马就能学会,但前提是你需要有一个好的工具——Android Studio 3.0或更高版本。

    很高兴告诉大家,Android Studio 3.0中已经内置了8.0系统应用图标适配的功能,如果你已经安装了Android Studio 3.0的话,那么恭喜你,你已经成功了百分之九十了。如果你还在用老版的Android Studio,那么赶快去升级一下,然后再接着看这篇文章。

    好的,那么现在我们就用Android Studio 3.0来新建一个项目,就叫它IconTest吧。

    创建好项目之后,打开app/build.gradle文件检查一下,确保targetSdkVersion已经指定到了26或者更高,如下所示:

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 26
        defaultConfig {
            applicationId "com.example.icontest"
            minSdkVersion 15
            targetSdkVersion 26
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
    }

    可以看到,这里我在创建新项目的时候默认targetSdkVersion就是26,如果你是低于26的话,说明你的Android SDK有些老了,最好还是更新一下。当然如果你懒得更新也没关系,手动把它改成26就可以了。

    接下来打开AndroidManifest.xml文件,代码如下所示:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.icontest">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>

    这里我们需要关注的点是android:icon这个属性,通过这个属性,我们将应用的图标指定为了mipmap目录下的ic_launcher文件。另外大家可能注意到还有一个android:roundIcon属性,这是一个只适用在Android 7.1系统上的过渡版本,很快就被8.0系统的应用图标适配所替代了,我们不用去管它。

    刚才说了,应用图标被指定为了mipmap目录下的ic_launcher文件,那么我们快去看下这个文件吧:

    这里虽然目录很多,但是相信任何只要是入了门的Android开发者都能看得懂。唯一需要我们留意的就是mipmap-anydpi-v26这个目录,这个目录表示什么意思呢?就是Android 8.0或以上系统的手机,都会使用这个目录下的ic_launcher来作为图标。

    你会发现,mipmap-anydpi-v26目录下的ic_launcher并不是一张图片,而是一个XML文件,我们打开这个文件看一下,代码如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
        <background android:drawable="@drawable/ic_launcher_background" />
        <foreground android:drawable="@drawable/ic_launcher_foreground" />
    </adaptive-icon>

    这是一个8.0系统应用图标适配的标准写法,在<adaptive-icon>标签中定义一个<background>标签用于指定图标的背景层,定义一个<foreground>标签用于指定图标的前景层。

    那么我们分别来看一下背景层和前景层分别都是些什么内容吧,首先打开ic_launcher_background文件,内容如下图所示:

    这是一个使用SVG格式绘制出来的带纹理的底图。当然如果你看不懂这里面的代码也没有关系,因为我也看不懂。SVG格式的图片都是使用AI、PS等图像编辑软件制作之后导出的,基本没有人可以手工编写SVG图片。

    当然,背景层并不是一定要用SVG格式的图片,你也可以使用普通的PNG、JPG等格式的图片,甚至是直接指定一个背景色都可以。

    看完了背景层接着我们来看前景层,打开ic_launcher_foreground文件,内容如下所示:

    类似地,这里也是使用SVG格式绘制出了一个Android机器人的Logo,并且这个机器人还是带投影效果的。当然了,前景层我们也是可以使用PNG、JPG等格式的图片的,待会儿会进行演示。

    好的,现在已经把应用图标相关部分的代码都解释完了,那么这样一个刚刚创建完成的空项目运行起来到底会是什么样的效果呢?我们跑一下看看就知道了,如下图所示:

    可以看到,这就是一个前景层盖在背景层上,然后再被圆形mask进行裁剪之后的效果。

    好的,那么现在剩下的问题就是,我们如何才能对自己的应用图标在Android 8.0系统上进行适配?

    开始适配

    看到爱奇艺的8.0系统应用图标适配工作做得这么差,我就准备拿爱奇艺来做为例子了,我们一起来帮爱奇艺的Android版做个漂亮的应用图标适配吧。

    那么很显然,根据8.0系统的应用图标设计,我们需要准备一个前景层和一个背景层才行。

    前景层也就是爱奇艺的Logo了,这里我通过Photoshop把爱奇艺的Logo图取了出来。

    由于这是一张背景透明的图片,如果直接贴到文章里面就一片白色,啥也看不见了,于是我只好在文章里贴了一张带灰色背景的图片。如果大家需要获取爱奇艺这张前景图的原图,可以点击 这里 获取。

    解决了前景层,接下来我们来看背景层。其实背景层比前景层就简单多了,一般如果没有什么特殊需求的话,背景层直接使用某种纯色就可以了。

    这里我用Photoshop吸取了一下爱奇艺原始应用图标的背景色,值是#04ca00。当然,爱奇艺的背景色并不是完全的纯色,而是有细微的颜色渐变的。不过这里我们只是举例讲解而已,就不追究这些细节了。

    那么现在前景层和背景层都准备好了,接下来我们正式开始进行8.0系统的应用图标适配。重新回到IconTest项目当中,然后按下Windows:Ctrl+Shift+A / Mac:command+shft+A 快捷键,并输入Image Asset,如下所示:

    点击回车键打开Asset Studio编辑器,在这里就可以进行应用图标适配了。

    这个Asset Studio编辑器非常简单好用,一学就会。左边是操作区域,右边是预览区域。

    先来看操作区域,第一行的Icon Type保持默认就可以了,表示同时创建兼容8.0系统以及老版本系统的应用图标。第二行的Name用于指定应用图标的名称,这里也保持默认即可。接下来的三个页签,Foreground Layer用于编辑前景层,Background Layer用于编辑背景层,Legacy用于编辑老版本系统的图标。

    再来看预览区域,这个就十分简单了,用于预览应用图标的最终效果。在预览区域中给出了可能生成的图标形状,包括圆形、圆角矩形、方形等等。注意每个预览图标中都有一个圆圈,这个圆圈叫作安全区域,必须要保证图标的前景层完全处于安全区域当中才行,否则可能会出现图标被手机厂商的mask裁剪掉的情况。

    为了让大家能够更加直观地看到操作,这里我使用一张GIF图来演示操作的过程:

    最终,Android Studio会自动帮我们生成适配8.0系统的应用图标,以及适配老版本系统的应用图标,我们甚至一行代码都不用写,一切工作就已经完成了。感兴趣的朋友可以自己到mipmap目录下面去观察一下Android Studio帮我们生成了哪些东西,这里就不带着大家一一去看了。

    最后,让我们来运行一下程序,并且和正版爱奇艺的应用图标放在一起对比一下吧:

    可以看到,做过8.0系统应用图标适配之后,效果明显要好看太多了,也希望爱奇艺的官方APP也能早日完成适配吧。

    好了,今天这篇文章就到这里,相信大家都已经轻松掌握了Android 8.0系统的应用图标适配,下篇文章会讲解Android 8.0系统的通知栏适配,感兴趣的朋友请继续阅读 Android通知栏微技巧,8.0系统中通知栏的适配

    关注我的技术公众号,每天都有优质技术文章推送。关注我的娱乐公众号,工作、学习累了的时候放松一下自己。

    微信扫一扫下方二维码即可关注:

            

    展开全文
  • Android应用开发揭秘》源码

    千次下载 热门讨论 2012-02-24 23:18:30
     杨丰盛,Android应用开发先驱,对Android有深入研究,实战经验极其丰富。精通Java、C、C++等语言,专注于移动通信软件开发,在机顶盒软件开发和MTK平台软件开发方面有非常深厚的积累。2007年获得中国软件行业协会...
  • Android应用开发详解pdf

    热门讨论 2011-08-30 14:31:41
    Android应用开发详解是一本Android应用开发书籍,既适合Android初学者,也适合具备了一定Android开发经验但需要开发案例的高级读者。 该书分为三个部分,共18章,由浅入深地详细介绍了Android的每个开发细节。 该书...
  • Android | Android应用架构之MVVM模式

    万次阅读 多人点赞 2018-05-08 23:53:26
    早期的Android应用开发中,Activity/Fragment承担了过多的职责,它们不仅负责了应用界面的显示,而且负责了业务逻辑的处理。这样一来,Activity/Fragment很容易就变得臃肿、复杂,造成应用难以测试、维护和扩展。...

    前言

    早期的Android应用开发中,Activity/Fragment承担了过多的职责,它们不仅负责了应用界面的显示,而且负责了业务逻辑的处理。这样一来,Activity/Fragment很容易就变得臃肿、复杂,造成应用难以测试、维护和扩展。随着Android应用开发技术的不断发展和成熟,Android应用架构的设计得到了越来越多开发人员的关注和重视。目前,Android的应用架构主要有MVC、MVP和MVVM模式,本文将介绍一下MVVM模式。

    相关知识

    学习项目

    MVP模式

    MVVM模式可以说是MVP模式的进一步发展,所以先来了解一下MVP模式。

    MVP (Model-View-Presenter) 模式的结构如下图所示:

    MVP模式.png

    MVP模式将应用分为三层:Model层主要负责数据的提供,View层主要负责界面的显示,Presenter层主要负责业务逻辑的处理。

    在MVP模式中,Model层和View层不能直接通信,Presenter层负责充当中间人,实现Model层和View层之间的间接通信。View层和Presenter层互相持有对方的引用,实现View层和Presenter层之间的通信。

    MVP模式的主要优点是:分离了Model层和View层,分离了视图操作和业务逻辑,降低了耦合。

    MVVM模式

    MVVM (Model-View-ViewModel) 模式的结构如下图所示:

    MVVM模式.png

    MVVM模式与MVP模式一样,也将应用分为三层,并且各个对应的层的职责相似:

    • Model层,主要负责数据的提供。Model层提供业务逻辑的数据结构(比如,实体类),提供数据的获取(比如,从本地数据库或者远程网络获取数据),提供数据的存储。
    • View层,主要负责界面的显示。View层不涉及任何的业务逻辑处理,它持有ViewModel层的引用,当需要进行业务逻辑处理时通知ViewModel层。
    • ViewModel层,主要负责业务逻辑的处理。ViewModel层不涉及任何的视图操作。通过官方提供的Data Binding库,View层和ViewModel层中的数据可以实现绑定,ViewModel层中数据的变化可以自动通知View层进行更新,因此ViewModel层不需要持有View层的引用。ViewModel层可以看作是View层的数据模型和Presenter层的结合。

    MVVM模式与MVP模式最大的区别在于:ViewModel层不持有View层的引用。这样进一步降低了耦合,View层代码的改变不会影响到ViewModel层。

    MVVM模式相对于MVP模式主要有如下优点:

    • 进一步降低了耦合。ViewModel层不持有View层的引用,当View层发生改变时,只要View层绑定的数据不变,那么ViewModel层就不需要改变。而在MVP模式下,当View层发生改变时,操作视图的接口就要进行相应的改变,那么Presenter层就需要修改了。
    • 不用再编写很多样板代码。通过官方的Data Binding库,UI和数据之间可以实现绑定,不用再编写大量的findViewById()和操作视图的代码了。总之,Activity/Fragment的代码可以做到相当简洁。

    例子

    下面举一个简单的例子来实践MVVM模式。完整的项目代码可以去GitHub上查看:

    https://github.com/chongyucaiyan/MVVMDemo

    例子实现的主要功能是:点击按钮网络查询天气,查询成功后在界面上显示天气信息。主界面如下图所示:

    MVVMDemo界面.png

    MVVM模式的代码组织结构建议按照 业务功能 进行划分,具体操作是:每个业务功能独立一个包存放,每个业务功能包下面再按Model、View、ViewModel分包存放。所有的Model存放在model包下面,所有的Activity和Fragment存放在activity包下面,所有的ViewModel存放在viewmodel包下面。该例子比较简单,只有一个weather业务功能模块,最终的代码组织结构如下图所示:

    MVVMDemo代码组织结构.png

    编写Model

    查询杭州天气的URL为:

    http://www.weather.com.cn/data/cityinfo/101210101.html

    访问该URL将返回一串JSON字符串,如下所示:

    {"weatherinfo":{"city":"杭州","cityid":"101210101","temp1":"5℃","temp2":"20℃","weather":"晴转多云","img1":"n0.gif","img2":"d1.gif","ptime":"18:00"}}
    

    按照此JSON字符串,可以编写相应的实体类。WeatherData类的代码如下所示:

    public class WeatherData {
    
        private WeatherInfo weatherinfo;
    
        public WeatherInfo getWeatherinfo() {
            return weatherinfo;
        }
    
        public void setWeatherinfo(WeatherInfo weatherinfo) {
            this.weatherinfo = weatherinfo;
        }
    }
    

    WeatherInfo类的代码如下所示:

    public class WeatherInfo {
    
        private String city;
    
        private String cityid;
    
        private String temp1;
    
        private String temp2;
    
        private String weather;
    
        private String img1;
    
        private String img2;
    
        private String ptime;
    
        public String getCity() {
            return city;
        }
    
        public void setCity(String city) {
            this.city = city;
        }
    
        public String getCityid() {
            return cityid;
        }
    
        public void setCityid(String cityid) {
            this.cityid = cityid;
        }
    
        public String getTemp1() {
            return temp1;
        }
    
        public void setTemp1(String temp1) {
            this.temp1 = temp1;
        }
    
        public String getTemp2() {
            return temp2;
        }
    
        public void setTemp2(String temp2) {
            this.temp2 = temp2;
        }
    
        public String getWeather() {
            return weather;
        }
    
        public void setWeather(String weather) {
            this.weather = weather;
        }
    
        public String getImg1() {
            return img1;
        }
    
        public void setImg1(String img1) {
            this.img1 = img1;
        }
    
        public String getImg2() {
            return img2;
        }
    
        public void setImg2(String img2) {
            this.img2 = img2;
        }
    
        public String getPtime() {
            return ptime;
        }
    
        public void setPtime(String ptime) {
            this.ptime = ptime;
        }
    }
    

    编写ViewModel

    ViewModel不涉及任何的视图操作,只进行业务逻辑的处理。通过官方提供的Data Binding库,当ViewModel中的数据发生变化时,UI将自动更新。QueryWeatherViewModel的代码如下所示:

    public class QueryWeatherViewModel {
    
        private static final String TAG = "QueryWeatherViewModel";
    
        public final ObservableBoolean loading = new ObservableBoolean(false);
    
        public final ObservableBoolean loadingSuccess = new ObservableBoolean(false);
    
        public final ObservableBoolean loadingFailure = new ObservableBoolean(false);
    
        public final ObservableField<String> city = new ObservableField<>();
    
        public final ObservableField<String> cityId = new ObservableField<>();
    
        public final ObservableField<String> temp1 = new ObservableField<>();
    
        public final ObservableField<String> temp2 = new ObservableField<>();
    
        public final ObservableField<String> weather = new ObservableField<>();
    
        public final ObservableField<String> time = new ObservableField<>();
    
        private Call<WeatherData> mCall;
    
        public QueryWeatherViewModel() {
    
        }
    
        public void queryWeather() {
            loading.set(true);
            loadingSuccess.set(false);
            loadingFailure.set(false);
    
            mCall = RetrofitManager.get()
                    .create(QueryWeatherRequest.class)
                    .queryWeather();
            mCall.enqueue(new Callback<WeatherData>() {
    
                @Override
                public void onResponse(Call<WeatherData> call, Response<WeatherData> response) {
                    WeatherInfo weatherInfo = response.body().getWeatherinfo();
                    city.set(weatherInfo.getCity());
                    cityId.set(weatherInfo.getCityid());
                    temp1.set(weatherInfo.getTemp1());
                    temp2.set(weatherInfo.getTemp2());
                    weather.set(weatherInfo.getWeather());
                    time.set(weatherInfo.getPtime());
    
                    loading.set(false);
                    loadingSuccess.set(true);
                }
    
                @Override
                public void onFailure(Call<WeatherData> call, Throwable t) {
                    if (call.isCanceled()) {
                        Log.i(TAG, "call is canceled.");
                    } else {
                        loading.set(false);
                        loadingFailure.set(true);
                    }
                }
            });
        }
    
        public void cancelRequest() {
            if (mCall != null) {
                mCall.cancel();
            }
        }
    }
    

    编写View

    View不涉及任何的业务逻辑处理,只进行界面的显示。在xml布局文件中,通过官方提供的Data Binding库,将UI与ViewModel中的数据进行绑定,当ViewModel中的数据发生变化时,UI将自动更新。xml布局文件的代码如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
    
        <data>
    
            <import type="android.view.View" />
    
            <variable
                name="viewModel"
                type="com.github.cyc.mvvmdemo.weather.viewmodel.QueryWeatherViewModel" />
        </data>
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="@dimen/default_content_padding"
            tools:context="com.github.cyc.mvvmdemo.weather.activity.QueryWeatherActivity">
    
            <Button
                android:id="@+id/btn_query_weather"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:text="@string/query_weather"
                android:enabled="@{viewModel.loading ? false : true}"
                android:onClick="@{() -> viewModel.queryWeather()}" />
    
            <RelativeLayout
                android:id="@+id/vg_weather_info"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@id/btn_query_weather"
                android:layout_marginTop="@dimen/query_weather_margin"
                android:visibility="@{viewModel.loadingSuccess ? View.VISIBLE : View.GONE}">
    
                <TextView
                    android:id="@+id/tv_city"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:textStyle="bold"
                    android:text="@string/city" />
    
                <TextView
                    android:id="@+id/tv_city_value"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_toRightOf="@id/tv_city"
                    android:layout_alignBottom="@id/tv_city"
                    android:text="@{viewModel.city}"
                    tools:text="杭州" />
    
                <TextView
                    android:id="@+id/tv_city_id"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@id/tv_city"
                    android:layout_marginTop="@dimen/query_weather_margin"
                    android:textStyle="bold"
                    android:text="@string/city_id" />
    
                <TextView
                    android:id="@+id/tv_city_id_value"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_toRightOf="@id/tv_city_id"
                    android:layout_alignBottom="@id/tv_city_id"
                    android:text="@{viewModel.cityId}"
                    tools:text="101210101" />
    
                <TextView
                    android:id="@+id/tv_temp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@id/tv_city_id"
                    android:layout_marginTop="@dimen/query_weather_margin"
                    android:textStyle="bold"
                    android:text="@string/temperature" />
    
                <TextView
                    android:id="@+id/tv_temp1_value"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_toRightOf="@id/tv_temp"
                    android:layout_alignBottom="@id/tv_temp"
                    android:text="@{viewModel.temp1}"
                    tools:text="5℃" />
    
                <TextView
                    android:id="@+id/tv_tilde"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_toRightOf="@id/tv_temp1_value"
                    android:layout_alignBottom="@id/tv_temp"
                    android:text="@string/tilde" />
    
                <TextView
                    android:id="@+id/tv_temp2_value"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_toRightOf="@id/tv_tilde"
                    android:layout_alignBottom="@id/tv_temp"
                    android:text="@{viewModel.temp2}"
                    tools:text="10℃" />
    
                <TextView
                    android:id="@+id/tv_weather"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@id/tv_temp"
                    android:layout_marginTop="@dimen/query_weather_margin"
                    android:textStyle="bold"
                    android:text="@string/weather" />
    
                <TextView
                    android:id="@+id/tv_weather_value"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_toRightOf="@id/tv_weather"
                    android:layout_alignBottom="@id/tv_weather"
                    android:text="@{viewModel.weather}"
                    tools:text="" />
    
                <TextView
                    android:id="@+id/tv_time"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_below="@id/tv_weather"
                    android:layout_marginTop="@dimen/query_weather_margin"
                    android:textStyle="bold"
                    android:text="@string/release_time" />
    
                <TextView
                    android:id="@+id/tv_time_value"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_toRightOf="@id/tv_time"
                    android:layout_alignBottom="@id/tv_time"
                    android:text="@{viewModel.time}"
                    tools:text="10:00" />
            </RelativeLayout>
    
            <ProgressBar
                android:id="@+id/pb_progress"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:visibility="@{viewModel.loading ? View.VISIBLE : View.GONE}" />
    
            <TextView
                android:id="@+id/tv_query_failure"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:text="@string/query_failure"
                android:visibility="@{viewModel.loadingFailure ? View.VISIBLE : View.GONE}" />
        </RelativeLayout>
    </layout>
    

    在Activity中,通过官方提供的Data Binding库加载布局文件,创建ViewModel,并绑定View和ViewModel。QueryWeatherActivity的代码如下所示:

    public class QueryWeatherActivity extends AppCompatActivity {
    
        // ViewModel
        private QueryWeatherViewModel mViewModel;
    
        // DataBinding
        private ActivityQueryWeatherBinding mDataBinding;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mDataBinding = DataBindingUtil.setContentView(this, R.layout.activity_query_weather);
            // 创建ViewModel
            mViewModel = new QueryWeatherViewModel();
            // 绑定View和ViewModel
            mDataBinding.setViewModel(mViewModel);
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            // 取消请求
            mViewModel.cancelRequest();
        }
    }
    

    总结

    MVVM模式将应用分为三层:Model层主要负责数据的提供,View层主要负责界面的显示,ViewModel层主要负责业务逻辑的处理。各个层职责单一,结构清晰,应用可以很方便地进行测试、维护和扩展。

    参考

    展开全文
  • Android应用签名读取工具下载

    热门讨论 2014-09-27 11:50:42
    1、将你开发的Android App安装到测试手机上;...3、打开此应用,输入你的App应用的包名(Activity.java的第一行,package后面的内容,例如:com.company.appname.app); 4、点击Get Signature按钮,即可获得app的签名。
  • 浅谈android应用之编程语言

    千次阅读 2019-10-23 16:08:58
    文章目录1. 前言2. 基础语言3. 混合开发相关语言4. 参考书籍5....1. 前言 android开发常用java,c,c++这三种。...android应用开发最常用的就是java语言了,说他为android的基础语言一点也不为过。那这...

    1. 前言

    更多内容请查看android生态之应用篇

    android开发常用java,c,c++这三种。但是不要说这三种语言,单单一个java要想写清楚,这点篇幅是肯定不够的。这边提出来就是为了让学习的人知道你学习android需要什么语言基础。

    2. 基础语言

    android应用开发最常用的就是java语言了,说他为android的基础语言一点也不为过。那这边说一下java学习的一些建议:

    1. 熟悉四大基本特性:继承,封装,多态,抽象
    2. 熟悉面向对象开发概念,万物皆对象,对象皆可盘
    3. 熟悉IO读写
    4. 熟悉数据库操作
    5. 熟悉网络开发
    6. 熟悉常用设计模式

    3. 混合开发相关语言

    android应用开发还有有可能接触到比较多的就是c/c++语言,以及h5+js脚本语言了。这边简单提一下:
    对于c/c++学习的一些建议:

    1. 熟悉指针,这个是最核心也是最重要的一个概念;
    2. 熟悉结构体
    3. 熟悉基本数据类型操作
    4. 熟悉面向过程开发,但需要注意的是c++是有类这个概念的,需作一定的区分
    5. c/c++语言在android应用通常作为jni技术供java侧进行调用

    对于h5+js学习的一些建议:

    1. 熟悉操作基本的函数
    2. 熟悉动态网页开发
    3. 熟悉各种样式的使用
    4. h5+js语言一般作为andorid应用开发的补充语言,提供跨平台实现

    4. 参考书籍

    java 语言参考书籍《java从入门到精通》
    c 语言参考书籍《c语言从入门到精通》,《c语言陷阱和缺陷》
    c++ 语言参考书籍《primer c++》
    h5 语言参考书籍《HTML5从入门到精通》
    js语言参考书籍《JavaScript从入门到精通》

    5. 建议

    时间充裕先从c语言开始学习,然后继续c++,再带java,h5+js可以最后学习。个人学习经验,仅供参考,无需复制!

    展开全文
  • Android应用程序开发(第三版)-课后习题解答

    万次阅读 多人点赞 2018-05-08 15:09:17
    第一章Android简介1.简述各种手机操作系统的特点....(1)Android是谷歌发布的基于Linux的开源手机平台,该平台由操作系统、中间件、用户界面和应用软件组成,是第一个可以完全定制、免费、开放的手机平台。Andr...

    第一章Android简介

    1.简述各种手机操作系统的特点.

    答案:目前,手机上的操作系统主要包括以下几种,分别是Android、iOS、WindowsMobile、WindowsPhone7、Symbian、黑莓、PalmOS和Linux。

    (1)Android是谷歌发布的基于Linux的开源手机平台,该平台由操作系统、中间件、用户界面和应用软件组成,是第一个可以完全定制、免费、开放的手机平台。Android底层使用开源的Linux操作系统,同时开放了应用程序开发工具,使所有程序开发人员都在统一、开放的开发平台上进行开发,保证了Android应用程序的可移植性。

    (2)iOS是由苹果公司为iPhone、iPodtouch、iPad以及AppleTV开发的操作系统,以开放源代码的操作系统Darwin为基础,提供了SDK,iOS操作系统具有多点触摸操作的特点,支持的控制方法包括滑动、轻按、挤压和旋转,允许系统界面根据屏幕的方向而改变方向,自带大量的应用程序。

    (3)WindowsMobile是微软推出的移动设备操作系统,对硬件配置要求较高,一般需要使用高主频的嵌入式处理器,从而产生了耗电量大、电池续航时间短和硬件成本高等缺点,WindowsMobile系列操作系统包括Smartphone、PocketPC和PortableMediaCenter。随着WindowsPhone7的出现,WindowsMobile正逐渐走出历史舞台。

    (4)WindowsPhone7具有独特的“方格子”用户界面,非常简洁,黑色背景下的亮蓝色方形图标,显得十分清晰醒目,集成了XboxLive游戏和Zune音乐功能,可见WindowsPhone7对游戏功能和社交功能的重视。

    (5)Symbian是为手机而设计的实时多任务32位操作系统,它的功效低,内存占用少,提供了开发使用的函数库、用户界面、通用工具和参考示例。操作系统不是完全开放的,核心代码不开放,但是API文档是公开的。

    (6)黑莓系统主要在黑莓手机上使用,其特色是支持电子邮件推送功能,邮件服务器主动将收到的邮件推送到用户的手持设备上,而不需要用户频繁地连接网络查看是否有新邮件。同时,黑莓系统提供手提电话、文字短信、互联网传真、网页浏览及其它无线信息服务功能。黑莓系统主要针对商务应用,具有很高的安全性和可靠性。

    (7)PalmOS由拥有较多的第三方软件,是32位的嵌入式操作系统,主要在移动终端上使用,操作系统本身所占的内存极小,不具备录音和MP3播放功能。

    (8)Linux手机操作系统具有开放源代码的特性,但是也包含入门难度高,集成开发环境差,Linux的产品与个人计算机的连接性较差,具有较强的开发实力的公司很少等不足。

     

    2.简述Android平台的特征

    答案:Android广泛支持GSM、3G和4G的语音与数据业务,支持接收语言呼叫和SMS短信,支持数据存储共享和IPC消息机制,为地理位置服务(如GPS)、谷歌地图服务提供易于使用的API函数库,提供组件复用和内置程序替换的应用程序框架,提供基于WebKit的浏览器,广泛支持各种流行的视频、音频和图像文件格式。Android系统提供了访问硬件的API库函数,用来简化像摄像头、GPS等硬件的访问过程。在内存和进程管理方面,Android为了保证高优先级进程运行和正在与用户交互进程的响应速度,允许停止或终止正在运行的低优先级进程,以释放被占用的系统资源。Android进程的优先级并不是固定的,而是根据进程是否在前台或是否与用户交互而不断变化的。在界面设计上,Android提供了丰富的界面控件供使用者调用,从而加快了用户界面的开发速度,也保证了Android平台上的程序界面的一致性。Android提供轻量级的进程间通讯机制Intent,使用跨进程组件通信和发送系统级广播成为可能。Android提供了Service作为无用户界面、长时间后台运行的组件,可为应用程序提供特定的后台功能,还可以实现事件处理或数据更新等功能。Android支持高效、快速的数据存储方式,同时为了便于跨进程共享数据,Android提供了通用的共享数据接口ContentProvider,可以无需了解数据源、路径的情况下,对共享数据进行查询、添加、删除和更新等操作。Android支持位置服务和地图应用,可以通过SDK提供的API直接获取当前的位置,追踪设备的移动路线,或设定敏感区域,并可以将Google地图嵌入到Android应用程序中,实现地理信息可视化开发。Android支持Widget插件,可以方便地在Android系统上开发桌面应用,实现比较常见的一些桌面小工具,或在主屏上显示重要的信息。Android支持使用本地代码(C或C++)开发应用程序的部分核心模块,提高了程序的运行效率,并有助于增加Android开发的灵活性。

     

    3.描述Android平台体系结构的层次划分,并说明各个层次的作用。

    答案:Android采用了软件堆层的架构,共分为四层:Linux内核、中间件层、应用程序框架层和应用程序层。

    (1)Linux内核提供由操作系统内核管理的底层基础功能。

    (2)中间件层包含函数库和Android运行时,函数库主要提供了六个基于C/C++的函数库,包括:SurfaceManager,支持显示子系统的访问,为多个应用程序提供2D、3D图像层的平滑连接;MediaFramework,基于OpenCORE的多媒体框架,实现音频、视频的播放和录制功能,广泛支持多种流行的音视频格式,包括MPEG4、H.264、MP3、AAC、AMR、JPG和PNG等;SQLite,轻量级的关系数据库引擎;OpenGLES,基于硬件的3D图像加速;FreeType,位图与矢量字体渲染;WebKit,Web浏览器引擎;SGL,2D图像引擎;SSL,数据加密与安全传输的函数库;libc,标准C运行库,是Linux系统中底层的应用程序开发接口。Android运行时包含核心库和Dalvik虚拟机,核心库为程序开发人员提供了Android系统的特有函数功能和Java语言基本函数功能,Dalvik虚拟机实现了基于Linux内核的线程管理和底层内存管理,也可以执行Dalvik可执行格式。

    (3)应用程序框架提供了Android平台基本的管理功能和组件重用机制。

    (4)应用程序提供了一系列核心应用程序。

     

    第二章Android开发环境

    3.在AndroidSDK中,Android模拟器、Android调试桥和DDMS是Android应用程序开发过程中经常使用到的工具,简述这三个工具的用途。

    答案:Android模拟器主要用来调试Android应用程序,模拟器可以仿真手机的绝大部分硬件和软件功能,支持加载SD卡映像文件,更改模拟网络状态、延迟和速度,模拟电话呼叫和接收短信等。Android调试桥是用于连接Android设备或模拟器的工具,负责将应用程序安装到模拟器和设备中,或从模拟器或设备中传输文件。DDMS是Android系统中内置了调试工具,可以用来监视Android系统中进程、堆栈信息,查看logcat日志,实现端口转发服务和屏幕截图功能,模拟电话呼叫和SMS短信,以及浏览Android模拟器文件系统等。

     

    第三章第一个Android程序

    1.简述R.java和AndroidManefiest.xml文件的用途。

    答案:R.java文件是ADT自动生成的文件,包含对drawable、layout和values目录内的资源的引用指针,Android程序能够直接通过R类引用目录中的资源。AndroidManifest.xml是XML格式的Android程序声明文件,包含了Android系统运行Android程序前所必须掌握的重要信息,这些信息包括应用程序名称、图标、包名称、模块组成、授权和SDK最低版本等,而且每个Android程序必须在根目录下包含一个AndroidManifest.xml文件。

     

    第四章Android生命周期

    1.简述Android系统前台进程、可见进程、服务进程、后台进程和空进程的优先级排序原因。

    答案:前台进程是Android系统中最重要的进程,是与用户正在交互的进程,所以被排放在首位;可见进程和服务进程都是包含服务的进程,不在前台与用户交互,不响应界面时间的进程,而是在后台长期运行,所以,他们被排放在前台进程之后;而后台进程和空进程是不包含任何已经启动服务的进程,在系统比较资源比较紧张的时候,会首先被清除,所以他们被排放在最后。

     

    2.简述Android系统的四种基本组件Activity、Service、BroadcaseReceiver和ContentProvider的用途。

    答案:Activity是Android程序的呈现层,显示可视化的用户界面,并接收与用户交互所产生的界面事件,用于提示用户程序已经正常启动。Service一般用于没有用户界面,但需要长时间在后台运行的应用。BroadcaseReceiver是用来接受并响应广播消息的组件。ContentProvider是Android系统提供的一种标准的共享数据的机制,应用程序可以通过ContentProvider访问其他应用程序的私有数据。

     

    3.简述Activity生命周期的四种状态,以及状态之间的变换关系。

    答案:Activity的四种状态,分别是活动状态、暂停状态、停止状态和非活动状态。活动状态是完全能被用户看到,与用户进行交互的状态;暂停状态是Activity不处于用户界面的最上层,不能与用户进行交互的状态;停止状态是指Activity在界面上完全不能被用户看到的状态;除以上三种状态之外,就是非活动状态。他们的变换关系是,当第一个Activity启动后,则Activity处于活动状态;如果启动新的Activity,部分遮挡先前的Activity,则先前的Activity转换为暂停状态;如果新启动的Activity完全遮挡了先前的Activity,则先前的Activity转换为停止状态;活动的Activity被用户关闭,或暂停状态或停止状态的Activity被系统终止后,都会转换成非活动状态。

     

    4.简述Activity事件回调函数的作用和调用顺序。

    答案:Activity事件回调函数具体分为Activity生命周期的事件回调函数和Activity状态保存和恢复函数的事件回调函数,Activity生命周期的事件回调函数的作用主要是为了让Activity程序了解自身状态的变化;Activity状态保存和恢复函数的事件回调函数的作用主要是保存或恢复Activity的状态信息。

    Activity事件的调用顺序是:

    (1)onCreate,完全生命周期开始,初始化Activity;

    (2)onStart,可视生命周期开始,对用户界面进行必要的更改;

    (3)onRestoreInstanceState,恢复onSaveLnstanceState保存的用户界面信息;

    (4)onResume,活动生命周期开始,保存界面信息;

    (5)onSaveInstanceState,在onResume后,保存界面信息;

    (6)onRestart,重新进入可视生命周期前,载入界面所需要的更改信息;

    (7)onPause,活动生命周期结束,保存持久地数据或释放占用的资源;

    (8)onStop,可视生命周期结束,保存持久地数据或释放占用的资源;

    (9)onDestory,完全生命周期结束,释放资源

     

    第五章Android用户界面

    1.简述6种界面布局的特点。

    答案:6种界面布局分别为:线性布局、框架布局、表格布局、相对布局、绝对布局和网格布局。

    (1)线性布局的子元素可垂直或者水平排列,但是每一列/行中,只能有一个界面元素。

    (2)框架布局是只存放一个元素的空白空间,且位置只能是空白空间的左上角,如果有多个子元素,后放置的子元素会遮挡先放置的子元素。

    (3)表格布局将屏幕划分网格,把界面元素添加到网格中,支持嵌套,也可添加其他的界面布局。

    (4)相对布局中的界面元素的位置是通过与其他的元素的相对位置确定的,具有灵活性。

    (5)绝对布局的界面元素的位置是通过坐标确定的,他是不推荐使用的一种布局。

    (6)网格布局将用户界面划分为网格,界面元素可随意摆放在这些网格中,界面元素可以占用多个网格的,使界面设计更为灵活。

     

    3.简述Android系统三种菜单的特点及其使用方式。

    答案:Android系统支持的三种菜单分别是:选项菜单、子菜单和快捷菜单。

    (1)选项菜单是常用的Android系统菜单,可分为图标菜单和扩展菜单,图标菜单的子项最多是六个,支持显示图标,不支持单选框和复选框;而当子项多余六个时,采用扩展菜单,扩展菜单的子项是垂直排列,支持单选框和复选框,不支持显示图标。第一次启动选项菜单时,只需要调用一次onCreateMenu函数。

    (2)子菜单的表现形式是浮动窗体的形式,适应小屏幕的显示形式,能够展示更加详细的信息,通过addSubMenu函数增加子菜单,但不支持嵌套。在选项菜单和快捷菜单中使用子菜单,便于显示和分类相似的菜单子项。

    (3)快捷菜单采用动窗体的显示形式,启动方式特别,点击界面元素超过2秒后,则启动该界面元素的快捷菜单。每次启动快捷菜单时,都要调用一次onCreateMenu函数。

     

    4.说明使用操作栏为程序开发所带来的便利。

    答案:操作栏代替了传统的标题栏功能,右侧用来显示“选项菜单”的菜单项,但所显示的内容,会根据操作栏所具有的空间不同而具有不同的现实方式。在屏幕尺寸较小的设备上,操作栏会自动隐藏菜单项的文字,而仅显示菜单项的图标;而在屏幕尺寸较大的设备上,操作栏会同时显示菜单项的文字和图标。操作栏提供多个实用的功能,包括(1)将“选项菜单”的菜单项显示在操作栏的右侧;(2)基于Fragment实现类似于Tab页的导航切换功能;(3)为导航提供可“拖拽—放置”的下拉列表;(4)可在操作栏上实现类似于“搜索框”的功能。

     

    第六章组件通信与广播消息

    1.简述Intent的定义和用途。

    答案:Intent是一个动作的完整描述,包含了动作的产生组件、接收组件和传递的数据信息。Intent为Activity、Service和BroadcastReceiver等组件提供交互能力,将一个组件的数据和动作传递给另一个组件。Intent的一个最常见的用途就是启动Activity和Service;另一个用途是在Android系统上发布广播消息,广播消息可以是接收到特定数据或消息,也可以是手机的信号变化或电池的电量过低等信息。

     

    2.简述Intent过滤器的定义和功能。

    答案:Intent过滤器是一种根据Intent中的动作(Action)、类别(Categorie)和数据(Data)等内容,对适合接收该Intent的组件进行匹配和筛选的机制。Intent过滤器的作用是匹配数据类型、路径和协议,还包括可以用来确定多个匹配项顺序的优先级。每个Intent过滤器可以定义多个<category>标签,程序开发人员可以使用自定义的类别,或使用Android系统提供的类别。

     

    3.简述Intent解析的匹配规则。

    答案:Intent解析的匹配规则是:

    (1)Android系统把所有应用程序包中的Intent过滤器集合在一起,形成一个完整的Intent过滤器列表;

    (2)在Intent与Intent过滤器进行匹配时,Android系统会将列表中所有Intent过滤器的“动作”和“类别”与Intent进行匹配,没有指定“动作”的Intent过滤器可以匹配任何的Intent,但是没有指定“类别”的Intent过滤器只能匹配没有“类别”的Intent;

    (3)把Intent数据Uri的每个子部与Intent过滤器的<data>标签中的属性进行匹配;

    (4)如果Intent过滤器的匹配结果多于一个,则可以根据在<intent-filter>标签中定义的优先级标签来对Intent过滤器进行排序,优先级最高的Intent过滤器将被选择。以上每步中不匹配的都将被过滤掉。

     

    第七章后台服务

    1.简述Service的基本原理和用途。

    答案:Service能够长期在后台运行,适用于无需用户干预,且规则或长期运行的后台功能。首先,因为Service没有用户界面,更加有利于降低系统资源的消耗,而且Service比Activity具有更高的优先级,因此在系统资源紧张时,Service不会被Android系统优先终止。即使Service被系统终止,在系统资源恢复后Service也将自动恢复运行状态,因此可以认为Service是在系统中永久运行的组件。Service除了可以实现后台服务功能,还可以用于进程间通信(InterProcessCommunication,IPC),解决不同Android应用程序进程之间的调用和通讯问题。

     

    第八章数据存储与访问

    3.简述在嵌入式系统中使用SQLite数据库的优势。

    答案:SQLite数据库的优势是其嵌入到使用它的应用程序中。这样不仅提高了运行效率,而且屏蔽了数据库使用和管理的复杂性,程序仅需要进行最基本的数据操作,其他操作可以交给进程内部的数据库引擎完成。

    展开全文
  • Android应用市场和应用包名大全

    千次阅读 2019-11-28 19:51:23
    应用商店 应用包名 华为应用商店 com.huawei.appmarket VIVO应用商店 com.bbk.appstore ...OPPO应用商店 ...小米应用商店 ...魅族应用市场 ...腾讯应用宝 com.tencent.android.qqdownloader 360...
  • android studio如何设置android应用图标

    万次阅读 2018-05-30 10:51:01
    1、android studio file--&gt;new--&gt;image asset2、Icon Type 保持默认,Name自定义或保持默认,Foreground Layer 编辑前景层,Background Layer编辑背景层,Legacy编辑老版本系统图标。3、Resize调节...
  • Android应用程序UI架构 高清PTT

    千次下载 热门讨论 2013-10-23 01:23:45
    Android应用程序中,每一个Activity组件都关联有一个或者若干个窗口,每一个窗口都对应有一个Surface。有了这个Surface之后,应用程序就可以在上面渲染窗口的UI。最终这些已经绘制好了的Surface都会被统一提交给...
  • Android应用程序进程启动过程(前篇)

    万次阅读 多人点赞 2017-03-20 11:06:05
    在此前我讲过Android系统的启动流程,系统启动后,我们就比较关心应用程序是如何启动的,这一篇我们来一起学习Android7.0 应用程序进程启动过程,需要注意的是“应用程序进程启动过程”,而不是应用程序启动过程。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 913,171
精华内容 365,268
关键字:

android应用