Activity的生命周期和一些常用技巧2

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;  
    }  

你可能感兴趣的:(Android,知识)