Android学习笔记(十三)高级技巧

    xiaoxiao2021-12-14  21

    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到做完的笔记中。         钢铁锅,含眼泪喊修瓢锅……
    转载请注明原文地址: https://ju.6miu.com/read-963244.html

    最新回复(0)