16 - Activity四种加载模式之SingleTask
2012-12-26 13:42
316 查看
转载注明出处:http://blog.csdn.net/eana_don/
资料参考:官网API
通常情况下的Activity,默认是standard模式,同一个activity不断调用也是创建不同的实例。Task用来保存Activity,以栈的形式列队,先进后出。当一个Activity启动时,就会被压入task栈。而当用户返回时,则该Activity会被弹出栈,以这种形式来达到返回之前Activity的效果。但有些情况下,这种栈的形式不满足于我们的需求。比如,一个应用程序有一个九宫格的首页。九宫格对应着一系列的功能。这些功能里面有无数个activity,但我们又希望这些功能里面可以提供直接返回首页并且关闭该功能下的所有activity。此时,我们就需要设法打破默认的堆栈的形式。打破默认形式有两种方法,一为在AndroidManifest.xml定义Activity时指定它的加载模式。一为是在用Intent开启一个Activity时,在Intent中加入标志。这里重点于前者。已有实例的情况下不会再启动新的实例,那假如同一个实例中,收到的数据发生了改变,因为没有重新oncreate,所以不会收到In'ten't,那怎么收到数据呢?这时候需要重写:onNewIntent()
Activity的四种加载模式:standard,singletop,singletask,singleinstance。standard的应用频繁,很容易被理解。所以不累赘多述。这里主要是singletask,其他的两种查看博客不同的博文。
图1
图2
activity_content.xml
资料参考:官网API
通常情况下的Activity,默认是standard模式,同一个activity不断调用也是创建不同的实例。Task用来保存Activity,以栈的形式列队,先进后出。当一个Activity启动时,就会被压入task栈。而当用户返回时,则该Activity会被弹出栈,以这种形式来达到返回之前Activity的效果。但有些情况下,这种栈的形式不满足于我们的需求。比如,一个应用程序有一个九宫格的首页。九宫格对应着一系列的功能。这些功能里面有无数个activity,但我们又希望这些功能里面可以提供直接返回首页并且关闭该功能下的所有activity。此时,我们就需要设法打破默认的堆栈的形式。打破默认形式有两种方法,一为在AndroidManifest.xml定义Activity时指定它的加载模式。一为是在用Intent开启一个Activity时,在Intent中加入标志。这里重点于前者。已有实例的情况下不会再启动新的实例,那假如同一个实例中,收到的数据发生了改变,因为没有重新oncreate,所以不会收到In'ten't,那怎么收到数据呢?这时候需要重写:onNewIntent()
Activity的四种加载模式:standard,singletop,singletask,singleinstance。standard的应用频繁,很容易被理解。所以不累赘多述。这里主要是singletask,其他的两种查看博客不同的博文。
一、原理
SingleTask即保证该模式下的Activity只有一个实例。当收到一个新的Intent时,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。并且不创建新的实例。假如A为singletask的activity,B为默认模式的activity,当A->B1->B2->B3->A时,B1,B2,B3都会被销毁。图如1。按返回时直接退出到A之前的activity。所以这种模式很适用于首页和各功能之间的关系。如图2。图1
图2
二、设置方式
<activity android:name=".SingleTaskActivityMain" android:launchMode="singleTask"></activity>只需在manifest中设置即可
三、代码示例
SingleTaskActivityMain.javapackage com.example.lunchmode; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; /** * 只创建一个实例 * 需要创建singleTask模式Activity的时候, * 系统会检查栈里面是否已经有该Activity的实例。 * 如果有直接将intent发送给它。 * 重要:task堆栈中可以有多个的activity * */ public class SingleTaskActivityMain extends Activity { private TextView tvHint = null; private Button btnNext = null; private Button btnHome = null; @Override public void onCreate(Bundle savedInstanceState) { System.out.println(" 类名:" +this.getClass().getName() +" been created!"); super.onCreate(savedInstanceState); setContentView(R.layout.activity_content); btnNext = (Button) findViewById(R.id.btn_next); btnHome = (Button) findViewById(R.id.btn_home); btnHome.setVisibility(View.GONE); tvHint = (TextView) findViewById(R.id.tv_hint); tvHint.setText(" 类名:" +this.getClass().getName()+" 地址:" +this.toString()); btnNext.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(SingleTaskActivityMain.this,StandardActivity.class); startActivity(intent); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } @Override protected void onDestroy() { // TODO Auto-generated method stub System.out.println(" 类名:" +this.getClass().getName() +" been destroyed!"); super.onDestroy(); } }
activity_content.xml
<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:orientation="vertical"> <TextView android:id="@+id/tv_hint" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="A"/> <Button android:id="@+id/btn_next" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Next" /> <Button android:id="@+id/btn_home" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Home" /> </LinearLayout>StandardActivity.java
package com.example.lunchmode; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class StandardActivity extends Activity{ private TextView tvHint = null; private Button btnNext = null; private Button btnHome = null; @Override public void onCreate(Bundle savedInstanceState) { System.out.println(" 类名:" +this.getClass().getName() +" been created!"); super.onCreate(savedInstanceState); setContentView(R.layout.activity_content); btnNext = (Button) findViewById(R.id.btn_next); btnHome = (Button) findViewById(R.id.btn_home); tvHint = (TextView) findViewById(R.id.tv_hint); tvHint.setText(" 类名:" +this.getClass().getName()+" 地址:" +this.toString()); btnNext.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(StandardActivity.this,StandardActivity.class); startActivity(intent); } }); btnHome.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(StandardActivity.this,SingleTaskActivityMain.class); startActivity(intent); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } @Override protected void onDestroy() { // TODO Auto-generated method stub System.out.println(" 类名:" +this.getClass().getName() +" been destroyed!"); super.onDestroy(); } }
四、运行结果
相关文章推荐
- Activity的四种加载模式详解(standard singleTop singleTask singleInstance)
- Activity的四种加载模式详解(standard singleTop singleTask singleInstance)
- Activity的四种加载模式详解(standard singleTop singleTask singleInstance)
- 区分Activity的四种加载模式 standard singleTop singleTask singleInstance
- 细说Activity的singleTask加载模式
- Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式。
- Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance
- Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance
- Activity的四种加载模式 -- singleTask 和 singleInstance模式
- Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式。
- 我的Android进阶之旅------>Android Activity的singleTask加载模式和onActivityResult方法之间的冲突
- Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance
- Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance
- Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance
- singleTop和singleTask的区别(附带 Activity 四种加载模式简介)
- Activity的四种加载模式 -- singleTask 和 singleInstance模式
- Activity有四种加载模式:standard(默认), singleTop, singleTask和 singleInstance
- Android Activity的singleTask加载模式和onActivityResult方法之间的冲突
- 区分Activity的四种加载模式:standard、singleTop、singleTask、singleInstance
- 15 - Activity四种加载模式之SingleTop