Activity启动模式详解(二)--->singleTask

来源:互联网 发布:如何做淘宝分销商 编辑:程序博客网 时间:2024/05/16 23:46

MainActivity如下:

package cc.testlaunchmode2;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import android.app.Activity;import android.content.Intent;/** * Demo描述: * Activity加载模式详解 * 在该Demo中主要讨论singleTask *  * 技术描述: * Activity有四种加载模式--> * 1 standard: 标准(默认)模式 *   当通过这种模式来启动Activity时,Android总会为目标 *   Activity创建一个新的实例,并将该Activity添加到当前 *   Task栈中.注意,这种方式不会启动新的Task,只是将新的 *   Activity添加到原有的Task *    * 2 singleTop: Task顶单例模式 *   该模式和standard模式基本一致,但有一点不同:当将要被 *   启动的Activity已经位于Task栈顶时,系统不会重新创建 *   目标Activity实例,而是直接复用Task栈顶的Activity *    * 3 singleTask: Task内单例模式 *   采用该加载模式时,Activity在同一个Task内只有一个实例. *   当系统采用singleTask模式加载Activity时,又分为以下 *   三种情况: *   (1)如果将要启动的Activity不存在,那么系统将会创建该 *      实例,并将其加入Task栈顶 *   (2)如果将要启动的Activity已存在,且存在栈顶,那么此时 *      与singleTop模式的行为相同 *   (3)如果将要启动的Activity存在但是没有位于栈顶,那么 *      此时系统会把位于该Activity上面的所有其他Activity *      全部移出Task,从而使得该目标Activity位于栈顶 *       * 4 singleInstance: 全局单例模式 *   在此种加载模式下,无论从哪个Task中启动目标Activity,只会 *   创建一个目标Activity实例且会用一个全新的Task栈来装载该 *   Activity实例. *   当系统采用singleInstance模式加载Activity时,又分为以下 *   两种情况: *   (1)如果将要启动的Activity不存在,那么系统将会先创建一个 *      全新的Task,再创建目标Activity实例并将该Activity实例 *      放入此全新的Task中 *   (2)如果将要启动的Activity已存在,那么无论它位于哪个应用 *      程序,哪个Task中;系统都会把该Activity所在的Task转到 *      前台,从而使该Activity显示出来 *  * Android对于Activity的管理方式--> * Android采用Task来管理多个Activity. * 当启动一个APP时,Android就会为之创建一个Task * 然后启动这个应用的入口Activity. * 但是Android并没有为Task提供API,开发者无法真正 * 地访问Task,只能调用Activity的getTaskId()方法来 * 获取其所在的Task的ID.事实上,我们可以把Task理解成 * Activity栈,Task以栈的形式来管理Activity:将不断启 * 动的Activity压入栈.即:先启动的Activity被放入栈底, * 后启动的Activity放在Task栈顶 *  * 测试步骤及解释: * 1 进入MainActivity,点击按钮进入AnotherActivity. * 2 此时在AnotherActivity界面.目前在Task栈中有两个 *   Activity.由下至上为:MainActivity-->AnotherActivity * 3 在AnotherActivity界面点击按钮,系统以标准模式 *   再次加载一个MainActivity * 4 此时在MainActivity界面.目前在Task栈中有三个Activity. *   由下至上为:MainActivity-->AnotherActivity-->MainActivity * 5 此时在MainActivity界面,再点击按钮准备进入AnotherActivity *   系统将以singleTask模式再次加载AnotherActivity.正因为 *   是以singleTask模式加载,所以会清除AnotherActivity上部 *   的所有Activity. * 6 此时在AnotherActivity界面.目前在Task栈中有两个 *   Activity.由下至上为:MainActivity-->AnotherActivity *   这就和第二步的状态一致了 *  * 备注说明: * 注意配置文件 * android:launchMode="standard" * android:name="cc.testlaunchmode2.MainActivity" * ............................................... * android:launchMode="singleTask" * android:name="cc.testlaunchmode2.AnotherActivity" *  * 参考资料: * Android疯狂讲义(第二版) * Thank you very much */public class MainActivity extends Activity {private Button mButton;    private TextView mTextView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);init();}    private void init(){mTextView=(TextView) findViewById(R.id.textView);mTextView.setText("当前Activity:"+"\n"+this.toString()+"\n"+"当前TaskId:"+this.getTaskId());mButton=(Button) findViewById(R.id.button);mButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {Intent intent=new Intent(MainActivity.this, AnotherActivity.class);startActivity(intent);}});}}


AnotherActivity如下:

package cc.testlaunchmode2;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import android.app.Activity;import android.content.Intent;public class AnotherActivity extends Activity {private Button mButton;    private TextView mTextView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.another);init();}    private void init(){mTextView=(TextView) findViewById(R.id.textView);mTextView.setText("当前Activity:"+"\n"+this.toString()+"\n"+"当前TaskId:"+this.getTaskId());mButton=(Button) findViewById(R.id.button);mButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {Intent intent=new Intent(AnotherActivity.this, MainActivity.class);startActivity(intent);}});}}


main.xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"   >    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="Activity加载模式详解"         android:layout_centerHorizontal="true"    />        <Button        android:id="@+id/button"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="以singleTask方式启动AnotherActivity"         android:layout_centerHorizontal="true"        android:layout_marginTop="100dip"        />        <TextView        android:id="@+id/textView"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerInParent="true"     /></RelativeLayout>


another.xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"   >    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="Activity加载模式详解"         android:layout_centerHorizontal="true"    />        <Button        android:id="@+id/button"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="以standard方式启动MainActivity"         android:layout_centerHorizontal="true"        android:layout_marginTop="100dip"        />        <TextView        android:id="@+id/textView"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerInParent="true"     /></RelativeLayout>


AndroidManifest.xml如下:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="cc.testlaunchmode2"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="14"        android:targetSdkVersion="14" />    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:launchMode="standard"            android:name="cc.testlaunchmode2.MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>                <activity              android:launchMode="singleTask"            android:name="cc.testlaunchmode2.AnotherActivity">        </activity>    </application></manifest>