activity 在运行时,有时候会遇到突发状况,发生意外,这时候数据很容易就丢失了,比如横竖屏切换,程序crash,点击了HOME键盘,关闭了电源键,内存吃紧,activity被回收,一瞬间内存消耗过大,oom等等。幸好,android为我们提供了一套机制缓存数据
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString("editText",edit.getText().toString());
super.onSaveInstanceState(outState, outPersistentState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState, persistentState);
String str = savedInstanceState.getString("editText");
edit.setText(str);
}
一个方法是保存数据,一个是获取数据。在onSaveInstanceState中保存需要存储的参数,然后再onRestoreInstanceState获取保存的数据并进行设置即可。同时,数据也会回传到onCreate()方法的Bundle参数里,也可以在次进行非空判断,是否有数据。
onSaveInstanceState(Bundle outState)
有两点需要注意的地方:
用户主动销毁不会调用 : 用户点击回退键 或者 调用了 finish() 方法, 不会调用该方法;
调用时机不固定 : 该方法一定是在 onStop() 方法之前调用, 但是不确定是在 onPause() 方法之前 还是 之后调用;
onRestoreInstanceState(Bundle savedInstanceState)
在 Activity 被系统销毁之后 恢复 Activity 时被调用, 只有销毁了之后重建的时候才调用, 如果内存充足, 系统没有销毁这个 Activity, 就不需要调用;
该方法保存的 Bundle 对象在 Activity 恢复的时候也会通过参数传递到 onCreate() 方法中;
该方法在 onResume() 方法之前保存信息;
在activity中,有时候会碰到一些需求,比如控件view的长点击事件,最常见的是listview的条目长点击事件,长按item,弹出一个Dialog框,点击进行一些操作。常规的做法是注册listview的条目点击事件,在点击事件里做Dialog的弹出框。今天介绍另外一种方法,也很好用,activity的registerForContextMenu(View view)方法。在用这个方法,需要重写两个方法,
onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
和 onContextItemSelected(MenuItem item) 方法。
例如:
registerForContextMenuget(ListView);
@Override
public void onCreateContextMenu(ContextMenu menu, View view,
ContextMenuInfo menuInfo) {
menu.setHeaderTitle("人物简介");
//添加菜单项
menu.add(0, 0, 0, "特长");
menu.add(0, 1, 0, "战斗力");
menu.add(0, 2, 0, "经典语录");
}
//菜单单击响应
@Override
public boolean onContextItemSelected(MenuItem item){
//获取当前被选择的菜单项的信息
//AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();
//Log.i("braincol",String.valueOf(info.id));
switch(item.getItemId()){
case 0:
//在这里添加处理代码
break;
case 1:
//在这里添加处理代码
break;
case 2:
//在这里添加处理代码
break;
}
return true;
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString("editText",edit.getText().toString());
super.onSaveInstanceState(outState, outPersistentState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState, persistentState);
String str = savedInstanceState.getString("editText");
edit.setText(str);
}
一个方法是保存数据,一个是获取数据。在onSaveInstanceState中保存需要存储的参数,然后再onRestoreInstanceState获取保存的数据并进行设置即可。同时,数据也会回传到onCreate()方法的Bundle参数里,也可以在次进行非空判断,是否有数据。
onSaveInstanceState(Bundle outState)
有两点需要注意的地方:
用户主动销毁不会调用 : 用户点击回退键 或者 调用了 finish() 方法, 不会调用该方法;
调用时机不固定 : 该方法一定是在 onStop() 方法之前调用, 但是不确定是在 onPause() 方法之前 还是 之后调用;
onRestoreInstanceState(Bundle savedInstanceState)
在 Activity 被系统销毁之后 恢复 Activity 时被调用, 只有销毁了之后重建的时候才调用, 如果内存充足, 系统没有销毁这个 Activity, 就不需要调用;
该方法保存的 Bundle 对象在 Activity 恢复的时候也会通过参数传递到 onCreate() 方法中;
该方法在 onResume() 方法之前保存信息;
在activity中,有时候会碰到一些需求,比如控件view的长点击事件,最常见的是listview的条目长点击事件,长按item,弹出一个Dialog框,点击进行一些操作。常规的做法是注册listview的条目点击事件,在点击事件里做Dialog的弹出框。今天介绍另外一种方法,也很好用,activity的registerForContextMenu(View view)方法。在用这个方法,需要重写两个方法,
onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
和 onContextItemSelected(MenuItem item) 方法。
例如:
registerForContextMenuget(ListView);
@Override
public void onCreateContextMenu(ContextMenu menu, View view,
ContextMenuInfo menuInfo) {
menu.setHeaderTitle("人物简介");
//添加菜单项
menu.add(0, 0, 0, "特长");
menu.add(0, 1, 0, "战斗力");
menu.add(0, 2, 0, "经典语录");
}
//菜单单击响应
@Override
public boolean onContextItemSelected(MenuItem item){
//获取当前被选择的菜单项的信息
//AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();
//Log.i("braincol",String.valueOf(info.id));
switch(item.getItemId()){
case 0:
//在这里添加处理代码
break;
case 1:
//在这里添加处理代码
break;
case 2:
//在这里添加处理代码
break;
}
return true;
}