Android学习第三篇——LaunchMode

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/F_Felix/article/details/50986141


首先我们来了解一下Acitvity的四种启动模式


Android之Activity的四种启动模式

(原文地址http://www.cnblogs.com/allenzheng/archive/2013/04/28/3050065.html)

当应用运行起来后就会开启一条线程,线程中会运行一个任务栈,当Activity实例创建后就会放入任务栈中。Activity启动模式的设置在AndroidManifest.xml文件中,通过配置Activity的属性android:launchMode=""设置

 

1. Standard模式(默认)

我们平时直接创建的Activity都是这种模式的Activity,这种模式的Activity的特点是:只要你创建了Activity实例,一旦激活该Activity,则会向任务栈中加入新创建的实例,退出Activity则会在任务栈中销毁该实例。

 

2. SingleTop模式

这种模式会考虑当前要激活的Activity实例在任务栈中是否正处于栈顶,如果处于栈顶则无需重新创建新的实例,会重用已存在的实例,否则会在任务栈中创建新的实例。

扫描二维码关注公众号,回复: 5817265 查看本文章

 

3. SingleTask模式

如果任务栈中存在该模式的Activity实例,则把栈中该实例以上的Activity实例全部移除,调用该实例的newInstance()方法重用该Activity,使该实例处於栈顶位置,否则就重新创建一个新的Activity实例。

 

4. SingleInstance模式

当该模式Activity实例在任务栈中创建后,只要该实例还在任务栈中,即只要激活的是该类型的Activity,都会通过调用实例的newInstance()方法重用该Activity,此时使用的都是同一个Activity实例,它都会处于任务栈的栈顶。此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的Activity


接下来是自己的一些练习

我们来看一下布局,这里有两个布局文件分别为main_aty1.xml 和 b_aty.xml这两个

这两个中的布局是完全相同的。代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    

    <TextView 
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <Button 
        android:id="@+id/btnStart"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启动MainActivity"/>
    <Button 
        android:id="@+id/btnBAtry"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="启动BAty"/>
    
</LinearLayout>


我们来看一下Activity文件,同样的有两个Activity文件(MainActivity 和 BAty)

这两个中的代码差别不大

MainActicity.java

tv=(TextView) findViewById(R.id.tv);
		
		tv.setText(String.format("TaskID:%d\n current ActivityId:%s", getTaskId(),toString()));
		
		findViewById(R.id.btnStart).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				startActivity(new Intent(MainActivity.this,MainActivity.class));
			}
		});
		
		findViewById(R.id.btnBAtry).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				startActivity(new Intent(MainActivity.this,BAty.class));
			}
		});


BAty.java

tv=(TextView) findViewById(R.id.tv);

		tv.setText(String.format("TaskID:%d\n current ActivityId:%s", getTaskId(),toString()));
		
findViewById(R.id.btnStart).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				startActivity(new Intent(BAty.this,MainActivity.class));
			}
		});
		
		findViewById(R.id.btnBAtry).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				startActivity(new Intent(BAty.this,BAty.class));
			}
		});


上面两个修改的也就是Intent里的Content参数。




我们现在已经把代码完成了,接下来我们来讲一下使用这个代码怎么实现上述四种启动模式,以及启动模式实现的效果。

在默认情况下的启动模式是android:launchMode="standard" (注:这句代码需要写在AndroidManifest文件中德Activity标签中,因为这是Activity的的启动模式),在这种模式下,我们可以点击界面上的按钮,任意的启动Activity,也就是说,在任务栈中会创建任意多个Activity,并且是创建在同一个任务栈中,我们可以通过界面上的TaskID显示的Int型数字看出来,这就是任务栈的Id。


现在我们把启动模式设置成android:launchMode="singleTop",我们在这里只是把MainActivity设置了该属性,也就是说,当我们点击“启动MainActivity”这个按钮的时候会触发singleTop这个,通俗的讲就是,点击该按钮是不会启动MainActivity的,不会启动自身,因为任务栈里只有自己这一个Activity,没有别的Activity了,我们点击后退按钮就会直接退出该程序。


接着我们设置启动模式android:launchMode="singleTask",我先描述一下过程,当启动页面的时候我们是在MainActivity上,首先点击“启动BAty”按钮,我们会跳转到BAty页面,这个过程中,我们会在同一个Id的任务栈中先后创建MainActivity和BAty这两个,当我们再次点击“启动MainActivity”按钮,这时任务栈会把BAty弹出栈,并且启动MainActivity,这时任务栈中只有 一个Activity,所以当我们点击后退按钮就会直接推出该程序。


最后我们来设置启动模式android:launchMode="singleInstance",首先我们在MainActivity上,点击“启动BAty”按钮后,跳转到BAty上去,但是我们需要注意一点,就是TaskId这两个是不同的,也就是说,这时候会创建两个任务栈,并且在两个任务栈中分别创建一个Activity。此时如果我们点击后退按钮,我们会先结束一个Activity,再点击一下,我们就会直接退出该应用程序。


实验的时候,只需修改AndroidManifest中的android:launchMode=“”这个属性就可以了。



猜你喜欢

转载自blog.csdn.net/F_Felix/article/details/50986141