Android Activity

1. 生命周期

  1. Andriod生命周期图:


    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配置:
  <activity android:name=".SecondActivity">
    <intent-filter>
        <action android:name="com.example.activity.ACTION_SECOND" />
      <category android:name="android.intent.category.DEFAULT" />
      <category android:name="android.intent.category.MY_CATEGORY" />
    </intent-filter>
  </activity>

然后在程序中调用:

  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<Activity> activities = new ArrayList<Activity>();
    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);
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.活动是什么 Activity 活动是最容易吸引用户的地方,它是一种可以包含用户界面的组件,主要用于和用户进行交...
    随心者随心行阅读 231评论 0 0
  • Day1: 在代码中通过R.string.hello_world可以获得该字符串的引用; 在XML中通过@stri...
    冰凝雪国阅读 1,441评论 0 5
  • 作为Android的四大组件之一,活动最先走进我们的视野,其重要性不言而喻,今天就抽出时间来专门对Android活...
    loser先生阅读 909评论 0 0
  • 亲子阅读6 今天我给孩子上了一节复习课,复习我们上次去自然博物馆学到的东西,和课堂上一样要举手回答。我们大宝发言非...
    Viki和两宝共成长阅读 276评论 0 0
  • 很久没有拿起这些所谓的闲书,张爱玲是我非常喜欢的作家,她的笔锋相比三毛平易近人,显得更加刺骨。书中这种刺骨戳心的描...
    梦渊阅读 153评论 2 0