android:Activity启动模式之singleTask(一)

先看一下standard启动模式的说明:

仅仅有一个实例。在同一个应用程序中启动他的时候。若不存在此Activity实例。则会在当前栈顶创建一个新的实例。若存在,则会把栈中在其上的其他Activity实例销毁掉,并调用此实例的OnNewIntent方法,假设实在别的应用实例中启动它。则会新建一个栈,并在该栈中启动这个Activity,然后我在这个Activity实例中再打开新的Activity这个新的实例会在一个栈中

我们首先通过一个实例理解这句:仅仅有一个实例。在同一个应用程序中启动他的时候,若不存在此Activity实例。则会在当前栈顶创建一个新的实例。若存在,则会把栈中在其上的其他Activity实例销毁掉,并调用此实例的OnNewIntent方法

首先在手机上的效果

xml布局文件 两个button 一个用于打开MainActivity(Activity1),一个用于打开OtherActivity(Activity2)

MainActivity和OtherActivity同一时候使用这个布局文件,并为其button加入点击事件

<RelativeLayout 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=".MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="46dp"
        android:text="Activity1" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/button1"
        android:layout_marginLeft="48dp"
        android:layout_toRightOf="@+id/button1"
        android:text="Activity2" />

</RelativeLayout>

MainActivity

package com.example.singletop;

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

public class MainActivity extends Activity implements OnClickListener{
	private Button btn_open1,btn_open2;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//设置标题为Activity1
		setTitle("我是Activity1");
		btn_open1=(Button) findViewById(R.id.button1);
		btn_open2=(Button) findViewById(R.id.button2);
		btn_open1.setOnClickListener(this);
		btn_open2.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch(v.getId()){
		case R.id.button1:
			startActivity(new Intent(MainActivity.this,MainActivity.class));
			break;
		case R.id.button2:
			startActivity(new Intent(MainActivity.this,OtherActivity.class));
			break;
		}
	}
}

OtherActivity

package com.example.singletop;

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

public class OtherActivity extends Activity implements OnClickListener{
	private Button btn_open1,btn_open2;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//设置标题为Activity2
		setTitle("我是Activity2");
		btn_open1=(Button) findViewById(R.id.button1);
		btn_open2=(Button) findViewById(R.id.button2);
		btn_open1.setOnClickListener(this);
		btn_open2.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch(v.getId()){
		case R.id.button1:
			startActivity(new Intent(OtherActivity.this,MainActivity.class));
			break;
		case R.id.button2:
			startActivity(new Intent(OtherActivity.this,OtherActivity.class));
			break;
		}
	}
	//在此方法中打印是否调用这种方法的日志
	@Override
	protected void onNewIntent(Intent intent) {
		// TODO Auto-generated method stub
		super.onNewIntent(intent);
		Log.d("OtherActivity", "OnNewIntent");
	}
}

至于MainActivity和OtherActivity的差别:

MainActivity是standard启动模式

OtherActivity是singleTask启动模式

在AndroidManifest.xml中MainActivity默认就是standard启动模式

配置一下OtherActivity就好

        <activity
            android:name="com.example.singletop.OtherActivity"
            android:launchMode="singleTask"
            ></activity>

我们举个样例。

Activity1->Activity2->Activity1->Activity1->Activity2

在Activity栈中是什么样子呢?

为什么是这样呢?聪明的你肯定理解了吧?哈哈~

我们细致分析一下,当我们打开Activity1,栈中仅仅有(Activity1),当再打开Activity2栈里面为(Activity2,Activity1),再打开Activity1栈里面为(Activity1,Activity2,Activity1),再打开Activity1栈里面仍然是正常的(Activity1,Activity1,Activity2,Activity1),以下是重点了。当我们再打开Activity2时发现栈里面已经有了Activity2了,依据singleTask模式的说明(仅仅有一个实例,在同一个应用程序中启动他的时候。若不存在此Activity实例,则会在当前栈顶创建一个新的实例,若存在,则会把栈中在其上的其他Activity实例销毁掉)

此时会删除栈里面的(Activity1,Activity1)而且调用onNewIntent方法。我们查看一下日志文件

的确调用了一次OnNewIntent方法。仅仅须要按两次返回键就能返回到主界面了。

聪明的你理解了吧?至于下半句的分析请看下篇文章

时间: 2024-10-29 19:07:44

android:Activity启动模式之singleTask(一)的相关文章

Android Activity启动模式

在Android的联机文档中,有对Activity的简单介绍,现在通过编写代码对Activity的启动模式做一个深入的理解.在配置文件AndroidManifest.xml中,activity元素的android:launchMode属性用来配置对应Activity的启动模式,目前有以下四种启动模式:1.standard2.singleTop3.singleTask4.singleInstance如果不对Activity设置启动模式,默认就是standard模式 一.standard 请看以下代

AndroidのActivity启动模式

Activity启动模式      .概念    Activity启动模式定义了Activity启动的规则,它决定着Activity的实例创建与重用与否    .属性   Activity的启动模式在menifest.xml中的<activity>标签中设置,属性为launchMode    .分类     Activity的启动模式分为四类: standard . singleTop . singleTask . singleInstance     .备注   Android采用Task来

完全理解android Activity启动模式LauchMode (深入Activity与任务栈)

之前笔者已经讲过了LauchMode的作用,以及尽量避开栈的概念使用GIF图片的方式尽可能简单地阐述了一下Activity的启动模式,这篇文章就再次深入,好好讲一下在各种启动模式下,Activity与任务栈到底是如何作用的. 如果还是刚入门的读者,建议还是先看一下笔者的前一篇文章. 上一篇文章地址:http://blog.csdn.net/double2hao/article/details/50929431 任务栈:(笔者此处就复制一下官方文档中的解释) 如果对任务栈有深入了解兴趣的,可以看一

activity启动模式之singleTask

singleTask 的启动模式,网上的资料说的如下 这种方式启动的Activity总是属于一个任务的根Activity,也就是说,如果这个任务不存在,那么会创建一个新的task,然后创建实例,放到这个task最底层 如果这个实例已经存在,那么它会把这个实例上层的所有其他activity实例去掉,使得它成为这个task的顶层实例.但是,我们看下我们的验证 关键代码如下 1.manifest.xml <application android:allowBackup="true" a

(原创)Activity启动模式之singleTask

android中activity有四种启动模式 standard(默认):在同一个任务栈中可以有重复的activity,基本没什么限制 singleTop:只有当此activity在栈顶时,去创建它,不会有新的activity生成,而是调用onNewInstance()方法 singleTask:在栈中只有一个activity实例,回调onNewInstance(),会把它之上的activity都finish()掉 singleInstance:会在新的任务栈中创建 设置启动模式在Android

Android Activity启动模式的功能验证

之前一直都是看别人写的启动模式,发现网上大多数的内容都是抄袭来抄袭去,直到最近看了开发艺术这本书,发现之前对启动模式的理解过于简单,很多东西都没有考虑到,为了加深理解,于是决定自己动手去验证一下四个启动模式.当然我们也从最简单的启动模式开始验证. 为了打印方便,定义一个基础Activity,在其onCreate方法和onNewIntent方法中打印出当前Activity的日志信息,主要包括所属的task,当前类的hashcode,以及taskAffinity的值.之后我们进行测试的Activit

android activity 启动模式

韩梦飞沙  韩亚飞  [email protected]  yue31313  han_meng_fei_sha 1,标准的, 2,单个 顶部 3,单个 任务 4,单个 实例 标准的 就是 每启动一次这个 活动, 都会 在栈 中新建一个 活动对象. 什么是 栈,  栈 是 先进后出的一种 数据结构. 活动对象的存储 是 栈 结构存储的. 单个顶部 是  每次启动这个活动, 如果这个栈里面 最后那个已经是 这个活动, 就直接让它呈现出来,如果不是,就新建. 栈顶 就是 最后进入的那个位置. 栈顶

activity启动模式笔记

activity启动模式的逻辑主要在startActivityUncheckedLocked()函数中,现在来看下这个函数. final int startActivityUncheckedLocked(ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, boolean doRe

Android多任务切换与Activity启动模式SingleTask之间关系的分析

这里会以多个场景列子进行分析,在分析之前先了解一下基本的概念. Task任务:一系列Activity的集合,这些Activity以栈的形式进行排列(后进先出). 那在什么时候系统会新建一个Task任务呢? 这个要以app来区分(注意,这里看Activity是否属于同一报名),当一个app以singleTask启动方式启动另外一个app的activity时,会新建一个Task任务,而第二个app的Activity会成为这个栈中的根. 反之,在什么时候不会创建新任务呢?当一个app以非SingleT