1、关于学习本书之前是否需要Java基础
问题:看安卓开发教程书需要很扎实的java基础吗? 回答:本书的零基础指的是安卓零基础,不是Java零基础,所以看本书之前需要一定的Java基础,基本的变量声明、控制语句、类和对象这三块是必需的;另外最好还掌握字符串模板、容器、接口这三块;如果能了解静态、异常、反射这三种概念对看懂代码很有帮助。 学会以上九项Java基础技术再看本书就会比较轻松了。其它的Java高级技术在本书里面用到的时候会另外介绍,比如: 文件IO,参见本书第4章的“4.3.2 文本文件读写”和“4.3.3 图片文件读写”; 任务,参见本书第6章的“6.2.1 任务Runnable”; 加密算法,参见本书第8章的“8.2.3 数据加密”; 线程,参见本书第10章的“10.1.1 消息传递Message”; HTTP调用,参见本书第10章的“10.2.3 HTTP接口调用”; 文件上传,参见本书第10章的“10.3.3 文件上传”; Socket,参见本书第10章的“10.4.2 Socket通信”; 线程池,参见本书第16章的“16.3 线程池管理”;
2、学习本书之前是否需要了解Java的高级特性与XML用法
问题:如果自己要进行布局,从布局文件text入手轻松还是直接画框框轻松?或者说对于一个新手该怎么正确地利用这本书,虽然我有java的基础但是我还是不太懂。像泛型、进程之类的我都不太懂。然后我需不需要把xml学一遍? 回答:自己布局通过xml布局文件会快些,因为AS支持预览xml布局的界面效果。 不需要太多关注java的高级特性,泛型只在“10.1.3 异步任务AsyncTask”有用到,多进程则很少用、本书也没介绍。 XML需要简单学一下,也不用学很深,简单就够用了。
3、关于本书附录源码的注释文字
问题:我在百度网盘下载了源码,代码里的注释很少,我零基础都看不懂怎么办? 回答:本书源码已经在补充全面注释了,补充注释了的部分章节已经上传到github,有需要的朋友可在github下载最新的全面注释源码。github的访问地址为:https://github.com/aqi00/android2 打开github页面后,单击网页右边的绿色按钮“Clone or download”,即可自动打包下载源码。
4、关于第2章的跑马灯文字滚动逻辑
问题:为什么跑马灯不是点一次停,再点一次动;而是点一次停,需要点两次才动? 回答:跑马灯滚动的时候,点击一下,此时onClick进入下面分支:
代码语言:javascript复制 tv_marquee.setFocusable(false);
tv_marquee.setFocusableInTouchMode(false);
该分支取消文本视图的焦点,所以停止滚动了(只有在获得焦点的时候才能滚动)。 然后再点击一下,此时onClick进入下面分支:
代码语言:javascript复制 tv_marquee.setFocusable(true);
tv_marquee.setFocusableInTouchMode(true);
注意该分支仅仅是允许文本视图获得焦点,此时文本视图相当于准备就绪,但尚未获得焦点。 然后点击第二下,因为上一步的点击使得文本视图允许获得焦点,于是第二下点击之后文本视图马上获得焦点,此时跑马灯开始滚动。 因此demo里面的跑马灯效果,实际运行结果就是点一下暂停,再点两下才继续滚动。如果想要只点一下就恢复滚动的话,可以在允许获得焦点之后调用requestFocus方法,示例代码如下:
代码语言:javascript复制 tv_marquee.setFocusable(true);
tv_marquee.setFocusableInTouchMode(true);
tv_marquee.requestFocus(); //强制获得焦点,让跑马灯滚起来
5、关于第2章的九宫格图片(点九图片)的查看与编辑
问题:为啥我这个SDK里面的tools目录下没有draw9patch.bat,这是怎么回事? 回答:最新的android studio已经集成了draw9patch.bat的功能,所以sdk就去掉了该文件。 在android studio中选中drawable目录下的图片,然后右击在右键菜单中选择下面的“Create 9-Patch files”,在弹出的对话框中点击“OK”按钮。接着drawable目录就会出现一个名为“***.9.png”的图片文件,双击该文件,就可以在右侧窗口中编辑点九图片了。
6、关于第4章和第5章的购物车商品图片在部分手机上无法显示的问题
问题:为什么第四章的购物车显示不了商品图片? 回答:这是Android7.0默认不分配sd卡存储权限导致的。即使你在设置中开启存储权限,重启app也看不到购物车商品图片,这是因为代码有判断SharedPreferences保存的first数值,如果不是首次运行则不进行图片加载操作。 该问题的解决办法是修改storage模块中ShoppingCartActivity.java的downloadGoods方法,把下面这行代码:
代码语言:javascript复制 String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) "/";
改为下面这段代码:
代码语言:javascript复制 String path = "";
//Android7.0之后默认关闭App的SD卡权限,所以对于7.0以上系统把存储路径改为App安装路径的data目录下
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) "/";
} else {
path = MainApplication.getInstance().getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString() "/";
}
然后在手机上卸载并重装storage。
7、关于本书源码对Android7.0的兼容情况说明
问题:用Android7.0导入demo会不会有新的问题呀? 回答:Android7.0目前发现主要有三个地方影响到本书源码,介绍如下: 1)部分手机上无法正常显示购物车图片,这是Android7.0默认不分配sd卡存储权限导致的。解决办法参见上一点的说明“关于第4章和第5章的购物车商品图片在部分手机上无法显示的问题”。 2)Android7.0能拍照但不能保存,这是因为Android7.0默认禁止访问sd卡导致的。代码的修改办法同上一小点。 3)部分手机使用DownloadManager下载图片会闪退。这是因为Android7.0之后增强了文件访问权限,DownloadManager.COLUMN_LOCAL_FILENAME被废弃,如果在7.0及以上手机访问该字段会触发异常java.lang.SecurityException。解决办法:是改成使用Uri方式访问文件,即把COLUMN_LOCAL_FILENAME改为COLUMN_LOCAL_URI,具体到代码里则是将下面这行代码
代码语言:javascript复制 int nameIdx = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME);
改为下面这行代码:
代码语言:javascript复制 int nameIdx = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI);
注意network模块的DownloadImageActivity.java和ChatMainActivity.java里的相关代码都要修改。 4)Android7.0以上手机无法正常进行AES加解密,原因是Android7.0开始去掉了Crypto provider,需要开发者自己定义一个如下的CryptoProvider类:
代码语言:javascript复制 public static final class CryptoProvider extends Provider {
public CryptoProvider() {
super("Crypto", 1.0, "HARMONY (SHA1 digest; SecureRandom; SHA1withDSA signature)");
put("SecureRandom.SHA1PRNG",
"org.apache.harmony.security.provider.crypto.SHA1PRNG_SecureRandomImpl");
put("SecureRandom.SHA1PRNG ImplementedIn", "Software");
}
}
然后AES加解密获取随机种子的代码修改为下面这样:
代码语言:javascript复制 SecureRandom sr;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
sr = SecureRandom.getInstance("SHA1PRNG", new CryptoProvider());
} else {
sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
}
5)Android7.0以上的TextureView无法在布局文件中使用background属性,否则会报错“TextureView doesn't support displaying a background drawable”。 原因是7.0之后TextureView的setBackgroundDrawable方法已经废弃,,所以7.0之后不能直接设置TextureView的背景了。
8、关于第8章导出APK安装包的V1和V2选项
问题:把app工程导出为apk文件,最后一个窗口出现了V1和V2两个选项,我看书上没有这两个选项,它们有什么区别?如果只勾选V1的话,能上架到商店吗?
回答:打包时出现选项V1和V2,这是Android Studio2.3之后新增的功能,本书基于Android Studio2.2,当时还没有V1和V2。
其中V1是必须勾选的,否则打出来的apk文件无法正常安装。V2建议也勾选,该选项可避免Janus漏洞。 如果想成功上架,就要同时勾选V1和V2。因为现在很多应用商店为了规避Janus漏洞,都要求开发者必须勾选V2选项。
9、关于第10章的socket服务端代码的启动方式
问题:Socket服务器端我将TestServer运行到Tomcat上面,这个没运行成功还需要什么配置吗? 回答:TestServer.java不是以web方式启动的,要按下面步骤启动:右击TestServer.java,依次选择右键菜单“Run As”——“Java Application”。 另外注意仿QQ聊天的Socket服务程序ChatServer.java,也要按照上述步骤启动。
10、关于第10章仿QQ聊天的服务端代码的处理逻辑
问题:network_server的压缩包里面有好几个网络通信服务端的源码,可以简单的把这几个文件的配合情况,说一遍吗?虽然有这些文件,但是不知道怎样配合,形成手机端、服务器,并且相互通讯。 回答:服务端的Socket工程有四个代码:ChatServer.java、DateUtil.java、ServerThread.java、SocketBean.java DateUtil.java是个日期工具类,SocketBean.java是个消息实体类,这两个很简单。 主要是ChatServer.java和ServerThread.java,其中ChatServer.java是主程序入口,入口是main函数,ServerThread.java是服务端的线程管理。 ChatServer启动后,会持续侦听端口52000,一旦有客户端连接进来,则启动一个ServerThread线程为该客户端服务,另外给它分配一个socket并加入队列。如果有两部手机连接进来,就启动两个服务端线程,socket队列大小为2。 ServerThread.java启动后运行run函数,从客户端接收消息,收到回车符就认为本次消息接收完毕,然后开始解析该消息的内容,包括包头和包体。从包头中判断消息类型与设备编号,从包体中读取具体的数据,处理完成后返回。如果客户端的动作是SENDMSG,则还要根据otherId到socket队列中寻找指定设备编号对应的socket,然后把消息内容推给该socket指向的客户端。
11、关于第15章百度地图如何进入LBS服务页面
问题:百度开发者平台上按照书上步骤,为啥没有LSB服务啊?
回答:百度开发者平台改版了,原有方式进不了地图服务。 需要直接访问百度地图开放平台http://lbsyun.baidu.com/,然后单击页面右上角的“API控制台”链接,或者直接访问网址http://lbsyun.baidu.com/apiconsole/key 在打开的应用列表页面创建地图应用。