标签: Android开发

什么是主流的开发安卓APP的方式?

IDE
曾经的主流,Eclipse+Genymotion

1. 安装Genymotion

默认的虚拟机启动及其困难,也较为卡顿,这时候我们需要一个替代的虚拟机Genymotion了

当然前提是你要有个账号。

下载安装过程就不细说了,选择教育|学习|个人使用版本就行了。

安装完毕后,打开,用账户登陆(没有就去注册),下载自己想要的虚拟机版本,设置分辨路和内存。


2. Genymotion和Eclipse链接

至于链接就需要装个插件了,和安装ADTPlugin一样,
01

接着输入插件地址:http://plugins.genymotion.com/eclipse

02

然后等待以下,把下面选项 Group items by category 选项勾弄掉,接着就出现插件包了,选上就Next,同意,无乱什么都选择Yes,等待下载安装直到完成。

下载安装完成重启Eclipse后会发现多了个这个图标
04

点击以下,会弹出警告,让你设置Genymotion和安装目录,设置你刚才安装的Genymotion的目录,接着确定就行了。

剩下的就一样的了,点击上面那个图标打开虚拟机,然后选择启动虚拟机。

在运行项目之前,先设置以下运行配置
05

选择如下
06


现在的主流,AndroidStudio+Genymotion

1. 安装Android Studio

AndroidStudio的下载地址在下面 ↓ (不要怀疑(→_→),下面那个就是是谷歌官网下载地址)

https://dl.google.com/dl/android/studio/install/2.2.0.12/android-studio-bundle-145.3276617-windows.exe

安装过程同样不在多说,一直下一步到完成就行了。

特别注意!
安装路径不要出现任何中文!!!
不要出现任何中文!!!
不要出现任何中文!!!

2. Android Studio和Genymotion链接

Genymotion安装上面已讲,Android Studio链接Genymotino同样是安装插件,很简单,打开设置
07

在Plugins选项中输入genymotion,搜索到后点击旁边的install,因为我安装了所以显示“Uninstall”
08

如果搜不到就点击下面搜索进行安装
09

一直同意,Next,等待安装完毕后重启。

重启后出现下面的图标。
10

点击打开,会弹出错误,说没设置Genymotion目录,和上面一样,到设置里设置。
11

后面就一样的了,点击小图标来选择启动虚拟机,接着运行项目。

Android应用的几种开发方式

1、前言
自苹果 iOS 和谷歌 Android 操作系统发布以来,在互联网界就多了一个新名词:App(意为运行在智能移动终端上的第三方应用程序)。

*初的 App 有两种形式:一种是基于本地(操作系统)运行的 App,称之为原生App,或者Native App;一种是基于浏览器运行的 Web App,同样是安装在手机上。因为本地 App 位于平台层上方,向下访问和兼容的能力比较好一些,可以支持在线或离线,消息推送或本地资源访问,摄像、拨号功能的调取。但是由于设备碎片化,本地 App 的开发成本很高,维持多个版本的更新升级也很麻烦。

随着 HTML5 的出现,基于 HTML5 低成本跨平台开发优势又兼具本地 App 特质的混合模式移动应用( Hybrid App) 迅速兴起。它大幅降低了 App 的开发成本,可以通过现有应用商店模式发行,在用户桌面形成独立入口等等。 Hybrid App 已成为开发 App 不错的选择,是未来移动应用开发的趋势。

2、原生App的开发方法
以开发工具的不同来分类,原生 App 的开发方式有两种:Eclipse + ADT 和 Android Studio。

Eclipse + ADT
Eclipse + ADT 的开发方式是曾经Android开发者*好的选择,也是谷歌官方所支持的。但是2013的Google I/O 大会上,Google官方曝光一款新的开发工具 Android Studio,并在2014年底正式推出自家的IDE Android Studio1.0,2016年11月2日,Google Android Developer 官博发文,宣告停止对 Eclipse ADT 的支持。

由于现在市场上的书籍和视频教程,包括很多项目和源码*大多数都是基于 Eclipse + ADT 的,所以了解这种开发方式对于初学者是很必要的,便于更快的入门和转入 Android Studio的使用。(当然,有自信和自学能力强的人可以直接使用 Android Studio)

Eclipse + ADT 开发环境的搭建
Eclipse 是一个免费的、开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境,通过安装插件,可以用它开发 C/C++,Java,Python,Perl,Ruby,Android,PHP等。

Eclipse 的官方下载地址:http://www.eclipse.org/downloads/,其他下载站点百度一下即可。

Eclipse是免安装的,下载下来的一般是个压缩包,但是有Windows,Linux,Mac操作系统和32bit和64bit之分,根据自己的电脑选择对应的下载即可。

我们都知道,原生 App 是基于 Java 开发的,因此,在开发 Java 程序之前,必须先完成一些准备工作,也就是在计算机上安装并配置 Java 开发环境,即安装和配置 JDK。

JDK 的全称是 Java SE Development Kit,即Java 标准版开发包,是 Sun 公司提供的一套用于开发 Java 应用程序的开发包,它提供了编译、运行Java程序所需的各种工具和资源,包括 Java编译器、Java运行时环境,以及常用的Java类库。
官方下载 JDK 的地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html,类似于Eclipse,需要根据自己电脑的操作系统和位数选择对应的 JDK。

%title插图%num

安装时需要选择 JDK 的安装路径,系统默认会安装在 C:\Program Files\Java 路径下,但是不推荐安装在有空格的路径下,这样可能导致一些未知的问题,建议直接安装在根路径下,例如 D:\Java\jdk1.8.0_112\。安装完成后,我们还要配置一下环境变量,此处只说明Windows操作系统下的配置过程:
点击左下角win窗口图标,右键点击计算机,或者直接右键桌面上的“计算机”图标,点击“属性”,进入了“控制面板\系统和安全\系统”窗口,单击该窗口左边栏的“高级系统设置”。

%title插图%num
在“高级”Tab页里,单击“环境变量”按钮,进入环境变量对话框。

%title插图%num
在下方的系统变量中,新建 变量名:JAVA_HOME,变量值:JDK安装路径,就是之前下载 JDK 后的安装路径,比如 D:\Java\jdk1.8.0_112。

%title插图%num
找到变量 Path,点击编辑,在*后添加 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;注意里面的每项都是用英文的分号;来隔开的,这个电脑已经有了,只是编辑,添加,不是新建。然后新建 变量名:CLASSPATH,变量值为 .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;。(注意*前面有个.;)

%title插图%num
这样 JDK 的环境变量就配置完成,打开Windows操作系统的命令行窗口(在“开始”菜单里运行cmd命令即可),在命令行中分别输入 java 和 javac 命令,如果得到的是 java 或 javac 的用法帮助信息,那么说明我们的环境变量配置成功了。
%title插图%num

完成以上步骤,我们就可以开发J2SE的程序了,但是这里我们是要开发 Android App,所以我们还要安装 Android 在 Eclipse 上的插件 ADT ,它的全称是 Android Developer Tools Plug-in。现在,谷歌的官网上已经没有 ADT 的下载链接了,它会提示你用 Android Studio ,并将之前的项目迁移到 Android Studio 上,因此推荐大家采用离线安装的方式。
这里贴出一个国内的下载链接,里面提供了Android开发的所有工具下载。http://tools.android-studio.org/index.php。Eclipse离线安装 ADT 插件的方法可以参考如下百度经验:ADT离线安装教程。

Android SDK 的下载配置
SDK:(software development kit)软件开发工具包。被软件开发工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。因此,Android SDK 指的是Android专属的软件开发工具包。
它的官方下载地址是:https://developer.android.com/studio/index.html。但是,由于国内GFW的原因,外国的网站基本访问不了,我们只能在国内其他网站下载,这些资源还是非常容易找到的(由于在线下载的不稳定和不确定性,这里只说明离线下载配置的方法)。上面的链接已经有SDK的下载地址了,这里再贴两个另外的链接:http://www.cnblogs.com/bjzhanghao/archive/2012/11/14/android-platform-sdk-download-mirror.html,http://www.androiddevtools.cn/。每个版本都有两种类型的SDK,分别是exe和zip格式的(这里指Windows操作系统),即可执行安装程序的和免安装压缩包。SDK的安装或解压路径*好也是根路径,反正不要带有中文(安装国外的软件都要注意这点,这是个好的习惯,虽然不一定是强制性的)。
这里需要注意的是,无论通过哪种方式,下载的SDK都只是个工具而已,打开SDK的文件夹,里面的内容大致是这样的。(可能有细微区别)
%title插图%num
这里可以看到一个可执行程序SDK Manager,顾名思义,它就是 SDK 的管理工具,双击它,会出现如下窗口。
%title插图%num
Android操作系统的所有版本都在这里,需要哪个就下载哪个,然后点击右下角的install * packages,出现下面的窗口,点击要下载的package,选择accept,*后选择install即可安装。
%title插图%num

这里值得一提的是,这种下载速度基本是龟速(如果不*的话),所以,强烈建议大家学会科学上网,哪怕花钱也好,试想,一个Android开发人员连Android官网都上不去的话,那是多么可怕的一件事!
这里,贴上一篇解决这个问题的文章(我没有试过,我一直在墙外),http://blog.csdn.net/freedom2028/article/details/6261810。
安装完成之后,为了在命令行窗口可以使用 Android SDK 的各种工具,建议将 Android SDK 目录下的 tools 子目录、 platform-tools 子目录添加到系统的PATH环境变量中。
*后,值得一提的是,如果你觉得上面的步骤太复杂,你也可以下载多合一下载包ADT Bundle,里面包含了:sdk + 特定版本platform + eclipse + adt + 兼容包,解压缩即可使用。

*个Hello World项目
双击打开Eclipse,出现如下的窗口,即指定工作空间的路径。自己建个文件夹即可或者使用默认设置。
%title插图%num
打开后,点击File->New->Android Application Project,出现如下窗口。项目名称可以写为 HelloWorld,SDK根据自己下载的,选择要用的即可,theme选择none即可,然后一直点击next,直至finish即可,这样一个helloworld项目就建成了。
%title插图%num

Android虚拟设备神器Genymotion
Android应用程序可以在虚拟机和真机上运行,真机测试很容易,Android手机通过USB线接上电脑,打开USB调试,在Eclipse里右键点击项目HelloWorld->Run as->Android Application,在设备选项里选择你的手机即可。
这里主要说明 AVD(Android Virtual Device)的使用,以上环境都完成了,你会看到Eclipse的工具栏里会有一个Android的图标,Android Virtual Device Manager在SDK Manager的旁边。
%title插图%num
在这里,可以创建和管理Android 虚拟机,但是不用不知道,一用吓一跳,这里创建的Android 虚拟机启动慢的令人发指,少则十几分钟,多则无法估计(因为无法再等下去,直接停掉了),刚开始的时候我们会以为是自己电脑出了问题,其实不然,它本来就这么慢。
还好,我们有另一款使用非常容易也非常快的虚拟机Genymotion(一般启动在10s左右吧),它的官网是https://www.genymotion.com/,中文官网是http://www.genymotion.net/,它的使用教程可以参考百度经验http://jingyan.baidu.com/article/3ea51489e7d8bd52e61bba36.html。这里特别提醒一点,genymotion是基于Virtual box 运行的,如果安装之后,可以正常运行,就不要再更新了,它的更新提示直接忽略即可,不然可能导致无法使用了。
Eclipse还有个genymotion的插件,安装后可以在Eclipse中生成一个按钮,点击即可启动genymotion,上面图片上有,在SDK manager的左边(右边是AVD manager),因为可以先运行genymotion,之后运行Android程序,所以这里忽略。

运行HelloWorld
好了,所有工作都做完了,现在运行HelloWorld项目吧。
%title插图%num

到这里,我们的HelloWorld也运行出来了,可能你也发现了,我们一句代码也没有写,没错,按照以上步骤,默认建立出来的就是这样一个HelloWorld项目,它显示的内容就是Hello world!

Android Studio
前面也说到了,Android Studio是Google官方推出的IDE,官网上这么说的“Android Studio 提供用于为各类 Android 设备构建应用的*快速的工具,利用世界一流的代码编辑、调试、性能工具、一套灵活的构建系统以及一套即时构建/部署系统,您可以专注于构建独特的高品质应用。”总之,Android Studio是非常强,也非常大的Android开发利器,学习它需要一定的时间,另外,运行AS对电脑的配置要求比较高,官方推荐win7以上操作系统,8GB RAM,*低屏幕分辨率:1280 x 800,这意味着一般的电脑根本跑不动。(那些非常强大的IDE一般都很大,运行条件都很苛刻,其实也可以理解)。
AS的官方下载地址是https://developer.android.com/studio/index.html,其他的下载地址有:http://tools.android-studio.org/index.php,http://www.cnblogs.com/bjzhanghao/archive/2012/11/14/android-platform-sdk-download-mirror.html,http://tools.android-studio.org/index.php/sdk/等,百度一下,你就知道。
AS的使用教程如下:http://www.open-open.com/lib/view/open1433387390635.html。
AS的视频教程如下:http://www.jikexueyuan.com/course/2531_1.html?ss=1。

2、Web App
什么是Web App?维基百科的解释是这样的:In computing, a web application or web app is a client–server software application in which the client (or user interface) runs in a web browser. Common web applications include webmail, online retail sales, online auctions, wikis, instant messaging services and many other functions.理解一下是这样的:Web App就是运行于网络和标准浏览器上,基于网页技术开发实现特定功能的应用,可以理解为一个触屏版的网站。不同于原生App,Web App 不是基于操作系统运行的,而是运行在浏览器里的,它的宿主是浏览器,它所需的资源一般都在网络上,因此,它不需要下载安装,但是使用它必须要联网。这类应用我们常用的有百度新闻,163邮箱,淘宝触屏版等。
因此,Web App 就是网页的开发,主要利用前端知识,诸如HTML5,CSS,JavaScript等。
知乎上推荐的一些较好的 Web App: https://www.zhihu.com/question/19727553。

3、Hybrid App
那么什么是 Hybrid App 呢?从字面意思理解就是混合的应用。没错,它就是前面两者的混合应用。
Hybrid App(混合模式移动应用)是指介于web-app、native-app这两者之间的app,兼具“Native App良好用户交互体验的优势”和“Web App跨平台开发的优势”。
这三者涵盖了市场上所有的移动应用。它们的比较如下:
%title插图%num
网络上有很多关于这三者的分析理解,摘录如下:
https://www.zhihu.com/question/23622875
http://www.uisdc.com/web-hybrid-native-app
http://baike.baidu.com/link?url=FANt8_qieZwhFjBxYrZd03alBIOhqqK41XhyScMS4aDKISIx5-ZN0GYR9wfDiLTjwWfBaJeoWKnRV7zcKmBhnjiyyCyKpy_b4KYEAJKhaeG
http://www.zhongkerd.com/news/content-1198.html
这里是开源中国社区整理的非常全面的121款手机Web开发框架:
http://www.oschina.net/project/tag/322/mobile-web?lang=0&os=0&sort=view&p=1

4、有趣的 App Inventor
App Inventor的设计目的就是为了让毫无编程经验的人(比如儿童)可以开发有趣的手机应用。App Inventor 原是Google实验室(Google Lab)的一个子计划,由一群Google工程师和勇于挑战的Google使用者共同参与设计完成。
由于GFW的原因,国内访问不了App Inventor的官网,无法在线编程(之前国内还有站点可以访问,但是现在未找到),它的官网是:http://appinventor.mit.edu/explore/。值得庆幸的是,App Inventor提供离线开发的方式,它的离线安装包可以在这里下载(这是我的百度网盘,失效请告知我):http://pan.baidu.com/s/1sldCqoX。
AI2离线包的安装使用说明可以参考:http://www.arduino.cn/thread-12392-1-1.html。安装完成后,使用时打开离线环境,在浏览器中输入127.0.0.1:8888(localhost:8888)就回进入登录页面,如下图
%title插图%num

输入自己的账号,进入开发页面,如下图

%title插图%num

这样就可以开发自己的应用了。

Android自动化构建之Ant多渠道打包实践

前言
Ant是历史比较悠久的一个自动化构建工具,Android开发者可以通过它来实现自动化构建,也可以实现多渠道打包,关于apk打包的方式一般有Ant、Python、Gradle三种,这三种打包方式都各自有优点和缺点,本篇博文先给大家介绍如何使用Ant来实现自动构建和多渠道发布。

开发环境
Window7
Ant
jdk
android sdk
mac系统下所需要的运行环境也是类似的,我们都需要配置Ant、jdk、sdk的环境变量,我们可以看一下window下是环境变量配了些什么:
ANT_HOME : D:\android\apache-ant-1.9.4
JAVA_HOME : C:\Program Files\Java\jdk1.6.0_45
ANDROID_SDK_HOME : D:\android\adt-bundle-windows-x86_64-20140321\sdk
PATH: %JAVA_HOME%/bin;%ANDROID_SDK_HOME%\platform-tools;%ANDROID_SDK_HOME%\tools;%ANT_HOME%\bin;
CLASSPATH : .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\tools.jar

以上环境变量配好之后,你才可以进入下一步,不会配?回家吧,开发不适合你。

先说APK构建过程
下面来简单描述下apk构建的过程:
1. 使用aapt生成R.java类文件
2. 使用android SDK提供的aidl.exe把.aidl转成Java文件
3. 使用javac命令编译.java类文件生成class文件
4. 使用android SDK提供的dx.bat命令行脚本生成classes.dex文件
5. 使用android SDK提供的aapt.exe生成资源包文件
6. 使用apkBuilder.bat生成未签名的apk安装文件
7. 使用jdk的jarsigner对未签名的包进行apk签名
8. 使用Zipalign工具对apk进行优化

我们从上面的描述可以知道apk具体的步骤和使用到的工具,对应的工具在sdk中都可以找到,自己去翻翻吧,但你会发现新的sdk版本,aapt被放到了build-tools目录下,apkBuilder.bat文件在tools目录找不到了,你可以去网上去下一个,然后放到tools目录下。为了让大家更清楚apk构建的过程,放上官方的一张图:

%title插图%num

有了这张图,相信大家已经清楚了apk到底是如何生成的吧,不多说了。

构建命令详解
aapt命令生成R.java文件
示例命令:

aapt package -m -J <R.java文件夹> -S <res路径> -I <android.jar路径> -M<AndroidManifest.xml路径>

命令解释:

-f 如果编译出来的文件已经存在,强制覆盖
-m 使生成的包的目录存放在-J参数指定的目录
-J 指定生成的R.java 的输出目录
-S res文件夹路径
-A assert文件夹路径
-I 某个版本平台的android.jar的路径
-F 具体指定APK文件的输出

aidl命令生成.aidl文件
示例命令:

aidl -p<framework.aidl路径> -I<src路径> -o<目标文件目录> .aidl文件

注意:命令和路径是没有空格的。

javac命令生成.class文件
示例命令:

javac -d destdir srcFile

参数解释:
-d 指定存放类的文件夹
-bootclasspath 覆盖引导类文件的位置
-encoding 指定源文件使用的编码
-sourcepath 指定查找输入源文件位置

dx命令生成classes.dex文件
示例命令:
dx –dex –output classes.dex bin/classes/ libs/

命令解释:将bin/classes下的class文件和libs下的jar文件编译成classes.dex文件

aapt生成资源包文件resources.ap_
命令示例:

aapt package -m -J <R.java文件夹> -S <res路径> -I <android.jar路径> -A <asset路径> -M<AndroidManifest.xml路径> -F <resources.ap_文件路径>

apkbuilder.bat已经过时了,使用以下方法
示例命令:

java -cp <sdklib.jar路径> com.android.sdklib.build.ApkBuilderMain <未签名.apk> -v -u -z bin\resources.ap_ -f bin\classes.dex -rf src

通过jarsigner来生成
示例命令:
jarsigner -verbose -keystore <keystore路径> -signedjar -<输出签名apk路径> <未签名apk路径> <keystore别名>

*后一步使用zipalign工具进行apk对齐优化
示例命令:

zipalign [-f] [-v] <alignment> infile.apk outfile.apk

上面的8个步骤就是实现apk构建的过程,都是通过命令来一步一步实现,要注意每一步生成的东西。

小结
本篇博文主要给大家介绍了Android中apk构建的过程,也详细的讲解了每一步具体的命令操作,由于不想一篇把所有东西堆在一起,我将会在下一篇来具体使用Ant脚本实现自动化构建和多渠道打包,大家可以继续关注。

 

快速学习android开发

因为项目需要,8月中旬开始决定做安卓的程序,所以马上就开始学习安卓方面的开发知识,把*近的学习实践经历和大家分享分享。不要一开始就下载一大堆资料,视频,然后就不知道做什么了,要给自己定个目标,我要做什么?我怎么达到目标?

我不懂java,但是懂C#和C++,所以我没主张去单独学习java语言,如果你是个**初的新手,没啥语言基础,那你必须先看看java语言,不要很详细看,因为学习Android中,你也是在学习java。

1. 明确目标

没有目标的学习,会感觉到后面没什么成果,在1年前,我也打算学习android开发的,但是目的就是学习,到网上去下载很多学习的视频,然后把开发环境搭建起来,能把Helloworld运行起来,能打些log,Activity之间也能互相切换了,但是后面也就不了了之了,因为不知道学了要干什么。依葫芦画瓢的做了几个例子,因为里面的问题都是已经解决的,所以也没能深入的系统学习。

这次因为产品的需要,要做Android版本,要做的东西一开始就已经设计好了,见摇摇2选1安卓版本,刚开始也不知道里面有些什么技术难度,但是要做的目标已经明确了,而且也没有现成的,碰到问题就查资料,慢慢地解决,这样有的放矢,学习的效果非常好。既有现成的技术可以使用,又有些技术,需要查比较多的资料,这样记忆就比较深刻,所掌握的知识也比较系统。

接下来的一系列文章,我会把在开发摇摇2选1中遇到的问题,给大家详细讲讲,程序虽然小,但是五脏俱全,做Demo和做产品的要求完全不是一个级别,如果Android大牛感觉知识讲的比较浅,那可以绕道,毕竟我是从一个完全的新手开始的。

 

2. 了解安卓开发中比较困难的地方

学习一个新平台,就要知道此平台开发要面临的困难有哪些,不要做到*后,这些问题没有考虑,那就比较糟糕了。在网上搜索了下,安卓开发困难总结如何:

1)安卓系统版本比较多,各版本之间的兼容性是个问题,此为系统碎片。

2)安卓设备千变万化,设备难以统一,每个产品都成为独立,分散的Android碎片。

3)分辨率五花八门。一个产品,可能需要多个界面排版,人工消耗比较大。

%title插图%num

看到这张图,有没有头疼的感觉?

总结成一句话:Android的碎片化真是要来开发者的命。

 

3. 搭建开发环境

“巧妇难为无米之炊”,开发环境肯定是*件要做的事情,这类的文章已经很多了,我也不多说了,多说也就比较无聊了。感谢吴秦,也是博客园里的一员,他写的很详细了,见这里。

 

4. 查看网友总结的一些经验。

不是什么都查看,开发中遇到什么问题,就去查看什么问题,这样你查到的知识,马上就能深入的实践,这样知识就巩固了。

1)首先当然要看Android的开发文档,里面其实大部分的知识都有了,还有就是SDK自带的Samples。

2)博客园里搜索“Android开发”,会出来一大把,很多网友都是很系统的讲解了。

3)eoe android社区,里面有很多网友上传了现成的demo代码,里面很多都是模仿现在流行的产品的界面开发,很是不错。

 

5. 掌握调试方法

个人一直认为,调试技巧是开发中*重要的技能,如果调试技能比较差,不知道如何查找问题,那不会是个好的程序员,其技能也不会高到哪里去。

 Android做下来,感觉调试这块做的很不错了,这要感谢Eclipse IDE做的比较不错,但是Android的界面排版部分,真的不敢恭维,Eclipse时间用长了,占用内存真是大。有哪位高手能否告诉我下,你们界面排版是用什么的?

Android里,如果程序出了问题,有些是一下跟踪不到的,这时就要用到Log类了,Log类使用很简单,就不多说了。
 自己一个很有感触的经验,如果你真的打算做Android开发,那就买一个设备,这样能大大提高开发效率,模拟器有时用起来真是麻烦,而且开发的设备不要很好的,只要设备分辨率是主流的,传感器的支持*好全点就够了,国产的手机里,华为的还不错,或者到淘宝上去买个二手的,投资不大。真的买了投资,可能也会增加你学习Android的决心。

 

6. 程序框架

经过10多年的经历,认识到程序的框架对开发产品真的是起到举足轻重的作用。一个好的产品,如果有个好的程序框架,那真是事半功倍,可能开始所做的工作会比较多,很难看到令人激动的成果,但是相信我,*对值得。一开始,我也是比较注重程序界面开发,很快就开发出界面来,而且着实比较激动,因为有东西出来了,但是后面的事情,真是令人发狂,想从头再来,太迟了,离计划的时间比较近了,时间不允许,只有硬着头皮往上打补丁,硬着交付*个版本,第二个版本或者后面的版本,迟早是要重来的。所以在后面带领团队开发的时候,在开发前,都是要讨论程序框架,留出很大部分时间进行程序框架开发,及在开发中不断的改进。

刚接触Android,不知道用什么程序框架,所以查了很多资料,一开始看到一个程序框架,感觉很不错,所以一开始就使用了下面这个程序框架。

%title插图%num

开始这个框架用的蛮爽,简单介绍一下,主UI线程如果要做一个比较长时间的任务,创建一个任务,发送到任务队列中去,后台的Service不断的从任务队列中去取任务,然后交给线程处理,线程处理完后,通过消息(Message)发送到Handler里处理,然后Handler的handleMessage函数里回调到UI主线程中去。

此框架的缺点是比较麻烦。

1)首先这里有个Observer模式,每个Activity都要实现一个接口,然后注册到后台服务中去,这样后台服务才能把处理的结果回调到主线程中。

2) 每个事件都要组成一个任务,发送到任务队列。

3)后台线程先要取任务,然后处理,然后通过消息切换到主线程,然后又回到到相应的Activity中,中间有个3次判断当前是什么任务。

4)不能并非,任务只能一个接一个,虽然这个一般不会造成瓶颈。

因为摇摇2选1应用比较简单,所以后来感觉只要使用线程和Handler,通过消息就能处理,然后就查资料,发现已经有比较多的文章描述了这种方法,只是没提出这是一个框架,但是对摇摇2选1,我感觉已经足够了。下面就是主代码,分布在每个Activity中:

private void TaskThread()

{

Thread taskThread = new Thread()

{

@Override public void run()

{

//做耗时的任务

Message msg = Message.obtain();

msg.what = 1;

uiCallback.sendMessage(msg);

}

};

taskThread .start();

}

private Handler uiCallback = new Handler()

{

@Override public void handleMessage(Message msg)

{

if(msg.what == 1)

{

//在主线程中处理结果

}

}

};

 够用就好,至少我现在用着很爽。

 

7. 程序国际化

互联网让地球成为一个村,所以一开始也需要了解一下程序是如何做国际化版本的。不要一开始字符串满天飞,整个程序中都存在hard code,这样做,迟早是要吃亏的。

 

8.产品升级机制

一个方便的产品升级机制,对产品的成长很重要,android是一个开放平台,在这点上比iOS做的好的多,产品升级很方便。

 

此文章的目的就是对想学Android开发的人一个指引,因为我也就是这么走过来的,加上自己在软件开发上的一些经验,让新手少走弯路。有计划,有目标的学习,这是*好的方法。

Android项目包名命名规范及常见项目架构

在Java中我们通常把具备相同或相似功能的一些类放在同一个包中,当然 不同公司会有不同的命名方式,但大体都相同,一个好的命名应见名知义,提高代码可读性,以利于后期代码的修改与维护。下面基于我自己做项目中的一些感触谈谈自己对包命名规范的理解。

一.Java包命名规范

1)包(packages): 采用反写域名命名规则,即com.xx.xxx.xxxx形式
     全部使用小写字母。一级包名为com,二级包名为xx(一般为公司或个人域名),三级包名根据应用进行命名,四级包名为功能模块名。如:com.tencent.qq.activitys,这样具备较高可读性,一看就知道是腾讯公司QQ软件中存放activity的包。
下面是一些常见的包命名组织方式。
com.example.app.activitys 用来组织Activity类
com.example.app.base 基础共享的类,如多个Activity共享的
BaseActivity或整个应用共享的MyApplication类
com.example.app.adapter 项目中用到的适配器类
com.example.app.view 自定义的View,如常用的TitleBarView
com.example.app.util 工具类,如HttpUtil,ImageUtil,FileUtil
com.example.app.db 数据库类,如DataBaseHelper,MessageDB
com.example.app.service 服务类,如GetMsgService
com.example.app.constant 常量类
com.example.app.domain/modle/entity 元素实体类,如对应注册用户信息的User类,
对应聊天信息的TextMessage类
com.example.app.broadcast 广播服务类

2)资源布局文件(XML文件(layout布局文件)):全部小写,采用下划线命名,我一般按照组件名_功能名_属性名方式

如:activity_login,fragment_constact_child.这样当你在Activity的onCreate中使用R.layout.的时候就只需筛选activity开头的xml文件,在Fragment的onCreateView中使用R.layout.的时候就只需筛选fragment开头的xml文件,这样就可以缩小聚焦范围,而且这样的命名具备较高的可读性,很容易知道fragment_constact_child表示某个ConstactFragment类中的child视图。
3)控件:全部小写,采用下划线命名,我一般按照布局文件名_控件名_功能名_属性名方式(前面的布局文件名可选可不选,选的话具备较高的可读性)

如:fragment_constact_child_img_avatar表示fragment_constact_child布局文件中的用户头像的ImageView。

二.常见项目框架

无论是用移动客户端还是PC端的项目,一般都包括三个模块:用户交互层,业务逻辑层,数据持久层
1)用户交互层:呈现给用户的界面模块,应考虑界面性能的高低
          因为要考虑良好的用户体验,所以必须考虑流畅度,让用户在使用App的时候不能感到卡顿
          如:在重新加载某个控件时先判断先前该控件的实例是否存在,若存在直接返回,不存在再创建。
  如在ExpandableListView的ExpandableListAdapter的getChildView代码如下:

[html]  view plain  copy

  1. <span>        </span>public View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {
  2.                 // TODO Auto-generated method stub
  3.                 GroupHolder holder = null;
  4.                 if (convertView == null) {
  5.                     convertView = LayoutInflater.from(mContext).inflate(
  6.                             R.layout.fragment_constact_child, null);
  7.                     holder = new GroupHolder();
  8.                     holder.nameView = (TextView) convertView
  9.                             .findViewById(R.id.contact_list_item_name);
  10.                     holder.feelView = (TextView) convertView
  11.                             .findViewById(R.id.cpntact_list_item_state);
  12.                     holder.iconView = (ImageView) convertView.findViewById(R.id.icon);
  13.                     convertView.setTag(holder);
  14.                 } else {
  15.                     holder = (GroupHolder) convertView.getTag();
  16.                 }
  17.                 holder.iconView.setImageResource(R.drawable.head);
  18.                 holder.nameView.setText(getChild(groupPosition, childPosition)
  19.                         .toString());
  20.                 holder.feelView.setText(signString[groupPosition][childPosition]);
  21.                 return convertView;
  22.             }
2)业务逻辑层: 整个项目的核心,不仅仅要考虑功能的实现,还应考虑性能的高低
在功能上就没啥好说,因为不同App一般要实现的功能不同,在性能上一般可以考虑一下几个层面:
2.1)多线程:这个在网络请求中用的比较多。
可以使用线程池,AsyncTask类,Thread+Handler异步消息机制或其它一些比较好的第三方开源库。
2.2)内存:这个主要是图片处理及缓存

1. 加载大图片时,合理设置BitmapFactory.Options的值inSampleSize,减少图片内存占用;

2. 仅请求图片的大小,inJustDecodeBounds = true仅请求图片大小,而不会加载图片到内存;

3. 缓存图片:内存缓存使用lruCache,磁盘缓存使用 DiskLruCache;

4. 使用非UI线程加载图片,使用 AsyncTask;

5. 使用软引用SoftReference

3) 数据持久层:这个一般用来保存用户的信息,磁盘文件及数据库文件
 这三层图示如下:%title插图%num

全局获取Context技巧

前言:

Android提供了一个Application类,每当应用程序启动的时候,系统就会自动将这个类进行初始化,而我们可以定制一个自己的Application类,以便管理程序内的一些全局状态信息,比如说全局Context。

在android开发中,很多地方都要用到Context上下文这个类对象,比如:弹出 Toast

的时候需要、启动活动的时候需要、发送广播的时候需要、操作数据库的时候需要、使用通

知的时候需要等。

如果是在Activity中,那么获取这个context对象很容易,因为Activity本身就继承Context,直接受用this就可以了。

但是对于比较复杂的逻辑,这些代码没有放在Activity中,那么,获取Context就显得不是那么容易了。

这里告诉大家一个技巧:

Android 提供了一个 Application 类,每当应用程序启动的时候,系统就会自动将这个类

进行初始化。 而我们可以定制一个自己的 Application 类, 以便于管理程序内一些全局的状态信息,比如说全局 Context。

1,新建一个类MyApplication继承Application.

代码如下:

package com.example.networktest;
public class MyApplication extends Application {
private static Context context;
@Override
public void onCreate() {
context = getApplicationContext();
}
public static Context getContext() {
return context;
}
}

2,在 AndroidManifest.xml 文件的<application>标签下进行指定就可以了,代码如下所示:

<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”com.example.networktest”
android:versionCode=”1″
android:versionName=”1.0″ >
……
<application
android:name=”com.example.networktest.MyApplication”
…… >
……
</application>
</manifest>

注意:指定 MyApplication 的时候一定要加上完整的包名,不然系统将无法找到这

个类。

这样我们就已经实现了一种全局获取 Context的机制,之后不管你想在项目的任何地方

使用 Context,只需要调用一下 MyApplication.getContext()就可以了。

实现步骤:
1.自定义一个类继承Applicatioon类
public class MyApplication extends Application {

private static Context mContext;

@Override
public void onCreate() {
super.onCreate();
//获取context
mContext = getApplicationContext();
}
//创建一个静态的方法,以便获取context对象
public static Context getContext(){
return mContext;
}
}

2.在Manifest添加一句语句:原因上面说过了
<application
//注意是完整的路劲,我这个是因为前面有一句:package=”com.example.getcontexttest”
android:name=”.util.MyApplication”
…………
</application>

3.自定义一个类,创建一个静态方法,用于验证:
public class GetContext {

public static void toastNews(){

Context context = MyApplication.getContext();
Toast.makeText(context, “hello world”, Toast.LENGTH_SHORT).show();

}
}

*后调用这个方法:
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

GetContext.toastNews();
}
}

Android开发 随聊

27 条回复  •  2021-03-18 09:02:50 +08:00

1 chenxiansheng   19 天前 现在弄得 app 用安卓原生的多吗?

2 zagfai   19 天前 大厂大应用普遍原生

3 Jaeden   19 天前 闲鱼是 flutter 吧

4 Melodyer   19 天前 @Jaeden 闲鱼好像已经抛弃 Flutter 了

5 Kasumi20   19 天前 还在用 xml 吗

6 ParfoisMeng   18 天前 @chenxiansheng 以你用过听过的 App 来说,原生还是多数。有些创业公司前期可能会选择相对成熟的全平台方案( RN 等),但做大了还是要做原生,毕竟体验上始终都有差距。

@Jaeden 闲鱼大部分页面是 Flutter 。

@Kasumi20 还在用 xml,不过 Jetpack Compse 刚刚发布 beta 版,以后应该会抛弃 xml 吧(大概)。

7 guoziq09   18 天前 。。。。本来我写了一大堆内容,结果被 403 了。现在也不敢写我自己的内容了。。

8 guoziq09   18 天前 @chenxiansheng @zagfai @Jaeden @Melodyer @Kasumi20 @ParfoisMeng 大家移动开发框架都是怎样的?有无像后端那样比较权威或者公认的开发框架?

我每次开新项目的时候都会纠结于要搭建怎样的脚手架。既要考虑扩展性又要考虑非侵入性。导致每次都会纠结很久。各位有没有自己的脚手架,会在开新项目的时候就上,不再重新开发?

9 guoziq09   18 天前 插件化、组件化、热更新相关的,大家的项目都是使用了相关技术了吗?具体使用的是哪家?还是自己开发的?

10 guoziq09   18 天前 对于开源组件是怎样看待的?是看到 github 上有类似的就引入还是会自己来实现呢?

11 guoziq09   18 天前 语言的选择,Kotlin 、jetpack Compose 、Flutter 大家都开始接入了?

12 guoziq09   18 天前 短视频相关的,滤镜啊,特效啊这些。我了解基本都需要 C++、openGL 相关的。是自己开发么?还是直接接入付费 SDK ?

13 guoziq09   18 天前 @chenxiansheng 部分用混合开发的,但是向机器人、车载、iot 相关的还是原生比较多

14 ParfoisMeng   18 天前   1 正常情况下入职的任一公司都是现成的项目,框架早已定死。如果要你从 0 到 1,经验不够你就 github 找几个 star 多的开源项目综合一下,经验到了你自己知道该怎么搭顺手,和开发习惯是有些关系的。

现阶段要整的话,MVVM 在 Android 领域已经基本完善,可以直接上。 插件化、组件化看项目结构与具体业务,不要把简单的问题复杂化。热更新建议放弃,各大应用市场只会越来越严格。

开源组件,自己开发比较耗时的肯定是优先找轮子,但未必直接引入,得看契合度,只用部分功能点的话建议 copy 指定代码。而且大多数需求都有自己的特点,copy 下来更方便自己 diy 。

语言的话,这都 1202 年了就不要问 Kotlin 接没接入了。Jetpack Compose 不是语言。Flutter 不是 Android,它是跨平台。

短视频滤镜特效啥的,付费 SDK 省事(专业做这个的另说)。Android 开发也要分方向,应用层、底层啥啥啥的,弄清楚自己的定位,T 字发展。

15 itgoyo   18 天前 @ParfoisMeng 老哥这发言专业啊

16 guoziq09   18 天前 @ParfoisMeng 看起来是老哥是比较有经验的~

17 stardust21   18 天前 @ParfoisMeng 基本同意。 架构:新起项目的话,直接用 Jetpack 全家桶吧;老项目的话原来是啥就用啥,重构的时候再讨论新方案。 组件化、插件化:等团队到了需要用这些的规模的时候相信你不会来网上问了 视频:除非只是播放,涉及拍摄的话,没有自己的团队当然是接第三方 Flutter 和 Compose 都是 UI 层的东西,想用拿几个页面试试水就行,和现有项目不冲突

18 TimeRain   18 天前 via Android 安卓原生还是好呀,开发模式了有 mvc mvvm mvp,控件库了就用官方的 material design,说实话,个人觉得还是原生开发*舒服

19 OldActorsSmile   18 天前 uniapp

20 shenwu35   18 天前 @OldActorsSmile uniapp 实战接入了?有什么坑

21 admin003   18 天前 原生的话建议 kotlin + jetpack ;有跨平台需求看具体情况,flutter 或者 uniapp ;轻量级混合开发可以尝试 cordova 或 JsBridge 框架;*后,不要重复造轮子。

22 HolmesYe123   18 天前 怎么深入学习 Android 技术,工作一般也是做应用层的,想深入学习 Android 技术

23 juneva   18 天前 18 年毕业 11 月学了下 flutter 之后一直跟着公司要求 原生 flutter 的项目都做 感觉现在自己没点深度。。。

24 guoziq09   17 天前 @stardust21 Jetpack 至多算一种开发模式吧。我理解的架构是隐藏掉细节,成员只需关注业务就好。但至今我带过但团队还没有看到能匹敌 Spring 的。

组件化插件化的话我在网上看了太多浅尝搁置的文章和 demo 了。我想知道的是大家使用的时候是使用自己的还是使用目前开源的比如 Atlas,出于什么样的考量?

Flutter 和 Compose 的话个人还没有解除,kotlin 倒是在项目中写了几个小页面。但是但是引入的话肯定会对当前的架构产生影响吧。

25 guoziq09   17 天前 @juneva 我也是感觉自己没有深度。。不知道如何提升自己的技术实力

26 OldActorsSmile   16 天前 @shenwu35 语言无法描述,你体验一下试试: https://m3w.cn/wyspxz

27 F1ReKing   12 天前 @ParfoisMeng 认同

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速