Android:Activity的启动模式

xiaoxiao2021-02-27  252

  Activity一共有四种启动模式,在开发过程中根据自己的需求选择合适的启动模式。这四种模式分别是:standard、singleTop、singleTask、singleInstance。   Activity默认的启动方式是standard,如果你想改变某个Activity的启动模式你可以在AndroidManifest.xml的Activity标签中,指定android:launchMode=""属性来修改Activity的启动方式。Android是用栈来管理Activity的,而栈的规则是“先进后出”。   standard模式:Activity默认的启动方式,每打开一个Activity都会放进栈中,最新启动的Activity会出现在栈顶,并且即使你打开许多一样的Activity它依然会进栈中。

下面是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)   
转载请注明原文地址: https://www.6miu.com/read-10335.html

最新回复(0)