Android Activity

1. 生命周期

  1. Andriod生命周期图:


    Android Activity_第1张图片
    Andriod生命周期
  2. saveInstanceState:
    活动进入停止状态时,有可能会被回收(如:内存不足)。 如果活动A是个输入表格,用户在A的基础上启动了B,如果A在后台被杀死,那么会退到A时,会发现原先填写的内容全没了,这时候就是saveInstanceState发挥作用的时候了:
  // 进行数据报错
  @Override
  protected void OnSaveInstanceState(Budle outState){
    super.OnSaveInstanceState(outState);
    String tempData = "****";
    outState.putString("data_key", tempData);
  }

  // 进程重新启动时
  @Override
  protected void onCreate(Budle saveInstanceState){
    if(saveInstanceState != null){
      String tempData = saveInstanceState.getString("data_key"); // ****
    }
  }

2. Intent:Activity间的跳转

  1. 显示Intent:
  Intent intent = new Intent(FirstActivity.this, SecondActivity.this);
  StartActivity(intent)
  1. 隐私Intent
    首先在AndroidManfiest.xml配置:
  
    
        
      
      
    
  

然后在程序中调用:

  Intent intent = new Intent("com.example.activity.ACTION_SECOND" );
  intent.addCategory("android.intent.category.MY_CATEGORY"); //如果不是默认的category,需要显示设置,同事Manfiest文件中需要指定 
  StartActivity(intent);
  1. 其他intent
  // 调用电话
  Intent intent = new Intent(Intent.ACTION_DIAL);
  intent.setData(Uri.parse("tel:10086"));
  StartActivity(intent);
  1. Activity间数据传递
  // firstActivity
  Intent intent = new Intent(FirstActivity.this, SecondActivity.this);
  intent.putExtra("name", "狐尼克");
  StartActivity(intent)

  // secondActivity
  String name = intent.getStringExtra("name") ; // 狐尼克
  1. 逆向传递数据
   // firstActivity
  Intent intent = new Intent(FirstActivity.this, SecondActivity.this);
  StartActivityForResult(intent);
  ...
  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data){
  if(requestCode == RESULT_OK){
    String data = data.getStringExtra("name");
  }
}

  // secondActivity
  @Override
public void onBackPressed(){
  Intent intent = new Intent();
  intent.putExtra("name", " 狐尼克");
  setResult(RESULT_OK, intent);
  finish();
}

3. Activity的启动模式

  1. standard
    每次激活Activity时(startActivity),都创建Activity实例,并放入任务栈
  2. singleTop
    如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建;其余情况都要创建Activity实例;
  3. singleTask
    如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,并把该Activity以上的Activity实例都pop;
  4. singleInstance
    如果应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例;
    参考:Android入门:Activity四种启动模式

4. 最佳实践

  1. 获知当前是哪一个活动
  @Override
  protected void onCreate(Bundle savedInstanceState){
    ....
    Log.d(getClass().getSimpleName());
  }
  1. 随时随地退出程序
    如果程序停留在第三个Activity,此时想退出程序的话,需要三次Back键。需要提供一个方法,按键一次就可退出程序。
  // 提供一个ActivityController类
  public class ActivityController{
    public Static List activities = new ArrayList();
    public Static void add(Activity activity){
      activities.add(activity);
    }
    public Static void remove(Activity activity){
      activities.remove(activity);
    }
    public Static void finishAll(){
      for (Activity activity : activities){
        if(!activity.isFinishing()){
            activity.finish();
          }
      }
    }
  }
 // 普通的Activity里进行函数调用
 @Override
  protected void onCreate(Bundle savedInstanceState){
    ....
    ActivityController.add(this);

    ...setOnClickListener(...{
      ActivityController.finishAll();
    })
  }

 @Override
  protected void onDestroy(Bundle savedInstanceState){
    ....
    ActivityController.remove(this);
  }
  1. 活动启动的最佳写法
  public static void actionStart(Context context, String data1, String data2){
  Intent intent = new Intent(context, SecondActivity.class);
  intent.putExtra("param1", data1);
  intent.putExtra("param2", data2);
  context.startActivity(intent);
}

你可能感兴趣的:(Android Activity)