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

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:30
05-28 02:32:34.942 3066-3066/com.example.njumzc.activitytest D/FirstActivity: Task id is:31
 
    
可见,确实启动了两个不一样的Task。
 
    
以上就是Activity的四种启动方式的解读。











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值