现在的位置: 首页 > 移动开发 > 正文

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

2019年09月20日 移动开发 ⁄ 共 14918字 ⁄ 字号 评论关闭

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

   
 }
}
------------------------------------------------------------------

抱歉!评论已关闭.