Activity详细总结

本文详细介绍了Android中的Activity组件,包括其作用、生命周期方法及其调用时机,并演示了如何在Activity之间传递数据及保存状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Activity是android四大组件中使用频率最为频繁的组件,相当于负责与用户交互的窗口。我们调用setContentView(R.layout.xxxviewId)来指定当前actvity的界面。

Activity的生命周期

学习新的知识是可以类比的,以前在学习servlet的时候,就知道servlet有lifecycle,都有一系列创建实例,初始化,销毁的过程。同样,activity也是具有自己的lifecycle,android官网关于生命周期有一张经典的图:
Activity

    /**
     * activity创建的时候调用
     */
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 }
  /**
     * activity可见的时候调用
     */
    @Override
    protected void onStart() {
        super.onStart();
        Log.i(TAG, "onStart called.");
    }

    //Activity从后台重新回到前台时被调用
    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i(TAG, "onRestart called.");
    }

    /**
    Activity创建或者从被覆盖、后台重新回到前台时被调用
     获取焦点的时候调用
     *
     */
    @Override
    protected void onResume() {
        super.onResume();
        Log.i(TAG, "onResume called.");
    }

    //Activity窗口获得或失去焦点时被调用,在onResume之后或onPause之后
    /*@Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        Log.i(TAG, "onWindowFocusChanged called.");
    }*/

    //Activity被覆盖到下面或者锁屏时被调用,失去焦点时候调用
    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, "onPause called.");
        //有可能在执行完onPause或onStop后,系统资源紧张将Activity杀死,所以有必要在此保存持久数据
    }

    //退出当前Activity或者跳转到新Activity时被调用
    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG, "onStop called.");
    }

    //退出当前Activity时被调用,调用之后Activity就结束了
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "onDestory called.");
    }

    /**
     * Activity被系统杀死时被调用.
     * 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死.
     * 另外,当跳转到其他Activity或者按Home键回到主屏时该方法也会被调用,系统是为了保存当前View组件的状态.
     * 在onPause之前被调用(3.0之前).3.0之后在onPause()之后调用
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {

        outState.putInt("param", param);
        Log.i(TAG, "onSaveInstanceState called. put param: " + param);
        super.onSaveInstanceState(outState);
    }

    /**
     * Activity被系统杀死后再重建时被调用.
     * 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死,用户又启动该Activity.
     * 这两种情况下onRestoreInstanceState都会被调用,在onStart之后.
     */
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        param = savedInstanceState.getInt("param");
        Log.i(TAG, "onRestoreInstanceState called. get param: " + param);
        super.onRestoreInstanceState(savedInstanceState);
    }

      ```

###Activity之间传递数据
####通过Intent传递数据
通过Intent.putExtra方法可以将简单数据类型或可序列化对象(对象必须实现Serializable或者Parcelable接口)保存在Intent对象中,然后在另一个Activity中使用getInt、getString等方法获得这些数据。代码示例如下: 

``` java
  Intent intent = new Intent(MainActivity.this, TargetActivity.class);
  intent.putExtra("boolean", true); 
  intent.putExtra("string", "string");
  startActivity(intent);




<div class="se-preview-section-delimiter"></div>

下面是获取数据:

 Intent intent=getIntent();
 intent.getBooleanExtra("boolean"); 
 intent.getStringExtra("string");




<div class="se-preview-section-delimiter"></div>
通过Intent和bundle传递数据
  Intent intent = new Intent(MainActivity.this, TargetActivity.class);
  Bundle bundle =new Bundle();
  bundle.putExtra("boolean", true); 
  bundle.putExtra("string", "string");
  intent.putExtras(bundle);
  startActivity(intent);




<div class="se-preview-section-delimiter"></div>

下面是获取数据:

 Intent intent=getIntent();
 Bundle bundle = intent.getExtras();
 bundle.getBooleanExtra("boolean"); 
 bundle.getStringExtra("string");




<div class="se-preview-section-delimiter"></div>
从Activity返回数据

启动新的Activity

  Intent intent = new Intent(MainActivity.this, TargetActivity.class);
  startActivityForResult(intent,1); //注意调用的方法,1是约定的响应值(requestCode)




<div class="se-preview-section-delimiter"></div>

在新的Activity中处理

 Intent intent = new Intent(); 
 Bundle bundle = new Bundle();
 bundle.putString("result", "返回的数据"); 
 intent.putExtras(bundle); 
 setResult(RESULT_OK, intent); //RESULT_OK是返回状态码 this.finish();




<div class="se-preview-section-delimiter"></div>

在Activity1的中的处理,重写onActivityResault方法,接受数据

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode==1&&resultCode==RESULT_OK){
        Bundle bundle =data.getExtras(); 
        String result = bundle.getInt("result");
     }
    }




<div class="se-preview-section-delimiter"></div>

Activity的状态保存

在Activity生命周期的代码中我已经使用到这两个方法:

  /**
     * Activity被系统杀死时被调用.
     * 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死.
     * 另外,当跳转到其他Activity或者按Home键回到主屏时该方法也会被调用,系统是为了保存当前View组件的状态.
     * 在onPause之前被调用(3.0之前).3.0之后在onPause()之后调用
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {

        outState.putInt("param", param);
        Log.i(TAG, "onSaveInstanceState called. put param: " + param);
        super.onSaveInstanceState(outState);
    }

    /**
     * Activity被系统杀死后再重建时被调用.
     * 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死,用户又启动该Activity.
     * 这两种情况下onRestoreInstanceState都会被调用,在onStart之后.
     */
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        param = savedInstanceState.getInt("param");
        Log.i(TAG, "onRestoreInstanceState called. get param: " + param);
        super.onRestoreInstanceState(savedInstanceState);
    }

但是在onSaveInstanceState中只适合保存瞬态数据,持久化数据应该在onPause中保存.

“`

从Activity返回数据

启动新的Activity
“` java
Intent intent = new Intent(MainActivity.this, TargetActivity.class);
startActivityForResult(intent,1); //注意调用的方法,1是约定的响应值(requestCode)

“`

在新的Activity中处理
“` java
Intent intent = new Intent();
Bundle bundle = new Bundle();
bundle.putString(“result”, “返回的数据”);
intent.putExtras(bundle);
setResult(RESULT_OK, intent); //RESULT_OK是返回状态码 this.finish();

“`
在Activity1的中的处理,重写onActivityResault方法,接受数据

“`java
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==1&&resultCode==RESULT_OK){
Bundle bundle =data.getExtras();
String result = bundle.getInt(“result”);
}
}

###Activity的状态保存  
在Activity生命周期的代码中我已经使用到这两个方法:  
```java
  /**
     * Activity被系统杀死时被调用.
     * 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死.
     * 另外,当跳转到其他Activity或者按Home键回到主屏时该方法也会被调用,系统是为了保存当前View组件的状态.
     * 在onPause之前被调用(3.0之前).3.0之后在onPause()之后调用
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {

        outState.putInt("param", param);
        Log.i(TAG, "onSaveInstanceState called. put param: " + param);
        super.onSaveInstanceState(outState);
    }

    /**
     * Activity被系统杀死后再重建时被调用.
     * 例如:屏幕方向改变时,Activity被销毁再重建;当前Activity处于后台,系统资源紧张将其杀死,用户又启动该Activity.
     * 这两种情况下onRestoreInstanceState都会被调用,在onStart之后.
     */
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        param = savedInstanceState.getInt("param");
        Log.i(TAG, "onRestoreInstanceState called. get param: " + param);
        super.onRestoreInstanceState(savedInstanceState);
    }

但是在onSaveInstanceState中只适合保存瞬态数据,持久化数据应该在onPause中保存.


《Android群英传》第八章节

《安卓第一行代码》

本文永久链接http://itxuye.com/android-activity.html,转载请注明出处,欢迎交流讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值