当前位置: 首页 > 科技观察

Activity启动模式(launchMode)详解

时间:2023-03-14 00:20:04 科技观察

Activity有四种启动模式,standard、singleTop、singleTask、singleInstance。1.standardstandard是Activity默认的启动模式,所有的activity在没有显示规范的情况下都会自动使用这种启动模式。每次在栈顶启动一个新的Activity。android:launchMode="standard",此时每次点击按钮都会创建一个新的Activity现在我们写一个简单的按钮实现跳转ActivityprivateButtonbutton;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.e("MainActivity",this.toString());button=(Button)findViewById(R.id.button);button.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){Intentintent=newIntent(MainActivity.this,MainActivity.class);startActivity(intent);}});}虽然重定向的页面是一样的,但是TaskActivity创建中每次点击按钮都会创建一个新的Activity日志启动示例图2.singleTop当Activity的启动方式为singleTop时,当启动的Activity已经在Activity栈顶时,直接使用。android:launchMode="singleTop"我们创建NextActivity,在MainActivity中添加button2privateButtonbutton1,button2;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.e("MainActivity",this.toString());button1=(Button)findViewById(R.id.button1);button2=(Button)findViewById(R.id.button2);button1.setOnClickListener(this);button2.setOnClickListener(this);}@OverridepublicvoidonClick(Viewview){switch(view.getId()){caseR.id.button1:Intentintent=newIntent(MainActivity.this,MainActivity.class);startActivity(intent);break;caseR.id.button2:Intentintent2=newIntent(this,NextActivity.class);startActivity(intent2);break;}}此时如果在MainActivity中启动MainActivity,Activity栈只会被创建一次;但是如果先启动NextActivity,再启动MainActivity,则会创建一个新的MainActivity。因为此时Activity栈顶是NextActivityMainActivity->MainActivity->MainActivityMainActivity->NextActivity->MainActivity启动示例图3.Activity启动方式为s时的singleTask在singleTask的情况下,在启动Activity的时候,会检查它是否已经存在于栈中。如果存在,则该activity之上的所有Activity都会被弹出栈。堆栈来管理活动。无论哪个应用程序访问该活动,都共享同一个堆栈,这使得其他程序可以调用和共享该活动。android:launchMode="singleInstance"启动示例图图中的启动过程是:Main->New->Next这个过程很容易理解返回过程是:Next->Main->New很明显顺序是不一样,为什么?如果发生这种情况怎么办?NextActivity和MainActivity在同一个栈中。当我们返回时,NextActivity从堆栈中弹出。这时MainActivity还存在于栈A中,并且在栈顶,所以会看到MainActivity。当MainActivity返回时,A栈会被清空,然后我们会在B栈中看到NewActivity。之后NewActivity弹出栈,当B栈也为空时,App退出。Activity的启动方式就简单介绍到这里,希望对大家有所帮助,如有不足或错误请指正。以后每周至少有一篇文章更新这个系列。有兴趣的可以关注一下。一起学习,一起进步。