【Android四大组件】Activity基础知识

一、Activity的生命周期

在这里插入图片描述

1.1返回栈

Android 使用任务(Task)来管理活动,而一个任务就是一组存放在栈里的活动的集合,又称为返回栈。
在默认情况下,新活动会在返回栈中入栈并处于栈顶的位置,按下Back或调用finish()方法后,处于栈顶的活动会出栈,前一个活动就会处于栈顶的位置。
栈顶的活动被显示给用户。

1.2活动状态

活动有四种状态:运行状态,暂停状态,停止状态,销毁状态。
运行和暂停状态的活动用户可见,停止和销毁不可见

1.3活动的生存期

  • onCreate(),活动第一次创建时调用,进行一些初始化操作

  • onStart(),活动不可见变为可见

  • onResume(),活动位于栈顶,且准备好与用户交互

  • onPause(),准备启动或恢复另一个活动时调用,通常在此时保留一些关键数据并释放资源,此时活动可见

  • onStop(),活动完全不可见时调用

  • onDestroy(),活动即将被销毁调用,其后活动被销毁

  • onRestart(),活动由停止变为开始运行(stop变为start)
    活动的三种生存期如下:

  • 完整生存期:从onCreate()到onDestroy().

  • 可见生存期:onStart()到onsStop(),此时活动可见

  • 前台生存期:onResume()到onPause(),此时活动可交互。

二、Activity的启动方式

  • standard:默认启动模式,每启动一次就创建一个活动实例位于栈顶,可以重复
  • singleTop:如果活动位于栈顶,就不会重复创建,否则还是会创建。
  • singleTask:创建活动时先检查栈中是否有,如果有就不创建,并且已存在的活动之上的活动全部出栈。一般用于图集,一键退出。
  • singleInstance:创建的活动位于单独的栈中,启动时均复用该活动,其他程序可以共享这个活动的实例。

三、Activity现场数据保存

一般情况下,调用onPause或onStop方法,activity的实例仍然会在内存中,保存的数据不会丢失,重新回到前台后,信息会得到保留。但当系统内存不足时,调用onPause()或onStop()方法activity会被系统摧毁,通常我们采用重写onSaveInstanceState()方法的方式来存储临时数据,它接收一个Bundle类型的数据,将状态数据存储到Bundle对象中,这个方法在activity被杀死前调用。
如果调用onSaveInstanceState()方法,它将在onPause()或onStop()方法前调用
若向数据库中插入记录等,保存持久化数据的操作应该放在onPause()中. onSaveInstanceState()方法只适合保存瞬态数据, 比如UI控件的状态, 成员变量的值等.

public class MainActivity extends Activity {  
    private String temp;    
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        // 从savedInstanceState中恢复数据, 如果没有数据需要恢复savedInstanceState为null  
        if (savedInstanceState != null) {  
            temp = savedInstanceState.getString("temp");  
            System.out.println("onCreate: temp = " + temp);  
        }  
    }  
  
    public void onRestoreInstanceState(Bundle saveInstanceState) {  
        super.onRestoreInstanceState( saveInstanceState);  
        String temp  = saveInstanceState.getString("temp");  
        System.out.println("onResume: temp = " + temp);  
       
    }  
      
    // 将数据保存到outState对象中, 该对象会在重建activity时传递给onCreate方法和onRestoreInstanceState方法
    @Override  
    protected void onSaveInstanceState(Bundle outState) {  
        super.onSaveInstanceState(outState);  
        outState.putString("temp", temp);  
    }  

四、在Activity之间传递数据

4.1传数据给下一个活动

通过Intent.putExtra方法可以将简单数据类型或可序列化对象保存在Intent对象中,然后在另一个Activity中使用getInt、getString等方法获得这些数据。示例代码如下

Intent intent =new Intent(CurrentActivity.this,OtherActivity.class);
  // 创建一个带“收件人地址”的 email 
 Bundle bundle =new Bundle();// 创建 email 内容
 bundle.putBoolean("boolean_key", true);// 编写内容
 bundle.putString("string_key", "string_value"); 
 intent.putExtra("key", bundle);// 封装 email 
 startActivity(intent);// 启动新的 Activity

下面是获取数据:

Intent intent =getIntent();// 收取 email 
 Bundle bundle =intent.getBundleExtra("key");// 打开 email 
 bundle.getBoolean("boolean_key");// 读取内容
 bundle.getString("string_key");

如果数据比较简单的键值对,可以直接传递:

Intent intent =new Intent(EX06.this,OtherActivity.class); 
 intent.putExtra("boolean_key", true); 
 intent.putExtra("string_key", "string_value"); 
 startActivity(intent);

获取:

Intent intent=getIntent(); 
 intent.getBooleanExtra("boolean_key",false); 
 intent.getStringExtra("string_key");

4.2向上一个活动返回数据

一般来说,返回上个活动按下Back键就可以了,并没有一个用于启动的Intent来传递数据,当然,Activity中有一个 startActivityForResult()来实现这一目的
startActivityForResult()接收两个参数,intent和请求码,通过此方法来启动需要返回结果的activity,实例如下:
从Activity1跳转到Activity2:

Intent intent = new Intent();
 intent = intent.setClass(ActivityIntent.this, AnotherActivity.class);
 Bundle bundle = new Bundle();
 bundle.putString("string", et_string.getText().toString());
 intent.putExtras(bundle);
 startActivityForResult(intent,0); //只有这里不同

从Activity2返回数据到Aactivity1:

Intent intent = new Intent();
intent = intent.setClass(AnotherActivity.this, ActivityIntent.class);
Bundle bundle = new Bundle();
bundle.putInt("result", "Activity2的处理结果");
intent.putExtras(bundle); 
AnotherActivity.this.setResult(RESULT_OK, intent); //RESULT_OK是返回状态码
AnotherActivity.this.finish();

在Activity1中重写onActivityResault方法,接受数据,在Activity2销毁后会回调此方法(前提是用startActivityForResult()启动):

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                   super.onActivityResult(requestCode, resultCode, data);
                   //requestCode是传入的请求码,
                   //因为可能通过startActivityForResult()启动多个活动,每个活动的数据都回调到onActivityResault,因此通过requestCode获取到数据来源,再通过resultCode判断数据是否处理成功,最后通过data获取数据。
                   //resultCode是返回状态码,一般是RESULT_OK和RESULT_CANCELED,
                   //通过data获取到返回的数据
                    switch(resultCode) { //根据状态码,处理返回结果
                    case RESULT_OK: 
                          Bundle bundle =data.getExtras(); //获取intent里面的bundle对象
                              String result = bundle.getInt("result"); 
                    break; 
                    default:
                    break;
                    } 

             }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值