onsavedinstance(Bundle savedinstancestate)方法的触发时机,其典型的情景是按home键或者切换activity,这样的activity可能被销毁的场合,但是按back键退出程序,则不会调用此方法,适合保存一些非持久性的数据(即程序运行期间需要储存的数据)。
而onpause(),不管是可能销毁还是退出程序,都必须调用,适合保存持久性的数据,但是android本身没有为此方法提供bundle参数,因此我们可以选用做一个静态变量或者是提供一个sharedpreference作为数据载体。
我练习的时候,使用了一个静态变量保存数据,改变数据以后,重新启动程序,改变的数据得到了保存,看代码:
public class MainActivity extends Activity { private ListView namesListView; private MyAdapter adapter; private ArrayList<String> names; private static Bundle outState; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("create", String.valueOf(savedInstanceState == null)); if (outState != null) { names = outState.getStringArrayList("names"); } else { names = new ArrayList<String>(); names.add("小李"); names.add("小刚"); names.add("小明"); names.add("小花"); names.add("小红"); names.add("小兰"); } namesListView = (ListView) findViewById(R.id.nameList); adapter = new MyAdapter(this, names); namesListView.setAdapter(adapter); } private void singleRefresh(int id){ if (namesListView != null) { int start = namesListView.getFirstVisiblePosition(); int end = namesListView.getLastVisiblePosition(); for (int i = start; i < end; i++) { if (id == namesListView.getItemIdAtPosition(i)) { TextView view = (TextView) namesListView.getChildAt(i-start); names.set(i, "我变身超级赛亚人啦!"); adapter.getView(i, view, null); break; } } } } public void refresh(View v){ singleRefresh(0); } @Override protected void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub super.onSaveInstanceState(outState); //outState.putStringArrayList("names", names); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); if (outState != null) { outState.clear(); outState = null; } outState = new Bundle(); outState.putStringArrayList("names", names); } }