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

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到做完的笔记中。

        钢铁锅,含眼泪喊修瓢锅……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值