Android 启动模式

1Task与BackStack的概念

在Android中通过任务(Task)来管理活动,Task就是一些列活动的集合。每个应用程序运行都会对应创建一个Task,android通过BackStack来管理Task。
Task的活动按启动的先后顺序,依次保存到BackStack中,每个Task都有自己对应的id号(非R文件中),可以通过getTaskId()方法获得。
每当新建一个活动时,该活动就会在BackStack中入栈,并且处于栈顶位置。当按下back建或者finish活动时,这个活动就会出栈,这时下一个活动就会处于栈顶位置。

2在AndroidManifes文件中配置Activity的启动模式

Activity的启动模式对我们来说是一个新的概念,在实际开发过程中会给一些Activity设定恰当的启动模式来实现特定的需求。
启动模式一共分为四种,分别为:standard、singleTop、singleTask和singleInstance,可在AndroidManifest.xml中通过给标签指定android:launchMode属性来选择启动模式。

<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="standard">

3 standard启动模式
Standard叫做标准启动模式,是活动启动的默认模式,即使不在指定该模式的情况下,活动都还是会以该模式启动。在standard模式下的活动,不管活动是否存在每次启动都会新建这个活动。

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("Tag", "MainActivityonCreate"+getTaskId());
        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, MainActivity.class));
            }
        });
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
          Log.d("Tag", "MainActivityonDestroy");
    }
}

4singleTop启动模式
SingleTop:共享栈顶模式,
在启动这一类活动时,系统会先检测当前 Task,看该 Task 的栈顶是不是
该活动的实例,如果是的话,就不需要再创建该活动实例
但是这个启动模式只针对栈顶元素。

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("Tag", "onCreate"+getTaskId());
        setContentView(R.layout.activity_main);
        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this,MainActivity.class));
            }
        });
    }
}

AndroidManifest.xml

<activity
            android:name="com.example.android_818_singletop.MainActivity"
            android:label="@string/app_name" 
            android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

5 singleTask启动模式
SingleTask 又叫共享栈,每次启动该活动时系统会首先在BackStack中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。SingleTask适合作为程序入口点。例如程序主界面

<activity
            android:name="com.example.android_818_singletask.MainActivity"
            android:label="@string/app_name"
            android:launchMode="singleTask" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("Tag", "MainActivity_onCreate"+getTaskId());
        findViewById(R.id.btn1).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, SecondActivity.class));
            }
        });
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("Tag", "MainActivity_onDestroy"+getTaskId());
    }
}

secondActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("Tag", "MainActivity_onCreate"+getTaskId());
        findViewById(R.id.btn1).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, SecondActivity.class));
            }
        });
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("Tag", "MainActivity_onDestroy"+getTaskId());
    }
}

ThirdActivity.java

public class ThirdActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_three);
        Log.d("Tag", "ThirdActivity_onCreate"+getTaskId());
        findViewById(R.id.btn3).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(ThirdActivity.this, MainActivity.class));
            }
        });
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("Tag", "ThirdActivity_onDestroy"+getTaskId());
    }
}

6.singleInstance启动模式(共享引用)
SingleInstance模式是这四种模式中最为特殊的,指定为singleInstance模式的活动启动时,会用一个新的BackStack来管理该活动。

<activity android:name="com.example.android_818_singletask.SecondActivity"
           android:launchMode="singleInstance"></activity>
<activity android:name="com.example.android_818_singletask.ThirdActivity">
</activity>
 <activity
android:name="com.example.android_818_singletask.FourActivity"
           android:launchMode="singleInstance">
</activity>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值