动态检测设备属性 关于targetSdkVersion的含义 关于onSaveInstanceState的高级知识 关于startActivity和Intent
来源:http://blog.csdn.net/zhaokaiqiang1992
android:minSdkVersion是指我们的App兼容的最低版本,也就是我们的App在这个版本之下就不能正常运行了,可能是因为使用了更高版本的API或者是Theme,反正就是不能正常运行。
而android:targetSdkVersion属性所指定的则是经过我们优化的最高版本。这个属性并不能保证我们我们的App不能运行在更高的版本上,而是用来说明我们的App是否应该继承在更高版本上发生的行为改变。如果我们没有更新:targetSdkVersion到最新的版本,那么在最新的版本上运行的时候,那么系统就假设我们的App是需要向后兼容的。
举个例子,在4.4版本中,AlarmManager的行为发生了改变,为了节省电量,系统会将时间相差不多的Alarm放在一起执行,这样就不能保证你的Alarm准时运行。所以说,如果你的targetSdkVersion大于等于19,那么运行时间就是不确定的,但是如果是小于19,那么就会使用之前老的API,保证Alarm能够准时运行。
其实,默认的onSaveInstanceState()实现会保存当前界面所有具有id属性的View的状态,用于现场恢复。Android的framework框架中的几乎所有的控件都恰当的实现了onSaveInstanceState()方法,比如EditText会保存文本,CheckBox会保存选中状态等。所以,如果你想恢复现场,给布局中的控件都设置一个id属性就ok啦~
当然,我们也可以自己控制让View不自己保存状态,只要设置 android:saveEnabled为false或者是调用setSaveEnabled()就可以了
另外,如果你想测试你的Activity能不能正常的保存用户数据,你只需要改变你的屏幕方向就可以测试啦,在屏幕方向发生改变的时候,你的Activity会被Destory然后Create,Activity上的信息都不应该丢失,否则,去改改你的代码吧!
其实啊,之所以屏幕方向改变,Activity会重新生成,是因为在运行时,设备的configurations发生了改变,为了让我们App能够感应这种变化并作出正确的反应,系统会重新加载当前的Activity,这种变化包括屏幕方向变化,语言环境变化,键盘状态变化等等,和我们在Activity的标签下设置的 android:configChanges是完全一样的
').addClass('pre-numbering').hide();$(this).addClass('has-numbering').parent().append($numbering);for (i = 1; i <= lines; i++) {$numbering.append($(' ').text(i));};$numbering.fadeIn(1700);});}); // ]]>
来源:http://blog.csdn.net/zhaokaiqiang1992
动态检测设备属性
我们可以使用下面的代码动态检测当前设备是否具备某一个特性,如是否有方向传感器PackageManager pm = getPackageManager(); if(!pm.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) { // This device does not have a compass, turn off the compass feature disableCompassFeature(); }
关于targetSdkVersion的含义
我们经常在清单文件里面这样设置...
android:minSdkVersion是指我们的App兼容的最低版本,也就是我们的App在这个版本之下就不能正常运行了,可能是因为使用了更高版本的API或者是Theme,反正就是不能正常运行。
而android:targetSdkVersion属性所指定的则是经过我们优化的最高版本。这个属性并不能保证我们我们的App不能运行在更高的版本上,而是用来说明我们的App是否应该继承在更高版本上发生的行为改变。如果我们没有更新:targetSdkVersion到最新的版本,那么在最新的版本上运行的时候,那么系统就假设我们的App是需要向后兼容的。
举个例子,在4.4版本中,AlarmManager的行为发生了改变,为了节省电量,系统会将时间相差不多的Alarm放在一起执行,这样就不能保证你的Alarm准时运行。所以说,如果你的targetSdkVersion大于等于19,那么运行时间就是不确定的,但是如果是小于19,那么就会使用之前老的API,保证Alarm能够准时运行。
关于onSaveInstanceState()的高级知识
我们都知道如果实现onSaveInstanceState(),可以在里面保存一些界面的状态,这样在UI恢复的时候,可能会使用保存的值恢复UI现场。其实,默认的onSaveInstanceState()实现会保存当前界面所有具有id属性的View的状态,用于现场恢复。Android的framework框架中的几乎所有的控件都恰当的实现了onSaveInstanceState()方法,比如EditText会保存文本,CheckBox会保存选中状态等。所以,如果你想恢复现场,给布局中的控件都设置一个id属性就ok啦~
当然,我们也可以自己控制让View不自己保存状态,只要设置 android:saveEnabled为false或者是调用setSaveEnabled()就可以了
另外,如果你想测试你的Activity能不能正常的保存用户数据,你只需要改变你的屏幕方向就可以测试啦,在屏幕方向发生改变的时候,你的Activity会被Destory然后Create,Activity上的信息都不应该丢失,否则,去改改你的代码吧!
其实啊,之所以屏幕方向改变,Activity会重新生成,是因为在运行时,设备的configurations发生了改变,为了让我们App能够感应这种变化并作出正确的反应,系统会重新加载当前的Activity,这种变化包括屏幕方向变化,语言环境变化,键盘状态变化等等,和我们在Activity的标签下设置的 android:configChanges是完全一样的
关于startActivity和Intent
我们使用Intent来启动一个Activity是再简单不过的事情了,但是,如果你想要发送一个隐式意图开启Activity的话,你需要考虑没有Activity与你的Intent的Action匹配的情况,因为这样会造成程序crash。所以,以后在发送隐式意图的时候,用下面的这种形式吧Intent intent = new Intent(AlarmClock.ACTION_SET_TIMER) .putExtra(AlarmClock.EXTRA_MESSAGE, "Timer'") .putExtra(AlarmClock.EXTRA_LENGTH, 60) .putExtra(AlarmClock.EXTRA_SKIP_UI, true); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } else { Toast.makeText(this, "No Activity", Toast.LENGTH_SHORT).show(); }
').addClass('pre-numbering').hide();$(this).addClass('has-numbering').parent().append($numbering);for (i = 1; i <= lines; i++) {$numbering.append($(' ').text(i));};$numbering.fadeIn(1700);});}); // ]]>
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2303
- 用户1336
- 访客11158832
每日一句
There is always a better way.
总有更好的办法。
总有更好的办法。
IntelliJ IDEA2018~2019.1激活码-注册码
C++实现NAT检测程序
Google Play商城将85款恶意App下架
打开显示interface.png 或者显示interface.swf
【黑苹果安装】——如何在windows下操作EFI分区
Android简单树状实现
Android 8.0应用图标适配
Android Studio3.4.1更新及槽点
C/C++通过WMI和系统API函数获取系统硬件配置信息
DuiLib编译出错:成员声明中不允许限定名
Java中的(耦合)控制反转
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is
#ifdef _DEBUG失效问题
新会员