您的位置:首页 > 移动开发 > Android开发

Activity中四大启动模式

2016-04-06 13:49 344 查看
在AndroidManifest.xml中 ,有一个默认的activity 在它里面可以设置activity启动模式, android:launchMode=" " ,该属性用于配置Activity的加载模式,该属性支持4中属性 每不同的模式出现不同的效果,下面详解启动模式。

standard:标准模式,默认加载模式

singleTop:Task顶单例模式

singleTask:Task内单例模式

singleInstance:全局单单例模式

standard 和singleTop的区别在于

button.setOnClickListener(new OnClickListener() { 

            @Override 

            public void onClick(View v) { 

                Intent intent = new Intent(); 

                intent.setClass(MainActivity.this, MainActivity.class); 

                startActivity(intent); 

            } 

        });

如果点击此button singleTop模式只会产生一个实例,因为android:launchMode="singleTop"  的时候activity处于栈顶。standard会产生多个实例(要看button点击的次数)。

如果更改为MainActivity.this, SecondActivity.class则会产生两个实例,  

singleTask

       singleTask模式 使用本模式可以很好的解决重复创建栈顶活动的问题,当活动的启动模式指定为singleTask,每次启动该

活动时系统首先会在Task栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把这个活动之上的活动统统出栈

在MainActivity中加入 singleTask模式

     在SecondActivity中启动MainActivity时会发现栈中已经存在一个MainActivity实例了,并且在SecondActivity的下面,

于是SecondActivity会从返回栈中出栈,而MainActivity重新成了栈顶活动,因此MainActivity的onRestart()方法和

SecondActivity的onDestroy()方法得以执行。这时你只用点击一次返回按钮就能退出程序了。当你把singleTask去掉的时候,就会发现此时需要按三下才能退出程序,

是因为secondActivity跳转到MainActivity的时候有新产生了一个MainActivity实例,此时并没有调用onStart()方法和destroy()方法。

singleInstance

      android:launchMode="singleInstance"这个模式不同于以上三种模式,指定为singleInstance模式的活动会启用一个新的返回栈来管理这个活动

这个栈是可以共享的, 在本模式下会产生一个单独的返回栈来管理这个共享的活动,无论哪个应用程序来访问这个活动,都共用同一个返回栈,也就解决了共享活动实例的问题

package com.example.pc.androidtoptest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.example.androidtoptest.R;

public class MainActivity extends Activity {
private Button btnButton;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // 生命周期方法
// Log.d("MainActivity", this.toString());
Log.d("MainActivity", "Task id is" + getTaskId());
super.setContentView(R.layout.activity_main); // 设置要使用的布局管理器
btnButton = (Button) findViewById(R.id.btn);
btnButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}

@Override
protected void onRestart() {
super.onRestart();
Log.d("MainActivity", "onRestart");
}

}


package com.example.pc.androidtoptest;

/**
* Created by pc on 2016/4/18.
*/

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.example.androidtoptest.R;

public class SecondActivity extends Activity {
private Button button;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // 生命周期方法
// Log.d("SecondActivity", this.toString());
Log.d("SecondActivity", "Task id is"+getTaskId());
super.setContentView(R.layout.second); // 设置要使用的布局管理器
button = (Button) findViewById(R.id.btn2);
button.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
Intent intent = new Intent(SecondActivity.this, ThirdActivity.class);// 跳到MainActivity
startActivity(intent);

}
});
}

@Override
protected void onDestroy() {
super.onDestroy();
Log.d("SecondActivity", "onDestroy");
}
}


package com.example.pc.androidtoptest;

/**
* Created by pc on 2016/4/18.
*/
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

import com.example.androidtoptest.R;

public class ThirdActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // 生命周期方法
Log.d("ThirdActivity","Task id is"+getTaskId());
super.setContentView(R.layout.third); // 设置要使用的布局管理器
}
}


<LinearLayout 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"
tools:context="com.example.androidtoptest.MainActivity"
android:orientation="vertical"
android:padding="10dp"
>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />

<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="button"
/>

</LinearLayout>

<LinearLayout 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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.androidtoptest.MainActivity" >

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />

<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="button2"
/>

</LinearLayout>


<LinearLayout 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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.androidtoptest.MainActivity" >

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />

<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="button3"
/>

</LinearLayout>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 实例