Android的Activity的四种加载模式解析

一.在android中有几种启动Activity的模式?

standard(默认):每次都会新建。(每个Task都可以有,且可以有多个实例)。

singleTop:当前实例如果在栈顶,就不可以新建实例。(每个Task都可以有,且可以有多个实例,在栈顶的时候可以复    用)

singleTask:新建一个Task,如果有其它Task包含此实例,就直接调用那个Task。(只存在一个Task中)

singleInstance:新建一个Task,且该Task中只有其一个实例。(只存在一个Task中,且此Task中只有此一个实例)


其次有必要先解释下Task这个概念:Task就是栈的意思,一个android应用的创建,则创建了一个Task,当每创建一个activity的时候,就将activity压入Task中。

设置的位置在AndroidManifest.xml文件中activity元素的android:launchMode属性:


接下来以Demo的形式分别解释这四种模式:

standard:

再次我们定义一个类A,通过A->A,再返回的形式来展现。

package com.android.douf;

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.LinearLayout; 
import android.widget.TextView;

public class LaunchModeActivity_A extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        TextView textView = new TextView(this); 
        textView.setText(this + ""); 
        Button button = new Button(this); 
        button.setText("go:"); 
        button.setOnClickListener(new OnClickListener() { 
            @Override 
            public void onClick(View v) { 
                Intent intent = new Intent(); 
                intent.setClass(LaunchModeActivity_A.this, LaunchModeActivity_A.class); 
                startActivity(intent); 
            } 
        }); 
        LinearLayout layout = new LinearLayout(this); 
        layout.setOrientation(LinearLayout.VERTICAL); 
        layout.addView(textView); 
        layout.addView(button); 
        this.setContentView(layout); 
    } 
}

通过结果我们可以看见当不断点击按钮生成的是不同的对象实例。再点击返回按钮的时候,返回上一个对象实例。


其实这就相当于一个压栈的过程。


singleTop:其实singleTop和standard的区别就在于其创建的实例是否在栈顶。

此时我们将刚才那个Demo的launchMode改成standard。

此时发现不管点击多少次按钮,都是同一个实例。且当按back健的时候,退出程序了。原因很简单,因为类LaunchModeActivity_A是在栈顶


singleTask:

定义A类跳转到B类,再定义一个B类跳转到A类。其中设置A类的启动方式为:singleTask。B类的启动方式为:standard。

A类:

package com.android.douf;

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.LinearLayout; 
import android.widget.TextView;

public class LaunchModeActivity_A extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        TextView textView = new TextView(this); 
        textView.setText(this + ""); 
        Button button = new Button(this); 
        button.setText("go:"); 
        button.setOnClickListener(new OnClickListener() { 
            @Override 
            public void onClick(View v) { 
                Intent intent = new Intent(); 
                intent.setClass(LaunchModeActivity_A.this, LaunchModeActivity_B.class); 
                startActivity(intent); 
            } 
        }); 
        LinearLayout layout = new LinearLayout(this); 
        layout.setOrientation(LinearLayout.VERTICAL); 
        layout.addView(textView); 
        layout.addView(button); 
        this.setContentView(layout); 
    } 
}

B类:

package com.android.douf;

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.LinearLayout;

public class LaunchModeActivity_B extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
         Button button=new Button(this); 
            button.setText("go actA"); 
            button.setOnClickListener(new OnClickListener() { 
                @Override 
                public void onClick(View v) { 
                    Intent intent=new Intent(); 
                    intent.setClass(LaunchModeActivity_B.this, LaunchModeActivity_A.class); 
                    startActivity(intent); 
                } 
            }); 
            LinearLayout layout=new LinearLayout(this); 
            layout.addView(button); 
            this.setContentView(layout); 
    } 
}

结果会发现A跳转到B,创建了一个新的实例,当B再跳转到A时,仍然是刚才的实例。因为启动A的方式是singleTask。A中包含了此实例,所以当再次启动的时候intent会直接传递给这个已创建的实例对象。


singleInstance:在这个模式之下,activity独享一个Task,此时一个Task只有一个activity。

仍然使用上面的A和B类,将A类的启动模式改为standard,把B的启动模式改为singleInstance。

当点击跳转A到B,再从B跳转到A,然后back的时候,一般情况下应该是跳到B界面,但是这次全是A界面,并且当B

跳转到A得时候创建一个新的实例在另一个Task中,并非同一个Task,结果如下图:








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值