下面是Demo
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_first); button= (Button) findViewById(R.id.button); Log.i("Demo","FirstActivity"); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent=new Intent(FirstActivity.this,FirstActivity.class); startActivity(intent); } }); } 上述代码中,在onCreate方法中添加了一个按钮,并且添加了监听事件,点击按钮会打开一个新的FirstActivity,每创建出一个新的FirstActivity都会打印出Log日志。下面是点击了两次button打印出来的日志。第一条是Demo创建时打印出来的,后两条都是点击了两次button打印出来的,如果你尝试运行这些代码你会发现,在AVD中你需要点三次后退键才能退出App。这就跟明确了,证明栈中确实有三个一样的Activity。 解释图: singleTop模式:singleTop和standard的区别是,如果你要创建的Activity已经处于栈顶那么就不会去再创建这个Activity的实例。 更改AndroidManifest.xml的Activity标签 <activity android:name=".FirstActivity" android:launchMode="singleTop" > 现在已经把这个Activity的启动模式更改成singleTop,再次运行上述代码时,无论你点击多少次button,Log日志都不会打印出“FirstActivity”。 解释图: singTask模式:singTask和singTop有一点不同,singTop是如果要创建的Activity与栈顶Activity重复将不再创建,singTask是如果发现整个栈中有重复的Activity都不将再创建,直接调用已存在的实例,并且把该Activity上所有的Activity全部出栈;如果没有发现重复的Activity将会自动创建。 更改AndroidManifest.xml的Activity标签 <activity android:name=".FirstActivity" android:launchMode="singleTask" > FirstActivity protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_first); button= (Button) findViewById(R.id.button); Log.i("Demo","FirstActivity"); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent=new Intent(FirstActivity.this,SecondActivity.class); startActivity(intent); } });
}
SecondActiviy protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); button= (Button) findViewById(R.id.button2); Log.i("Demo","SecondActivity"); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent=new Intent(SecondActivity.this,FirstActivity.class); startActivity(intent); } }); } 在FirstActivity中点击button跳转到SecondActivity中,再从SecondActivity中点击button跳转到FirstActivity中,再从FirstActivity中点击button跳转到SecondActivity中。 在Log日志中可以观察到singleTask的特性了,程序运行创建FirstActivity,跳转到SecondActivity创建了SecondActivity,再次点击按钮返回FirstActivity时,系统发现栈中存在FirstActivity的实例,所以就直接切换到的FirstActivity而没有创建FirstActivity实例,并且把FirstActivity之上的SecondActivity销毁了(如果不懂栈的原理可以百度一下)。 singleInstance模式:singleInstance与其他三种大不同,如果某个Activity使用singleInstance模式,那么这个Activity启动时会启用一个新的栈来保存自己。 更改AndroidManifest.xml的Activity标签 <activity android:name=".SecondActivity" android:launchMode="singleInstance" > FirstActivity protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_first); button= (Button) findViewById(R.id.button); Log.i("Demo","FirstActivity"+getTaskId()); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent=new Intent(FirstActivity.this,SecondActivity.class); startActivity(intent); } });
}
SecondActivity protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); button= (Button) findViewById(R.id.button2); Log.i("Demo","SecondActivity"+getTaskId()); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent=new Intent(SecondActivity.this,ThirdActivity.class); startActivity(intent); } });
}
ThirdActivity protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_third); button= (Button) findViewById(R.id.button3); Log.i("Demo","ThirdActivity"+getTaskId()); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent=new Intent(ThirdActivity.this,FirstActivity.class); startActivity(intent); } }); } FirstActivity启动SecondActivity,SecondActivity启动ThirdActivity,下面是打印的Log日志。 在onCreate方法中打印出来了每个实例所在栈的ID,通过此我们可以看出,Activity设置了android:launchMode="singleInstance"属性的Activity会在其他栈中启动。 感谢阅读 本文参考郭霖大神的书籍《第一行代码Android(第2版)》 (不是copy)
