Android 启动模式

来源:互联网 发布:unity3d工程师笔试题 编辑:程序博客网 时间:2024/06/18 18:16

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属性来选择启动模式。

<activityandroid: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> <activityandroid:name="com.example.android_818_singletask.FourActivity"           android:launchMode="singleInstance"></activity>
0 0