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());
}
}
------------------------------------------------------------------