全面解析Android应用开发中Activity类的用法

2019-12-10 18:55:24于海丽

4.singleInstance 模式
在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。

五、Activity现场保存状态
一般来说,调用onPause()和onStop()方法后的activity实例仍然存在于内存中,activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会得到保留。但是当系统内存不足时, 调用onPause()和onStop()方法后的activity可能会被系统摧毁, 此时内存中就不会存有该activity的实例对象了. 如果之后这个activity重新回到前台, 之前所作的改变就会消失.可以在activity被杀掉之前调用保存每个实例的状态,开发者可以覆写onSaveInstanceState()方法. onSaveInstanceState()方法接受一个Bundle类型的参数, 开发者可以将状态数据存储到这个Bundle对象中,以保证该状态在onCreate(Bundle)或者onRestoreInstanceState(Bundle)(传入的Bundle参数是由onSaveInstanceState封装好的)中恢复。这个方法在一个activity被杀死前调用,当该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); 
  }