更快的屏幕方向更改

[size=large][color=blue][b]更快的屏幕方向更改[/b][/color][/size]
  Android操作系统已经被非常多的手机硬件所采用。就目前推出的第一款安装有Android操作系统的T-Mobile G1,在G1上可以体验到旋转手机从而实时的改变屏幕显示模式,比如我们打开硬件键盘,屏幕将会实时的从纵向显示转变为横向显示。
  为了达到简化开发的目的,可以在屏幕变化时自动保存现有的资源或者一些必要的信息从而在变化后可以很快的根据新的标准重新恢复Activity所包含的内容。Android基于这方面的考虑预置了一种可以调用特定资源从而匹配屏幕变化的行为,比如说标记横向屏幕所对应的layout或者一些drawables资源。关于这方面的资料可以查看官方给出的详细说明(read the official documentation on resources).
  对于开发者来讲需要非常重视对这个预置的功能应用,因为它可以使应用程序实时根据屏幕的调整做出最合理的匹配方案。桌面从纵向调整为横向显示需要明确Activity是如何做出反应的,这对于一些刚刚接触Android平台的人来讲在理解上会有一些困难,Activity响应显示模式变化要经过 destroyed和recreated两个过程,通过recreated可以出发程序对最新的显示模式做出反应。
  当应用程序在运行时需要表现大量的数据或者需要通过网络加载某些资源时,如果我们在显示模式的变化中不做任何干预,那么同样的应用程序将需要重新加载必要的预置数据,这样每次改变显示模式都将花费同样的时间来重复加载相同的资源。
  通过一个更典型的例子来理解这个过程,Photostream通过网络下载6幅图片并显示在屏幕中,并且针对两种显示模式提供相对的layout和drawables匹配方案:
[align=center][img]http://dl.iteye.com/upload/attachment/563701/a1049b52-d607-3e6b-93ab-695735b22701.png[/img][/align]
[align=center][img]http://dl.iteye.com/upload/attachment/563703/acf4e7a5-aa3e-366c-a266-0c52a294bace.png[/img][/align]
  在这个例子中可以清楚的理解,我们不希望用户在改变现实模式时重新加载大量的数据。那么针对这样的问题我们可以借鉴一些主流浏览器所采取的方法,建立一个暂存区来保留临时文件(例如检测到设备提供SD Card,从而把临时文件存放在里边),这样我们可以再重新改变现实模式后可以通过临时文件快速的重新加载数据内容。那么通过什么方式才能优化是否为程序提供暂存文件的功能呢?(可能有些程序并不需要这样必须的行为,所以没有必要额外的利用外界的存储设备)值得庆幸的是Android为我们提供了onRetainNonConfigurationInstance()方法,Activity的基类中声明了这个虚函数,可以让开发者在自己的应用程序中决定是否实现这个函数的函数体,借用上边的例子我们可以用如下代码来保存临时图片:
@Override
public Object onRetainNonConfigurationInstance() {
final LoadedPhoto[] list = new LoadedPhoto[numberOfPhotos];
keepPhotos(list);
return list;
}

  之后便可以在activity的onCreate()函数中实现重新调用临时文件,在代码中需要判断系统是否需要重新加载临时文件。以下是放在OnCreate()函数中加载临时文件的代码:
private void loadPhotos() {
final Object data = getLastNonConfigurationInstance();

// The activity is starting for the first time, load the photos from Flickr
if (data == null) {
mTask = new GetPhotoListTask().execute(mCurrentPage);
} else {
// The activity was destroyed/created automatically, populate the grid
// of photos with the images loaded by the previous activity
final LoadedPhoto[] photos = (LoadedPhoto[]) data;
for (LoadedPhoto photo : photos) {
addPhoto(photo);
}
}
}

  对于大多数的情况并不需要做如上的操作,所以需要谨慎使用这个行文,毕竟最好的行为也并不适用于所有情况,如果应用的不好反而会给程序带来不必要的麻烦。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值