[Android学习之路]-Activity的启动方式

来源:互联网 发布:矩阵diag是什么意思 编辑:程序博客网 时间:2024/05/17 09:11

Activity的四种启动方式

在项目中,我们需要根据不同的需求为每个活动指定恰当的启动模式。启动模式一共有四种,分别是standard,singleTop,singleTask和singleInstance。接下来对每种启动模式进行详细的解读。
在此之前,先说明使用的代码。在项目中创建两个EmptyActivity,分别命名为FirstActivity和SecondActivity。两个活动的layout文件如下:
first_layout.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="match_parent"    android:layout_height="match_parent">    <Button        android:id="@+id/button_1"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="Button 1"        /></LinearLayout>
second_layout.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical" android:layout_width="match_parent"    android:layout_height="match_parent">    <Button        android:id="@+id/button_2"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="Button 2"        /></LinearLayout>

1.standard模式

standard模式是活动默认的启动模式,如果我们没有显示地指定,那么所有活动都会自动使用这种启动模式。
在该模式下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶位置。系统在创建这一类活动时,不会考虑这个活动是否已经存在于返回栈中,每次都会创建一个新的实例。
现在我们修改FirstActivity的onCreate方法如下:
 @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Log.d("FirstActivity",this.toString());        setContentView(R.layout.first_layout);        Button button1 = (Button) findViewById(R.id.button_1);        button1.setOnClickListener(new View.OnClickListener(){            @Override            public void onClick(View v){                Intent intent = new Intent(FirstActivity.this,FirstActivity.class);                startActivity(intent);            }        });    }
即每次点击按钮都会启动一个FirstActivity,并且在启动的时候打印这个活动的序列号字符串。
运行结果如下:

05-28 01:57:25.685 2581-2581/com.example.njumzc.activitytest D/FirstActivity: com.example.njumzc.activitytest.FirstActivity@90845d0
05-28 01:57:48.313 2581-2581/com.example.njumzc.activitytest D/FirstActivity: com.example.njumzc.activitytest.FirstActivity@a4a31fb
05-28 01:58:18.529 2581-2581/com.example.njumzc.activitytest D/FirstActivity: com.example.njumzc.activitytest.FirstActivity@9236392

可见,每一次启动都会创建一个新的活动。

2.singleTop模式

显然,standard每一次启动都会创建一个新的活动在很多情况下并不合理,会使系统创建大量相同的活动。在上例中,我们要启动的活动明明已经在栈顶了,却创建了一个新的活动。在这种情况下,使用singleTop模式就可以让系统在启动活动时对返回栈的栈顶进行检查,如果栈顶就是需要启动的活动,那么系统会直接使用它,而不会创建新的实例。

现在,修改AndroidManifes.xml文件中FirstActivity的启动模式,如下:
 <activity            android:name=".FirstActivity"            android:label="This is first activity."            android:launchMode="singleTop">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter> </activity>
再次运行程序,点击按钮,会发现不论点击多少次,logcat中都不会有新的创建信息出现。


3.singleTask模式

使用singleTop模式可以避免重复创建栈顶活动,但是,如果该活动没有处于栈顶位置,还是可能会创建多个活动的实例。为了让返回栈中只存在活动的一个实例,我们可以使用singleTask启动模式。在此模式下启动活动时,系统首先会检查在返回栈中是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有则会创建一个新的实例。
现在,修改FirstActivity的启动模式为singleTask
<activity            android:name=".FirstActivity"            android:label="This is first activity."            android:launchMode="singleTask">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter></activity>
修改FirstActivity,添加onRestart()方法:
    @Override    protected void onRestart() {        super.onRestart();        Log.d("FirstActivity", "onRestart ");    }
修改Intent语句:
@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Log.d("FirstActivity",this.toString());        setContentView(R.layout.first_layout);        Button button1 = (Button) findViewById(R.id.button_1);        button1.setOnClickListener(new View.OnClickListener(){            @Override            public void onClick(View v){                Intent intent = new Intent(FirstActivity.this,SecoondActivity.class);                startActivity(intent);            }        });    }


修改SecondActivity的onCreate()方法:
@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.second_layout);        Button button2 = (Button) findViewById(R.id.button_2);        button2.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent = new Intent(SecoondActivity.this,FirstActivity.class);                startActivity(intent);            }        });    }
添加onDestroy()方法:
    @Override    protected void onDestroy() {        super.onDestroy();        Log.d("SecondActivity", "onDestroy");    }
启动程序,先进入FirstActivity,点击按钮,进入SecondActivity,再点击按钮,发现logcat记录如下:

05-28 02:20:37.662 25139-25139/com.example.njumzc.activitytest D/FirstActivity: onRestart 
05-28 02:20:38.088 25139-25139/com.example.njumzc.activitytest D/SecondActivity: onDestroy

4.singleInstance模式

singleInstance在启动活动的时候会启用一个新的返回栈来管理这个活动,不管哪个应用程序来访问这个活动,都共用的同一个返回栈,通过这中方式可以解决不同程序中共享活动实例的问题。
现在,对代码进行如下修改:
修改SecondActivity启动模式:
<activity android:name=".SecoondActivity"            android:label="This is second activity."            android:launchMode="singleInstance">            <intent-filter>            </intent-filter>        </activity></application>
修改两个活动的代码,打印taskId:
 @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Log.d("FirstActivity","Task id is:"+getTaskId());        setContentView(R.layout.first_layout);        Button button1 = (Button) findViewById(R.id.button_1);        button1.setOnClickListener(new View.OnClickListener(){            @Override            public void onClick(View v){                Intent intent = new Intent(FirstActivity.this,SecoondActivity.class);                startActivity(intent);            }        });    }
运行程序,点击按钮,结果如下:
05-28 02:32:31.241 3066-3066/com.example.njumzc.activitytest D/FirstActivity: Task id is:3005-28 02:32:34.942 3066-3066/com.example.njumzc.activitytest D/FirstActivity: Task id is:31
可见,确实启动了两个不一样的Task。
以上就是Activity的四种启动方式的解读。










原创粉丝点击