目录
下载
最新版本
历史版本
打开上面的下载链接,下滑找到“Android Studio 下载”
点击“下载归档”,进入协议页
重点:在协议页,将语言由中文切换为英文(见下图)
这个时候页面内的协议就可以正常显示了
点击"I agree to the terms"就可以看到旧版本列表了
选择需要的对应版本下载即可
配置
设置/修改 SDK 路径
依次打开 Settings -> Appearance & Behavior -> System Settings -> Android SDK ->
点击 Android SDK Location 后边的 Edit 选择本地 SDK 所在路径即可
设置编码格式为 UTF-8
依次打开 Settings -> Editor -> File Encoding ->
Global Encoding -> UTF-8
Project Encoding -> UTF-8
Default encoding for properties files -> UTF-8 勾选后面的复选框
设置护眼色背景色
依次打开 Settings -> Editor -> Colors Scheme -> General ->
右侧打开 Text 节点,选择 Default Text
勾选 Background
点击颜色选择器,设置颜色为 C7EDCC
配置作者姓名、邮箱、类描述等模板
依次打开 Settings -> Editor -> File and Code Templates -> Includes -> File Header ->
输入以下模板
/**
* <pre>
* author : ${USER}
* e-mail : xxx@xx
* time : ${YEAR}/${MONTH}/${DAY}
* desc :
* version: 1.0
* </pre>
*/
删除多余的 import,减少警告出现
依次打开 Settings -> Editor -> General -> AutoImport ->
勾选 Optimize imports on the fly,如下图
自动生成 SerializableID
序列化:Serializable & Parcelable
序列化:就是将对象的状态信息转换为可以存储或传输的形式的过程
在我们平时开发中,我们用到序列化最多的地方就是通过intent传递对象,
如果你要在intent中传递基本数据类型以外的对象,那么该对象必须实现
Serializable或者Parcelable,否则会报错
注意
1:通过intent传递过去的对象是经过了序列化与反序列化的,虽然传送的对象和接收的对象内容相同,但它们是不同的对象,因为它们的引用是不同的
2:静态变量是不会经过序列化的,所以跨进程通信的时候静态变量是传送不过去的
1.Serializable
Serializable是java提供的序列化接口,使用起来特别简单,你只用实现这个接口就能够让这个对象支持序列化
public class MineTestSecond implements Serializable {
//注意,添加一个字段,serialVersionUID
private static final long serialVersionUID = 3275926292199431244L;
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
SerializableID 的作用
如,定义了一个 Student 类,里面定义了一个 SerializableID=5,序列化后传给服务器,服务器将其存到数据库以后再使用。若干天后,系统升级,在 Student 类加了一个字段 String address,如果 Student 类里没有定义 SerializableID 或者 SerializableID 不一样了,此时,存在数据库里的 Student 对象就反序列化不回来了。若定义了 SerializableID,在 Student 类里加了一个属性,即使存在数据库的对象少一个属性,也是可以反序列化回来的,只不过新添加的那个属性值为null而已。
序列化 & 反序列化
Serializable序列化与反序列化有很多种方法,这里示范一下通过写入文件和读取文件来实现.
序列化
File file = new File(getFilesDir()+"zhangsan.txt");
Person person = new Person("zhangsan");
ObjectOutputStream outputStream =
new ObjectOutputStream(newFileOutputStream(file));
outputStream.writeObject(person);
反序列化
ObjectInputStream objectInputStream =
new ObjectInputStream(new FileInputStream(getFilesDir()+"zhangsan.txt"));
Person person = (Person) objectInputStream.readObject();
2.Parcelable
Parcelable是Android特有的序列化方式,他的实现相对Serialiable来说更加复杂一点,但是通过AS的一个插件就可以很方便的完成。
插件名称:Android Parcelable Code Generator
安装插件:AS > Settings > Plugins > Browse Repositories > 搜索 Android Parcelable Code Generator > 安装插件后重启AS即可
Parcelable 序列化方法1:创建对象并实现Parcelable接口,右键 > Generate > Parcelable > 点击需要序列化的字段 > 点击ok
Parcelable 序列化方法2:创建对象并实现Parcelable接口,Alt + Insert > Parcelable > 点击需要序列化的字段 > 点击ok
(此截图引用自Android开发艺术探索)
3.Serializable与Parcelable的对比
Serializable:
1.Serializable是java提供的可序列化接口
2.Serializable的序列化与反序列化需要大量的IO操作,效率比较低
3.Serializable实现起来很简单
Parcelable:
1.Parcelable是Android特有的可序列化接口
2.Parcelable的效率比较高
3.Parcleable实现起来比较复杂
4.使用场景
1.Parcleable: 内存中的序列化时使用,效率更高
2.Serializable: 对象序列化到存储设备中、在网络中传输等
SerializableID 的自动生成
依次打开 Settings -> Editor -> Inspections -> General ->
右侧展开 Java 节点
展开 Serialization issues 节点
选中 Serializable class without ‘serialVersionUID’
在实现了Serializable中的JavaBean中,选中类名,Alt+Enter弹出提示,然后直接导入生成 SerializableID
功能
生成 SHA1 和 MD5 值
生成 SHA1 和 MD5 值需要使用 DOS 窗口,也可以在 android studio 中直接使用 Terminal 工具
点击 Terminal
cd 到 keystore.jks(签名文件)所在的目录
输入 keytool -list -v -keystore keystore.jks(其中 keystore.jks 替换为签名文件的文件名,包括后缀)
按下回车键
输入keystore密码(注意,是keystore的密码,不是key的密码)
Apk 配置多渠道打包
多渠道打包的用途(为什么要进行多渠道打包)
通过多渠道打包,将对应的 APP 发布到对应的应用渠道市场上
再利用友盟统计,来统计不同渠道上的 APP 下载量、安装量等数据信息
下载量:用户下载一次,下载量记为1次
安装量:同一个手机安装多次(不论从哪个应用市场进行的下载安装),安装量都记为1次
第一步:
在 AndroidManifest.xml 中的 Application 节点下添加如下代码
这里之所以命名 name 为 UMENG_CHANNEL,是因为我们将多渠道导包与友盟统计配合使用
<!--多渠道打包 - 友盟统计-->
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
第二步:
在 module 的 build.gradle 中的 android 节点下添加如下代码
//多渠道打包 - 友盟统计
productFlavors {
yingyongbao {}
wandoujia {}
xiaomi {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
第三步:
在 module 的 build.gradle 中的 android 节点下的 buildTypes 节点下的 release 版本配置中添加如下代码
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
// 输出apk名称为app_v1.0_xxxx-xx-xx_xxxx.apk
// def fileName = "app_v${defaultConfig.versionName}_${releaseTime()}.apk"
// 输出apk名称为app_v1.0.apk
// def fileName = outputFile.name.replace(".apk", "app_v${defaultConfig.versionName}.apk")
// 输出apk名称为app_v1.0_yingyongbao.apk
def fileName = "app_v${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
第四步:
生成 release 的 apk
点击 android studio 工具栏的 Build,选择 Generate Signed APK…,等待生成多渠道包,可能有点慢
至此、多渠道打包结束
如果用的是 友盟统计,只需按照友盟统计的官方文档进行集成友盟统计即可
除了上述原始的多渠道打包方式外,还有其他的多渠道打包方式,如美团多渠道打包、360多渠道打包等,打包速度极快,15秒钟可打包300左右,当然也是存在缺陷的,个人觉得一共就发布几个主流的应用渠道的话,使用原始的多渠道打包就好,慢不多少,还规避了一些风险
备注:
如果是没用到友盟统计的话,可以在需要的地方,添加如下代码
将 getChannel() 方法获取到的 渠道名 发送到服务器进行相应的统计。
/**
* 获取渠道名称
* 用于多渠道打包
*
* @return
*/
private String getChannel() {
try {
PackageManager pm = getPackageManager();
ApplicationInfo appInfo = pm.getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
return appInfo.metaData.getString("UMENG_CHANNEL");
} catch (PackageManager.NameNotFoundException ignored) {
ignored.printStackTrace();
}
return "";
}
res 资源文件分包
在 app 目录下的 build.gradle 中 android 节点下的 sourceSets 中配置如下代码
sourceSets {
main {
res.srcDirs('src/main/res', 'src/main/res_core', 'src/main/res_sub')
}
}