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

Android中Activity启动方式详解

时间:2023-03-16 12:16:48 科技观察

在Android中,每个界面都是一个Activity,切换界面的操作其实就是多个不同Activity之间的实例化操作。Android中Activity的启动方式决定了Activity的启动和运行方式。Android总Activity的启动模式分为四种:Activity启动模式设置:Activity的四种启动模式:1.标准模式启动模式,每次激活Activity时,都会创建Activity并放入任务栈中。2.singleTop如果任务栈顶有Activity的实例,就会重用该实例,否则会创建一个新的实例放到栈顶(即使Activity实例已经存在于栈,只要不在栈顶,就会创建实例)。3.如果singleTask在栈中已经有一个Activity的实例,它会重用这个实例(会调用实例的onNewIntent())。当重用时,该实例将返回到栈顶,因此它上面的实例将从栈中移除。如果堆栈中不存在该实例,则会创建一个新实例并将其放入堆栈。4、singleInstance在一个新的栈中创建Activity实例,允许多个应用共享栈中的Activity实例。一旦改变模式的Activity的实例存在于某个栈中,任何应用程序在激活改变的Activity时都会重用栈中的实例。效果相当于多个应用共享一个应用,无论谁激活了Activity,都会进入同一个inapplication。standard其中standard是系统的默认启动模式。下面的例子演示了标准的运行机制:privateTextViewtext_show;privateButtonbtn_mode;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);text_show=(TextView)this.findViewById(R.id.text_show);text_show.setText(this.toString());btn_mode=(Button)this.findViewById(R.id.btn_mode);}    //按钮点击事件publicvoidLaunchStandard(Viewv){startActivity(newIntent(this,MainActivity.class));text_show.setText(this.toString());}初始化界面如下:当点击按钮时,会创建一个新的Activity,通过后面十六进制数的显示可以看出TextView@,点击两个子界面如下:至此,我们分析一下栈的内部运行机制:(从栈顶开始依次)因此,这种Standard模式每次都会新建一个Activity对象,当点击后退按钮时,它会移动顶部栈的(CurrentActivity)被销毁,然后跳转到下一层。比如当前的Activity是44ed8c50,那么当我们点击返回的时候,这个Activity就会变成44f28a48,但是这个时候,当我们在这个Activity中再次点击按钮创建对象的时候,就会创建另外一个新的Activity对象,这种模式在大多数情况下可能不是我们所需要的,因为对系统性能的消耗太大。下面我们介绍两种可以使用当前栈顶Activity的启动方式:singleTop从上面的解释我们可以知道,每次使用新的Activity时,都会自动检测当前栈顶Activity是否是一个需要引用的活动。然后直接引用这个Activity,不用新建Activity。我们刚才在界面中添加了一个“启动单机模式”按钮。单击时,将出现我们创建的单板。Activity单顶中有一个按钮,可以启动单顶模式,也就是启动当前Activity。由于我们在manifest文件中配置Activity的启动方式为singleTop,所以此时不??会创建而是使用栈顶的singleTopActivity:界面初始化:点击“启动singleTop模式”按钮:   我们分析一下它的运行机制,可以看到当程序运行到这一步的时候,栈中的数据形式为:当我们在上面界面的“singleTop模式”按钮中点击“启动”时,由于这个Activity设置的启动模式是singleTop,所以会先检查当前栈顶是否是这个Activity我们要请求的对象。验证通过后不会创建新的Activity,而是引用当前的Activity。堆栈顶部的Activity。虽然不会创建新的Activity对象,但是每次都会调用onNewIntent()方法:@OverrideprotectedvoidonNewIntent(Intentintent){//TODOAuto-generatedmethodstubsuper.onNewIntent(intent);Toast.makeText(this,newDate().toString(),1).show();}我们为这个方法写代码输出当前日期,每次点击上面的按钮都会输出当前日期。singleTask启动方式和singleTop的区别从名字就可以看出来,就是singleTop每次只检测栈顶的Activity是否是我们需要请求创建的,而singleTask会检测栈顶的所有Activity对象stack,从上到下,如果检测到是我们请求的,Activity对象上面的对象就会被销毁,检测到的我们需要的Activity会直接设置到栈顶。我们创建一个SingleTaskActivity,这个界面包含了一个启动MainActivity和启动SingleTaskActivity的按钮。初始化:点击“StartsingleTaskmode”按钮:点击该界面第二个按钮“StartsingleTaskmode”按钮,根据定义,会检测当前栈中是否有Activity对象,所以当前Activity还在显示且不会重启Create;然后单击“启动标准模式”按钮。由于MainActivity的启动方式是标准的,所以这里会重新创建一个MainActivity对象:此时栈中的数据格式为:当在上面界面点击“StartSingleTaskMode”按钮时,由于检测到当前栈中第二个Activity就是我们要创建的Activity,最上面的MainActivity会被淘汰,然后SingleTaskActivity会被设置为栈顶:SingleInstance这种启动方式类似于我们使用的浏览器的工作原理,众所周知,在多个程序中访问浏览器时,如果当前浏览器没有打开,则打开浏览器,否则,在当前打开的浏览器中访问。这种模式会节省大量的系统资源,因为它可以保证当前栈中只有一个要请求的Activity对象存在。以上就是Android中的四种启动方式,我们在开发Android项目时经常会用到。巧妙地设置Activity的启动方式将节省系统开销和程序运行效率。