Activity

本文介绍了Android中Activity的切换方式,包括使用Intent和Bundle传递数据。讲解了如何在Activity间接收返回结果,以及在Activity销毁后如何保留数据,提到了SharedPreferences作为数据存储的解决方案。

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

一、生命周期
onCreate创建与onDestroy销毁;onStart可见与onStop不可见;onResume可编辑(即焦点)与onPause;这6个方法是相对应的,那么就只剩下一个onRestart方法了,这个方法在什么时候调用呢?答案就是:在Activity被onStop后,但是没有被onDestroy,在再次启动此Activity时就调用onRestart(而不再调用onCreate)方法;如果被onDestroy了,则是调用onCreate方法
 1) onCreate(bundle ):  当第一次创建或者被destroy之后需要调用该方法(布局文件,为按钮绑定监听器等)
 2) onStart(): 当Activity可以被用户看见的时候调用
 3) onResume():当Activity可以被操作的时候调用
 4) onPause():当启动另外一个Activity时就会调用第一个Activity的onPause()(失去焦点,不可编辑)--保存现场数据
 5) onStop():当一个Activity完全被另外一个Activity覆盖时被调用
 6) onRestart():当调用onStop()但没调用onDestroy()方法时
 7) onDestroy():Activity从Task栈中弹出(返回按钮)或者调用finish()

二、当从一个Activity跳转到另一个Activity时如下图:
   1、activity创建时调用onCreate、onStart、onResume;
    2、关闭activity时调用:onPause、onStop、onDestroy;
    3、最小化activity时调用:onPause、onStop;
    4、最小后重新打时调用:onRestart、onStart、onResume;

       横竖屏切换(F11),Activity重新创建。若想使Activity不重建,有以下两种方法:
fn+ctrl+f11 切换模拟器横竖屏后, Activity的onCreate方法会从新走一次, 可以通过清单文件配置,Activity强制显示竖屏

<activity
    android:name=".activity.AntiVirusActivity"
    android:screenOrientation="portrait" />

或者, 可以显示横屏, 通过此配置可以不重新创建Activity
<activity
    android:name=".activity.AntiVirusActivity"
    android:configChanges="orientation|screenSize|keyboardHidden" />

  

三、 Activity的四种状态
1)Active:同一时刻只能有一个活动的Activity存在,其他的都处于其它三种状态
2)Paused:使用Toast、AlterDialog、接听电话等事件,会使当前Active 的Activity处于背景画面,但依然可见,保存所有信 息,但在内存极低时会被kill
3)Stopped:被其他的Activity完全覆盖,如按home键,此时Activity被隐藏不可见,保存所有成员状态和信息,长按home键会显示,内存需要时会被kill
4)Dead:未启动,手动终止,系统回收。需重启恢复状态和信息

四、 Activity间的切换实现和数据传递以及上一Activity 返回结果的获取和处理
  (1)首先是Activity的简单跳转:

  Activity的切换一般是通过Intent来实现的,Intent是一个Activity到达另一个Activity的引路者,它描述了起点(当前Activity)和终点(目标Activity)。一个简单Intent实现如下:         

  1. Intent intent = new Intent();                           //创建一个Intent对象   
  2. intent.setClass(activity1.this, activity2.class);   //描述起点和目标   
  3. startActivity(intent);                                     //开始跳转  
        

(2)通常,我们在Activity的切换中,希望把前一个Activity的某些数据传递给下一个Activity。这时,我们可以借助Bundle来实现。Bundle,相当于数据存储包,用于存放我们想要转达的数据。打个比方,Intent就像一封邮件,里面有送信人地址(原始Activity),也有收信人地址(目标Activity),而Bundle就是附件也可看做是信件内容。下面是它的简单实现:

     a、Activity1发送:   

  1. Intent intent = new Intent();   
  2. intent.setClass(activity1.this, activity2.class);   //描述起点和目标   
  3. Bundle bundle = new Bundle();                           //创建Bundle对象   
  4. bundle.putString("something""Activity1发来的数据");     //装入数据   
  5. intent.putExtras(bundle);                                //把Bundle塞入Intent里面   
  6. startActivity(intent);                                     //开始切换  
    b、Activity2接受从Activity1发来的数据:
  1. Intent intent = this.getIntent();        //获取已有的intent对象   
  2. Bundle bundle = intent.getExtras();    //获取intent里面的bundle对象   
  3. string = bundle.getString("something");    //获取Bundle里面的字符串  

(3)解决了如何传递数据问题,那么下一个问题是如何接受从目标Activity返回的处理结果。这里有两种方式,一是在onRestart方法(onRestrart表示重启Activity时激发的事件,具体看上一篇的生命周期)里面接受处理结果,方法实现和Activity2接受从Activity1发来的数据处理一样。另一种方式,是采用应答模式切换。这里,主要下第二种方式。应答模式切换和普通的切换不同在于,普通的是有去没回,应答则是有来有往。代码实现也不一样:1、从Activity1切换到Activity2:startActivityForResult(intent,0);2、从Activity2返回到Activity1:setResult(RESULT_OK, intent)。3、接受返回结果:protected void onActivityResult()。具体代码如下;

    a、从Activity1切换到Activity2:          

  1. Intent intent = new Intent();   
  2. intent = intent.setClass(ActivityIntent.this, AnotherActivity.class);   
  3. Bundle bundle = new Bundle();   
  4. bundle.putString("string", et_string.getText().toString());   
  5. intent.putExtras(bundle);   
  6. startActivityForResult(intent,0);       //只有这里不同   
  7.  //ActivityIntent.this.finish();  //不能用finish,会触发onDestroy();   

     b、从Activity2返回到Activity1:

  1. Intent intent = new Intent();   
  2. intent = intent.setClass(AnotherActivity.this, ActivityIntent.class);   
  3. Bundle bundle = new Bundle();   
  4. bundle.putInt("result""Activity2的处理结果");   
  5. intent.putExtras(bundle);       
  6. AnotherActivity.this.setResult(RESULT_OK, intent);   //RESULT_OK是返回状态码   
  7. AnotherActivity.this.finish(); //会触发onDestroy();   

     c、Activity1接受Activity2的返回结果:         

  1. protected void onActivityResult(int requestCode, int resultCode, Intent data) {   
  2.                    super.onActivityResult(requestCode, resultCode, data);   
  3.                     switch(resultCode) { //根据状态码,处理返回结果   
  4.                     case RESULT_OK:    
  5.                           Bundle bundle =data.getExtras();   //获取intent里面的bundle对象   
  6.                               String result = bundle.getInt("result");    
  7.                     break;      
  8.                     default:   
  9.                     break;   
  10.                     }        
  11.   
  12.              }  

                      

 (4)、从Activity2中返回到Activity1(在Activity1切换到Activity2时,调用了finish方法),你会发现你在Activity1以前的数据全没了,简单的说就是数据被没有保留下来。因为finish方法,会触发onDestroy(),使得Activity1销毁。下一次再来到Activity1时,是全新的Activity1,以往的数据当然不在。如果想保留切换前的状态,可以采用两种方式:1、切换时,不调用finish()方法。2、采用SharedPreferences来保存数据。SharedPreferences 是一个轻量级存储类,主要用于保存一些窗体的状态,如文本框值、按钮状态等等,类似于Session。一般在onPause()方法里面保存数据,在onResume()里面提取数据。实现如下:

         a、保存数据          

  1. //暂停:onStart()->onResume()->onPause()   
  2.     @Override      
  3.     protected void onPause() {         
  4.         super.onPause();   
  5.         Log.e("Lifecycle_Activity1""onPause()");   
  6.            
  7.         //把数据保存到类似于Session之类的存储集合里面   
  8.         SharedPreferences.Editor saveData = getPreferences(0).edit();   
  9.         saveData.putString("value", et_string.getText().toString());   
  10.         saveData.commit();   
  11.     }  

    b、提取数据         

  1. //重启:onStart()->onResume()   
  2.     @Override      
  3.     protected void onResume() {        
  4.         super.onResume();   
  5.         Log.e("Lifecycle_Activity1""onResume()");   
  6.            
  7.         //从共享数据存储对象中获取所需的数据   
  8.         SharedPreferences getData = getPreferences(0);   
  9.         String value = getData.getString("value"null);   
  10.         if(value != null) {   
  11.             et_string.setText(value);   
  12.         }   
  13.     }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值