无关技术
日日行,不怕千万里;
时时做,不怕千万事.
本章概要
本章主要讲了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中.