Android编程权威指南(第三版)第六章学习笔记

无关技术

日日行,不怕千万里;

时时做,不怕千万事.

本章概要

本章主要讲了SDK的相关版本和兼容性的问题.

SDK最低版本

以最低版本设置为标准,操作系统会拒绝将应用安装在系统版本低于标准的设备上.
比如设置最低版本为19.在Android系统低于19的设备上都是拒绝安装此应用的.

SDK目标版本

目标版本的设定值告知android:应用是为哪个API级别设计的.
大多数情况下,目标版本即最新发布的android版本.

但是,新发布的sdk版本可能会改变应用在设备上的显示方式,或者运行行为也改变了.
这时候可以降低目标版本.比如android 6.0 权限行为,7.0以上的fileProvider等

有些第三方库的影响等等,只好降低目标版本到22.运行正常.

降低sdk目标版本可以保证的是:即便在高于目标版本的设备上,应用仍然可以正常运行,且运行行为与目标版本一致.但是新版本总的变化已经被忽略了.

SDK编译版本

sdk最低版本和sdk目标版本会通知给操作系统,而sdk编译版本只是你和编译器之间的私有信息.
编译代码时,sdk编译版本指定具体要使用的系统版本.

安全添加新版本API中的代码

最低版本和编译版本的差异较大,由此带来的问题需要解决.比如,你的手机是4.4的API级别是19. 你的代码中使用了API19以后的sdk版本中代码,那么运行时,你的应用就会奔溃.

受益于android Lint,这类问题,会有提示.

挑战练习

显示设备运行系统的api级别

应用运行时,调用Build.Version.SDK_INT 就是运行的版本.
所以可以使用如下代码
`

    mApiVersionTextView = findViewById(R.id.api_version_text_view);
    String apiLevel = getString(R.string.api_level, Build.VERSION.SDK_INT);
    mApiVersionTextView.setText(apiLevel);

`

其中TextView的布局
`


`

限制作弊次数

思路:声明一个int值mCheatCount,用于记录用户作弊的次数,每次作弊的时候,都会在onActivityResult记录,可以在改方法中递增这个值.

要考虑到屏幕旋转等的问题,需要在上一个(05)章节完成挑战练习中的基础上来做这道题.
`

   if (mIsCheaters[mCurrentIndex]) {
            mCheatCount++;
            mRemainCountTextView.setText("remain cheat count:" + (3 - mCheatCount));
        }

`
这种方法虽然实现了,但是正常情况下,应该是同一道题,我查看答案了,应该下次再来查看,是不应该记录作弊的次数的.

首先想到的是声明一个int值mLastPosition,默认为-1,
当这个值不等于当前索引的值,才去递增mCheatCount.
实现如下:

`

   if (mIsCheaters[mCurrentIndex] && mLastPosition != mCurrentIndex) {
            mCheatCount++;
            mLastPosition = mCurrentIndex;
            mRemainCountTextView.setText("remain cheat count:" + (3 - mCheatCount));
        }

`
后来想想,这样做是有问题的,比如第一道题作弊了(mLastPosition=0),然后点击下一道题,也作弊了(mLastPosition =1).然后多次点击next按钮,回到第一道题,再去作弊.
这时候mLastPosition( = 1) != mCurrentIndex(= 0)条件成立,而明明第一道题已经作弊了,再次查看不应该记录作弊次数才对的.

所以想到要用数组来记录作弊与否.
声明一个boolean数组,默认值都是false,当用户作弊后,就将当前索引的值改为true
此时如果用户作弊了,还需要满足当前索引值的boolean,为false才去递增作弊次数.

`

        mIsCheaters[mCurrentIndex] = CheatActivity.wasAnswerShown(data);
        if (mIsCheaters[mCurrentIndex] && !mCheatCounts[mCurrentIndex]) {
            mCheatCount++;
        //  mLastPosition = mCurrentIndex;
            mCheatCounts[mCurrentIndex] = true;
            mRemainCountTextView.setText("remain cheat count:" + (3 - mCheatCount));
        }

`

考虑到屏幕旋转的问题,应该将这些值,都保存在bundle中.
按钮的禁用就很容易了,只需要判断作弊次数>=3,就将按钮设置为不可用.
当然,防止屏幕旋转,需要声明一个boolean来保存按钮的可用性.然后将这个值保存在bundle中.

你可能感兴趣的:(Android编程权威指南(第三版)第六章学习笔记)