77777777777777777777777777777777777777777
啥都不要说了,看代码:
/** * */ package com.lurencun.android.util; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.Queue; import android.os.Handler; import android.view.animation.AlphaAnimation; import android.widget.ImageView; /** * @author chenyoca [桥下一粒砂] (chenyoca@163.com) * @data 2011-12-7 * @desc 用于启动界面显示渐变动画的类。 */ public class TweeningAnimation { private ImageView splashImgView = null; private final static String RESOURCE_ID_KEY = "resource_id"; private final static String RESOURCE_TIME_KEY = "show_time"; private final static String RESOURCE_ALAPHA_KEY = "start_alaph"; private final static long DURATION = 1000; private Queue<Map<String,Integer>> resource_list = new LinkedList<Map<String,Integer>>(); public TweeningAnimation(ImageView view){ splashImgView = view; } /** * 添加一个动画资源 * @param resource_id 资源ID * @param show_time 显示时间(ms) * @param start_alaph 起始透明度(0 - 10) */ public void addAnimation(int resource_id,int show_time,int start_alaph){ Map<String,Integer> item = new HashMap<String, Integer>(); item.put(RESOURCE_ALAPHA_KEY, start_alaph); item.put(RESOURCE_TIME_KEY, show_time); item.put(RESOURCE_ID_KEY, resource_id); resource_list.add(item); } /** * 显示动画 */ public void showAnimation(){ int _show_time = 0; for(Map<String,Integer> item : resource_list){ final int _resource_id = item.get(RESOURCE_ID_KEY); float alapha = (float) (Math.max(0, Math.min(item.get(RESOURCE_ALAPHA_KEY), 10)) / 10.0); _show_time += item.get(RESOURCE_TIME_KEY); final AlphaAnimation animation = new AlphaAnimation(alapha, 1.0f); animation.setDuration(DURATION); new Handler().postDelayed(new Runnable(){ @Override public void run() { splashImgView.setImageResource(_resource_id); splashImgView.startAnimation(animation); } },_show_time); } } } //例子: package com.lurencun.android.util; import android.app.Activity; import android.os.Bundle; import android.widget.ImageView; public class DownloadActivity extends Activity { /** Called when the activity is first created. */ private TweeningAnimation tween; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ImageView v = (ImageView)findViewById(R.id.splash); tween = new TweeningAnimation(v); tween.addAnimation(R.drawable.cfuture_logo_320dpi, 2000, 2); tween.addAnimation(R.drawable.lurencun_logo_320dpi, 3000, 2); tween.addAnimation(R.drawable.splash, 3000, 2); } @Override protected void onStart() { super.onStart(); tween.showAnimation(); } }
写在前面的话:本系列主要是学习sundy的Android深入浅出视频中的一些记录,心得。方便自己以后查阅。也供大家查看。欢迎交流,补充。
一般作为面试题(有些有答案,有些没有。问题一般从sundy老师思维导图中摘录,答案并非唯一标准,仅供参考):
1、为什么需要用到Activity状态保存, 如何用 ?
1)我们希望当前的Activity中的信息不会因为Activity状态的改变,而丢失。比如横竖屏的切换,突然来了个电话。
2)借助Activity Lifecycle + Preference来完成状态保存;
借助onSaveInstanceState & onCreate or onRestoreInstanceState来完成状态保存;
2、如何选择到底用SaveInstance还是用Preference?
1)onSaveInstance方法在系统回收Activity之前会调用;Back & Home键不会调用(这里有疑问。按home键应该会调用OnSaveInstance方法的,sundy老师这里讲的可以能有误,补:经过验证,Home键的时候会调用该方法)
网上的答案:
1)当用户按下HOME键时。
这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则
2)长按HOME键,选择运行其他的程序时。
3)按下电源按键(关闭屏幕显示)时。
4)从activity A中启动一个新的activity时。
5)屏幕方向切换时,例如从竖屏切换到横屏时。
默认情况当activity的view有id时,当系统觉得有可能觉得系统会关闭掉此activity时,就会自动保存这些有id的view的状态
注:通过android.os.Process.killProcess杀死时,不会调用任何方法,包括onSaveInstanceState。
2)使用Preference的时候:按了Back键,使用onPause,onResume