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

android学习笔记---34_Activity的启动模式

2013-04-10 22:29 441 查看
2013-04-04

-------------

34_Activity的启动模式

---------------------------------------------------------

前沿:

a.在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在

Android中 Activity的启动模式决定了Activity的启动运行方式。

b.Activity启动模式设置:

<activity android:name=".MainActivity" android:launchMode="standard" />

c.

Activity的四种启动模式:

d.standard

模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。

.

e.singleTop

如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(

即使 栈中已经存在该Activity实例只要不在栈顶,都会创建实例)。

f.singleTask

如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让

该实例回 到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中



g.singleInstance

在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式

的Activity 的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个

应用程序共享一个应用 不管谁激活该Activity都会进入同一个应用中。

-------------------------------------------------------------

1.注意:任务栈就是一个存放对象的类

--------------------------------

2.可以在清单文件中:/lanchModal/AndroidManifest.xml定义,activity的启动模式

<activity

android:label="@string/app_name"

android:name=".LanchModalActivity"

android:launchMode="standard"

//标准模式每次激活这个activity,都会新建一个activity的实例.

>

---------------------------------------------------------------

2.下面是测试standard模式的,代码:

--------------------------------

a./lanchModal/src/com/credream/lanchmodel/LanchModalActivity.java

package com.credream.lanchmodel;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.TextView;

public class LanchModalActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

TextView textView= (TextView) this.findViewById(R.id.textView);

textView.setText(this.toString());

}

public void openStandardActivity(View v){

startActivity(new Intent(this,LanchModalActivity.class));

}

}

----------------------------------------------------------------------------

b./lanchModal/res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello"

android:id="@+id/textView" />

<Button

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/standard"

android:onClick="openStandardActivity"

/>

</LinearLayout>

--------------------------------------------------------

c./lanchModal/res/values/strings.xml

<?xml version="1.0" encoding="utf-8"?>

<resources>

<string name="hello">Hello World, LanchModalActivity!</string>

<string name="app_name">LanchModal</string>

<string name="standard">激活标准模式standardActivity</string>

</resources>

----------------------------------------------------------------------

d./lanchModal/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.credream.lanchmodel"

android:versionCode="1"

android:versionName="1.0" >

<uses-sdk android:minSdkVersion="8" />

<application

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

>

<activity

android:label="@string/app_name"

android:name=".LanchModalActivity"

android:launchMode="standard"

>

<intent-filter >

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

</application>

</manifest>

---------------------------------------------------------------------------------------

3.可以看到已经建了一个Activity,点击按钮可以看到又建了一个activity,他们的

在任务栈中的实例是不同的,因为打印出的地址不同,当关掉一个activity的时候

会返回到原先的任务栈中的上一个Activity

---------------------------------------

4.下面是执行结果:

@43e09e30

@43e3b0f8

@43e415f8

xiamctivity,当关闭@43e415f8这个activity的时候会返回到@43e3b0f8

这个activity,依次类推,当关掉最后一个的时候,任务栈里的activity对象就清空了.

-------------------------------------------------------------

5.下面说singleTop模式

singleTask模式:比如当栈中已经有了该实例那么,会把这个实例移到栈顶,也就是在该实例上面的所有实例将会被

移除:

当前栈中有:

activity1

activity2

activity3

那么当activity4的启动模式为singleTask的时候,当栈中有activity4实例,那么启动activity4的时

候,activity3,2,1都会

被移除.

--------------------------------------------------

6.通过测试结果可以看到,当在LanchModalActivity中点击按钮后,弹出singleTaskActivity这个窗口,这时候

SingleTaskActivity是通过SingleTask模式启动的,那么在singleTaskActivity中有一个按钮回到

LanchModalActivity,

当点击了这个按钮后因为LanchModalActivity启动模式是standard,所以会创建一个新的LanchModalActivity实例

在新的LanchModalActivity中有个按钮点击启动singleTaskActivity,点击后,他会自动的把在栈顶的新的

LanchModalActivity实例清除,然后重用原先的singleTaskActivity.

流程图:

LanchModalActivity1--->singleTaskActivity-->LanchModalActivity2-->singleTaskActivity

注意,重用的时候会调用onNewIntent方法也就是>singleTaskActivity中的onNewIntent方法

-----------------------------------------------------------------------------------------

7.分析singleInstance模式:

a.比如:

浏览器应用,浏览器应用启动很慢是因为:

当一个应用需要调用浏览器的时候会调用浏览器的Activity,那么如果有很多应用需要调用浏览器的Activity的



就会创建很多浏览器Activity,但是如果应用了singleInstance模式启动浏览器Activity,那么每次其他应用调



这个浏览器Activity都是重用的同一个.所以就提高了性能.提高了速度

-----------------------------------------------------------------------------------------------------

8.a.测试singleInstance模式,先部署以singleInstance模式启动的SingleInstanceActivity,所在的应用:

并且记下SingleInstanceActivity的内存中的实例地址:@43e09fb0

b.然后启动lanchModal应用,然后点击启动SingleInstance模式Activity,记下显示的SingleInstanceActivity对

应的内存

实例的地址为:@43e09fb0,可以看出前后的地址是一样的.

c.然后再部署openSingleInstanceActivity项目,点击打开SingleInstanceActivity,看以看到显示的

SingleInstanceActivity的内存实例的地址为:@43e09fb0,也是一样的

d.从上面可以看到,其他应用在调用SingleInstanceActivity时,且SingleInstanceActivity的模式为

SingleInstance的时候,实际上调用的都是同一个SingleInstanceActivity实例

-------------------------------------------------------------------------------------

1.下面是启动模式的所有测试代码:

/lanchModal/src/com/credream/lanchmodel/LanchModalActivity.java

package com.credream.lanchmodel;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.TextView;

public class LanchModalActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

TextView textView= (TextView) this.findViewById(R.id.textView);

textView.setText(this.toString());

}

public void openStandardActivity(View v){

startActivity(new Intent(this,LanchModalActivity.class));

}

public void openSingleTopActivity(View v){

startActivity(new Intent(this,SingleTopActivity.class));

}

public void openSingleTaskActivity(View v){

startActivity(new Intent(this, SingleTaskActivity.class));

}

//用于测试SingleIntance模式,测试其他应用打开openSingleIntanceActivity的时候都是同一个实例

//打开其他应用中的activity,可以用下面的方法,用意图来实现

public void openSingleIntanceActivity(View v){

Intent intent = new Intent();

intent.setClassName

("com.credream.singleInstance","com.credream.singleInstance.SingleInstanceActivity");

startActivity(intent);

}

}

-----------------------------------------------------------------------------

2./lanchModal/src/com/credream/lanchmodel/SingleTaskActivity.java

------------------------------

package com.credream.lanchmodel;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.TextView;

public class SingleTaskActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.singletask);

TextView textView = (TextView) this.findViewById(R.id.singeltaskView);

textView.setText(this.toString());

}

public void openMainActivity(View v){

startActivity(new Intent(this, LanchModalActivity.class));

}

}

------------------------------------------------------------------

3./lanchModal/src/com/credream/lanchmodel/SingleTopActivity.java

package com.credream.lanchmodel;

import java.util.Date;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.TextView;

import android.widget.Toast;

public class SingleTopActivity extends Activity

{

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.singletop);

TextView textView=(TextView) this.findViewById(R.id.singletopView);

textView.setText(this.toString());

}

public void openSingleTopActivity(View v){

startActivity(new Intent(this,SingleTopActivity.class));

}

//当为singleTop模式的时候,那么

// /*singleTop

// 如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使

// 栈中已经存在该Activity实例只要不在栈顶,都会创建实例)。创建实例的时候会调用onNewIntent方法

//这样测试的时候,每次点击的时候都会打印出当前系统的时间.

@Override

protected void onNewIntent(Intent intent)

{

Toast.makeText(this, new Date().toString(),1).show();

super.onNewIntent(intent);

}

}

------------------------------------------------------------------------

3./lanchModal/res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello"

android:id="@+id/textView" />

<Button

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/standard"

android:onClick="openStandardActivity"

/>

<Button

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/singleTop"

android:onClick="openSingleTopActivity"

/>

<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/singletask"

android:onClick="openSingleTaskActivity"

/>

<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/singleintance"

android:onClick="openSingleIntanceActivity"

/>

</LinearLayout>

--------------------------------------------------------------

4./lanchModal/res/layout/singletask.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello"

android:id="@+id/singeltaskView"

/>

<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/singletask"

android:onClick="openMainActivity"

/>

</LinearLayout>

-------------------------------------------------------

5./lanchModal/res/layout/singletop.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello"

android:id="@+id/singletopView" />

<Button

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/singleTop"

android:onClick="openSingleTopActivity"

/>

</LinearLayout>

----------------------------------------------------------

6./lanchModal/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.credream.lanchmodel"

android:versionCode="1"

android:versionName="1.0" >

<uses-sdk android:minSdkVersion="8" />

<application

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

>

<activity

android:label="@string/app_name"

android:name=".LanchModalActivity"

android:launchMode="standard"

>

<intent-filter >

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

<activity

android:label="@string/singleToptitle"

android:name=".SingleTopActivity"

android:launchMode="singleTop"

>

</activity>

<activity android:name=".SingleTaskActivity" android:label="@string/singletasktitle"

android:launchMode="singleTask"

></activity>

</application>

</manifest>

--------------------------------------------------------------------

7.通过下面这个项目结合上面的那个android项目进行测试,当多个应用访问一个应用的singleInstance模式的

Activity的时候只建立一个实例,访问一个实例

-----------------------------------------------------

a.新建android项目:openSingleInstanceActivity

-------------------------------------------------

b./openSingleInstanceActivity/src/com/credream/singleInstanceActivity/OpenSingleInstanceActivityActiv

ity.java

-----------------

package com.credream.singleInstanceActivity;

import android.app.Activity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

public class OpenSingleInstanceActivityActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

//用于测试SingleIntance模式,测试其他应用打开openSingleIntanceActivity的时候都是同一个实例

public void openSingleIntanceActivity(View v){

Intent intent = new Intent();

intent.setClassName("com.credream.singleInstance",

"com.credream.singleInstance.SingleInstanceActivity");

startActivity(intent);

}

}

-----------------------------------------------------------

c./openSingleInstanceActivity/res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical" >

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/hello" />

<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="打开SingleInstanceActivity"

android:onClick="openSingleIntanceActivity"

/>

</LinearLayout>

-------------------------------------------------------

新建android项目SingleInstance用来测试当多个应用访问一个应用的singleInstance模式的

Activity的时候只建立一个实例,访问一个实例.也就是说,当上一个项目和这一个项目都访问singleInstance模式

Activity的时候,这时候只会创建一个activity实例.

5./SingleInstance/src/com/credream/singleInstance/SingleInstanceActivity.java

--------------------------------------------

package com.credream.singleInstance;

import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;

public class SingleInstanceActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

TextView textView = (TextView) this.findViewById(R.id.textView);

textView.setText(this.toString());

}

}

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