喜糖

移动开发工程师 。涉及 android、ios、jni

导航

长按HOME键的实验【原创】

Posted on 2011-09-29 23:43  喜糖  阅读(3434)  评论(0编辑  收藏  举报
  • 实验内容:

  在不同的launch模式下,点击‘home’后,再长按Home后的activity的执行顺序是不一样的。

实验代码:

public class TestActivity extends Activity {
private String TAG = "TestActivity";

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

Log.d(TAG, "onCreate"+ this.toString());
}

@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume"+ this.toString());
}

@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.d(TAG, "onNewIntent"+ this.toString());
}

public void a(View view) {
startActivity(new Intent(TestActivity.this, TestActivity.class));
}
}
  • 不同情况下实验结果:

  1。 TestActivity的launchMode的值定义为“standard”,或者不填(默认就为standard)

分析: 第一条线: 启动程序执行OnCreate和OnResume。

    第二条线: 点击按钮,执行a方法。 第一个TestActivity执行onPause,并启动新的TestActivity,执行OnCreate和OnResume。

    第三条线:点击‘home’键,执行OnPause。

    第四条线:长按“HOME”,执行OnResume。且activity为之前关闭的activity。

  2。 TestActivty的launchMode的值定义为“singleTop、singleTask,singleInstance”。下图为singleTask实例:

分析: 第一条线: 启动程序执行OnCreate和OnResume。

    第二条线:点击按钮,执行a方法。 第一个TestActivity执行onPause,并启动新的TestActivity,由于设置了launchMode,在设置的当前情况下不需要重新创建新的activity。便执行onNewIntent和OnResume。

    第三条线:点击‘home’键,执行OnPause。

    第四条线:长按“HOME”,执行onNewIntent和OnResume。且activity为之前关闭的activity。    

  • 实验结论
1。OnNewIntent方法是在创建目标Activity已经存在,无需再次创建的时候调用,代替了OnCreate方法。
2。当activity的launchMode的模式在非standard模式下,长按HOME键,是调用onNewIntent()-》OnResume()
PS:
        Intent intent = new Intent(TestActivity.this, TestActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
即使代码的Intent中加入了FLAG_ACTIVITY_NEW_TASK也不会影响前面的结论。 (即使加入了FLAG_ACTIVITY_NEW_TASK参数,仍然是在standard模式下调用onCreate方法。在非standard模式下,满足情况就只调用onNewIntent);