13.1 全局获取Context
Android 提供了一个 Application 类,每当应用程序启动的时候,系统就会自动将这个类进行初始化。而我们可以定制一个自己的 Application 类,以便于管理程序内一些全局的状态信息,比如说全局 Context。
定制自己的全局类需要创建一个类并继承自Application类,如下:
public class MyApplication extends Application {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
//在创建时获取到全局的Context
context = getApplicationContext();
}
/**
* 在外部随时随地调用此方法即可获取上下文
*
* @return
*/
public static Context getContext() {
return context;
}
}
修改AndroidManifest.xml文件告知系统启动时初始化自定义类,而不是默认的Application:
<application
android:name=".MyApplication"
...>
...
</application>
13.2 使用Intent传递对象
13.2.1 Serializable方式
(1)自定义实体类要实现Serializable接口(搞java的应该都知道)
(2)用意图传递数据时这样写:
//Person是自定义实体类
Person person = new Person();
Intent intent = new Intent(MainActivity.this, OtherActivity.class);
intent.putExtra("person", person);
(3)获取到Activity传递过来的对象时这样写:
Person person= (Person) getIntent().getSerializableExtra("person");
13.2.2 Parcelable方式
Parcelable的方式要复杂点,它的实现原理是将一个完整的对象进行分解,而分解后的每一部分都是Intent所支持的类型。但相比序列化来说,这种方式更推荐,因为序列化方式效率较低。
(1)实体类实现Parcelable接口(在Android Studio中根据提示可毫不费力的创建好)
public class Person implements Parcelable {
private String name;
private int age;
protected Person(Parcel in) {
name = in.readString();
age = in.readInt();
}
//必须提供一个名为CREATOR的常量
public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
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;
}
@Override
public int describeContents() {
//这里返回0就可以
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
//将字段一一写出
dest.writeString(name);
dest.writeInt(age);
}
}
(2)传递对象时依然用同样的putExtra方式传递
(3)获取对象时这样写:
Person person = getIntent().getParcelableExtra("person");
13.3 定制自己的日志工具
比如这样一个场景,在编写一个庞大的项目时,为了方便调试,代码的很多地方打印了日志。之后项目完成了,上线了,但是之前的日志依然会输出,不仅降低程序效率,还可能泄露一些隐私机密数据。
解决方案很简单,自定义一个日志工具类如下:
public class LogUtil {
//日志输出等级
public static final int VERBOSE = 1;
public static final int DEBUG = 2;
public static final int INFO = 3;
public static final int WARN = 4;
public static final int ERROR = 5;
//NOTHING常量,表示不输出任何东西
public static final int NOTHING = 6;
//自由设置日志输出的级别,只需要设置此值便可以自由控制日志输出
public static final int LEVEL = VERBOSE;
public static void v(String tag, String msg) {
if (LEVEL <= VERBOSE) {
Log.v(tag, msg);
}
}
public static void d(String tag, String msg) {
if (LEVEL <= DEBUG) {
Log.d(tag, msg);
}
}
public static void i(String tag, String msg) {
if (LEVEL <= INFO) {
Log.i(tag, msg);
}
}
public static void w(String tag, String msg) {
if (LEVEL <= WARN) {
Log.w(tag, msg);
}
}
public static void e(String tag, String msg) {
if (LEVEL <= ERROR) {
Log.e(tag, msg);
}
}
}
13.4 Android中的签名机制
13.4.1 相关知识
(1)签名机制是Android中独有的安全机制,Android系统要求只有签名后的apk才能安装
(2)签名机制主要用在两个场合:升级app和权限检查。用户在升级app时(已经装过),如果修改的程序属于同一来源,则允许升级安装,否则提示签名不一致无法安装;
(3)数据指纹(摘要),实际上是一种算法,就是对数据源进行计算之后得到一个数据。著名的算法有RSA公司的MD5算法和SHA-1算法及其大量的变体。
其主要特点是:
- 无论数据源多长,其计算出来的指纹长度总是固定的
- 数据源不同,即使稍作该变,计算出的指纹也会不同
- 不可逆性,根据指纹无法推算出原数据源任何信息
(4)Android中签名的两个工具:jarsign和signapk;jarsign是java自带的签名工具,签名时使用keystore文件;signapk是后来专门为Android应用进行签名的工具,签名时使用pk8,x509.pem文件。
(5)我们在用工具Eclipse或者AndroidStudio进行开发时,我们并没有进行过签名操作,但依然可以安装到手机上。因为工具有默认的keystore文件帮我们自动进行了签名,但应用正式上线后我们要手动进行正式的签名。
13.4.2 使用AndroidStudio打包签名
(1)菜单Build→Generate Signed APK
(2)出现窗口后点击Create new按钮
(3)点击完Create new窗口后出现如下界面,并填写信息(上面的必填,下面的Certificate至少填一项),完成后点击OK
(4)点击OK后出现如下界面
(5)点击Next出现下面窗口,然后点击Finish即可完成签名,并可在图中所示的目录中找到apk文件
13.4.3 查看签名信息
(1)打开cmd,进入到 .android文件夹,默认路径为 C:\Users\用户名\.android
(2)输入命令:keytool -list -v -keystore [文件路径],文件路径就是签名时keystore文件的保存路径,例如我的为C:\Users\admin\demo.jks,如下所示
ps:开发版的(默认签名)信息查看命令为keytool -list -v -keystore debug.keystore,没有密钥口令,提示输入时直接回车即可。
(3)输入签名时设置的秘钥口令,回车如下,其中的一些信息如MD5、SHA1等在很多地方需要用到(如申请百度地图API)。
13.5 最后啰嗦几句
好了,到现在为止,《第一行代码》中的基本知识点已经学习并记录完成了。当然,这远远不够,现在只是完成了Android的一个最简单的入门,还有更多更多的知识需要不断的学习。另外,还要通过大量的练习和项目实战来将所学到的知识进行综合运用,这样才能真正的消化和吸收,希望自己和其他小伙伴们不以为傲,要走的路,还很长.......
还有,一个爆炸性的消息,BOM!BOM!~~BOM!郭霖大神的著作《第二行代码》已经问世了(此时我的内心几乎是崩溃的)...........第2版中对原有的技术和介绍进行了全面的升级,包括换成了Android Studio开发、基于Android 7.0系统讲解等等全新知识,厉害了word哥!看来,以后还得花点时间研究一下第二本书,并把新的knowledge和change都update到做完的笔记中。
钢铁锅,含眼泪喊修瓢锅……