• Android中Activity的四大启动模式实验简述


    作为Android四大组件之一,Activity可以说是最基本也是最常见的组件,它提供了一个显示界面,从而实现与用户的交互,作为初学者,必须熟练掌握。今天我们就来通过实验演示,来帮助大家理解Activity的四大启动模式。

    演示效果如下:

    第一步:实验前准备,相关配置文件以及Activity的建立

    (1)AndroidMainfest.xml配置文件

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     3     package="com.example.administrator.intentflags">
     4     <application
     5         android:allowBackup="true"
     6         android:icon="@mipmap/ic_launcher"
     7         android:label="@string/app_name"
     8         android:supportsRtl="true"
     9         android:theme="@style/AppTheme">
    10         <activity android:name=".MainActivity">
    11             <intent-filter>
    12                 <action android:name="android.intent.action.MAIN" />
    13 
    14                 <category android:name="android.intent.category.LAUNCHER" />
    15             </intent-filter>
    16         </activity>
    17         //另外两个activity
    18         <activity android:name=".Main2Activity"> </activity>
    19         <activity android:name=".Main3Activity"></activity>
    20     </application>
    21 </manifest>

    (2)layout中三个activity的三个布局文件activity_main.xml(这里演示一个,其余两个只是下面TextView文字不一样)

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout
     3     xmlns:android="http://schemas.android.com/apk/res/android"
     4     xmlns:tools="http://schemas.android.com/tools"
     5     android:id="@+id/activity_main"
     6     android:layout_width="match_parent"
     7     android:layout_height="match_parent"
     8     android:orientation="vertical"
     9     tools:context="com.example.administrator.intentflags.MainActivity">
    10     <Button
    11         android:text="第一个页面"
    12         android:layout_width="match_parent"
    13         android:layout_height="wrap_content"
    14         android:onClick="click1" />
    15     <Button
    16         android:text="第二个页面"
    17         android:layout_width="match_parent"
    18         android:layout_height="wrap_content"
    19         android:onClick="click2" />
    20     <Button
    21         android:text="第三个页面"
    22         android:layout_width="match_parent"
    23         android:layout_height="wrap_content"
    24         android:onClick="click3" />
    25     <TextView
    26         android:layout_width="match_parent"
    27         android:layout_height="match_parent"
    28         //其余两个仅文字不一样
    29         android:text="第一个页面"
    30         android:textSize="50sp"/>
    31 </LinearLayout>

    (3)java中三个activity的实现代码MainActivity.java(仅演示一个,其他两个完全相同)

     1 import android.content.Intent;
     2 import android.support.v7.app.AppCompatActivity;
     3 import android.os.Bundle;
     4 import android.util.Log;
     5 import android.view.View;
     6 /**
     7  * Created by panchengjia on 2016/12/14.
     8  */
     9 public class MainActivity extends AppCompatActivity {
    10 
    11     @Override
    12     protected void onCreate(Bundle savedInstanceState) {
    13         super.onCreate(savedInstanceState);
    14         //其他两个界面此处引用各自对应的layout文件
    15         setContentView(R.layout.activity_main);
    16     }
    17     public void click1(View view){
    18         Intent intent = new Intent(this,MainActivity.class);
    19         startActivity(intent);
    20         //记录Taskid用于实验说明
    21         Log.i("Tag","页面一taskId:"+getTaskId());
    22     }
    23     public void click2(View view){
    24         Intent intent = new Intent(this,Main2Activity.class);
    25         startActivity(intent);
    26         Log.i("Tag","页面二taskId:"+getTaskId());
    27     }
    28     public void click3(View view){
    29         Intent intent = new Intent(this,Main3Activity.class);
    30         startActivity(intent);
    31         Log.i("Tag","页面三taskId:"+getTaskId());
    32     }
    33 }

    第二步:standard默认(标准)模式下的演示实验

    默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。

    我们的操作结果如下图:

    log图如下(未记录回退log):

    通过分析操作图以及log,得出这种Standard模式是每次都会创建新的Activity对象,当点击返回按钮时,他会将栈顶(当前Activity)消灭,然后跳 到下一层,这种模式可能大多数情况下不是我们需要的,因为对系统性能的消耗过大。

    第三步:singleTop模式下的演示实验(设置页面二为singleTop)

    在当前任务栈中,判断栈顶是否为当前的Activity,如果是,就直接使用,如果不是,再创建新的Activity放入栈顶。

    AndroidMainfest.xml中设置代码如下:

    1 <activity android:name=".Main2Activity"
    2             android:launchMode="singleTop"> </activity>

    我们的操作结果如下图:

    log图如下(未记录回退log):

    分析此启动模式和singleTop在名字上即可看出区别,即singleTop每次只检测当前栈顶的Activity是否是我们需要请求创建的,而 singleTask则会检测栈中全部的Activity对象,从上向下,如果检测到是我们所请求的则会消灭此Activity对象上面的对象,直接把检测到的我们需要的Activity置为栈顶。

    第四步:singleTask模式下的演示实验(设置页面二为singleTask)

    在当前任务栈中,判断栈里是否存在Activity,如果不存在,创建一个新Activity入栈,如果存在,会把该Activity之上的所有Activity清除出栈,显示当前Activity。

    AndroidMainfest.xml中设置代码如下:

    1     <activity android:name=".Main2Activity"
    2             android:launchMode="singleTask"> </activity>

    我们的操作结果如下图:

    log图如下(未记录回退log):

    只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。

    第五步:singleInstance模式下的演示实验(设置页面二为singleInstance)

    新创建一个任务栈,放入新创建的Activity,该任务栈只允许存在一个Activity实例,如果已存在,那么会切换到该任务栈。

    AndroidMainfest.xml中设置代码如下:

    1 <activity android:name=".Main2Activity"
    2             android:launchMode="singleInstance"> </activity>

    我们的操作结果如下图:

    log图如下(未记录回退log):

    浏览器工作原理类似,我们都知道在多个程序中访问浏览器时,如果当前浏览器没有打开,则打开浏览器,否则会在当前打开的浏览器中访问。此模式会节省大量的系统资源,因为他能保证要请求的Activity对象在当前的栈中只存在一个。

  • 相关阅读:
    ServU使用方法及应用技巧
    Mozilla公布火狐4详情:更快 更支持开放标准
    FastReport4.6程序员手册_翻译 转
    Delphi调用C写的dll
    动态创建Fastreport
    字符串通用类
    去除全角半角字符
    系统运行的命令集锦
    打印机的大小设置
    旋转字体的设置
  • 原文地址:https://www.cnblogs.com/panhouye/p/6181720.html
Copyright © 2020-2023  润新知