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模式的活动会启用一个新的返回栈来管理这个活动
这个栈是可以共享的, 在本模式下会产生一个单独的返回栈来管理这个共享的活动,无论哪个应用程序来访问这个活动,都共用同一个返回栈,也就解决了共享活动实例的问题
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>
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories