Android笔记——Activity生命周期与数据传递

来源:互联网 发布:mac git ssh key 生成 编辑:程序博客网 时间:2024/06/07 22:04

1.概述
四大组件之一,用于表示界面,与用户交互
涉及到的概念:Application、 Activity、 Activity栈 、Task

2.状态与生命周期
2.1 三个基本状态:
1)resumed 一个新activity启动入栈,它在屏幕最前端,处于栈的最顶端,此时它处于与用户交互的激活状态
2)paused 当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态,此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它依然可见,但它已经失去了焦点故不可与用户交互
3)stoped 当Activity被另一个Activity覆盖,失去焦点并不可见时即处于stoped状态

2.2 生命周期
Activity生命周期图

    //Activity创建时调用    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);    }    //Activity可见时调用    @Override    protected void onStart() {        super.onStart();    }    //Activity重新可见时调用    @Override    protected void onRestart() {        super.onRestart();    }    //Activity获得焦点时调用    @Override    protected void onResume() {        super.onResume();    }    //Activity失去焦点但仍然可见时调用(在其他应用需要内存时,可能会被kill)    @Override    protected void onPause() {        super.onPause();    }    //Activity 完全不可见时调用(会被系统kill)    @Override    protected void onStop() {        super.onStop();    }    //Activity被销毁时调用(会被系统kill)    @Override    protected void onDestroy() {        super.onDestroy();

3.状态数据暂存
3.1 onPause()
当系统要启动另一个activity时调用(其他的activity显示之前),这个方法通常被用来提交那些持久数据的改变、停止动画、和其他占用CPU资源的东西。由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快,不然可能会出现ANR。

3.2 onSaveInstanceState()
它会将一个Bundle对象传递给该方法。当activity再次启动时,这个Bundle会传递给onCreate()方法和随着onStart()方法调用的onRestoreInstanceState(), 所以它们两个都可以恢复捕获的状态。(意思是onRestoreInstanceState只有在Activity被系统回收后再重新生成时才会被调用)
onSaveInstanceState的调用遵循一个重要原则,即当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,
eg:
用户按下HOME键时。
长按HOME键,选择运行其他的程序时。
按下电源按键(关闭屏幕显示)时。
从activity A中启动一个新的activity B时。
屏幕方向切换时,例如从竖屏切换到横屏时。

 // Activity即将移出栈顶保留UI状态时调用此方法 @Override protected void onSaveInstanceState(Bundle outState) {  super.onSaveInstanceState(outState);  Log.d("***", "onSaveInstanceState"); } // onCreate完成后被调用,用来恢复UI状态 @Override protected void onRestoreInstanceState(Bundle savedInstanceState) {  super.onRestoreInstanceState(savedInstanceState);  Log.d("***", "onRestoreInstanceState"); }

4.数据传递
不同Activity之间的数据传递,一般使用intent作为“信使”,一个intent对象一般由两部分构成,一是“目的地”,二是消息内容,“目的地”时必须的,内容是可选的。

发送方:

//创建信使(已加入“地址”)Intent intent=new Intent(CurrentActivity.this,OtherActivity.class);//创建消息内容Bundle bundle=new Bundle();bundle.putBoolean("Booleankey",true);bundle.putString("Stringkey","value");bundle.putSerializable("person", new Person());intent.putExtra("key",bundle);/**//也可以不用Bundle这个中介,直接把信息写在intent中intent.putExtra("Booleankey",true);intent.putExtra("Stringkey", "value");intent.putExtra("person", new Person());**///跳转至目的地ActivitystartActivity(intent);

接收方

@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_other);        Intent intent=getIntent();        Bundle bundle=intent.getBundleExtra("key");        String Stringkey=bundle.getString("Stringkey");        Boolean Booleankey=bundle.getBoolean("Booleankey");        Person person=bundle.getSerializable("person");        /**        //如果信息直接搭载在Intent上        String Stringkey=intent.getStringExtra("Stringkey");        Boolean Booleankey=intent.getBooleanExtra("Booleankey", true);        Person person=intent.getSerializableExtra("person");        **/    }

5.结果返回处理
Activity提供了一种机制,跳转到其他Activity再返回时,可以接收其他Activity返回的值,而无需再start新的当前Activity,eg:
创建两个Activity,在MainActivity中输入数据后单击“下一步”按钮,启动OtherActivity,在OtherActivity收集到数据后,点击“上一步”,回到MainActivity,并传回OtherActivity的数据,覆盖MainActivity的原数据

MainActivity

//跳转页面Intent intent=new Intent(MainActivity.this,OtherActivity.class);//后一个参数为requestCode,用于处理返回结果时判断是从哪个界面返回的StartActivityForResult(intent,0);//处理返回结果    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if(requestCode==0&&resultCode==RESULT_OK){        //处理从Intent data接收的数据        }    }

OtherActivity

@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_other);        //准备要回传的数据        Intent resultIntent=getIntent();        resultIntent.putExtra("Stringkey", "value");        setResult(RESULT_OK,resultIntent);        //结束当前Activity        this.finish();    }
1 0
原创粉丝点击