zoukankan      html  css  js  c++  java
  • Activity启动模式

    ------siwuxie095

       

       

       

    共4种启动模式:standard singleTop singleTask singleInstance

       

       

       

       

       

    1、标准启动模式(standard) 也即默认的启动模式

       

    1)先创建一个项目:LaunchMode,选择API:21 Android 5.0

    选择Empty Activity,工程结构目录一览:

       

       

    2 先修改 activity_main.xml 的布局为LinearLayout,添加 orientation 属性为:vertical

    修改TextView的 id 为 tv,添加一个Button,给Button添加一个 textAllCaps 属性为:false

    (关闭全部大写)

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

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

    xmlns:tools="http://schemas.android.com/tools"

    android:id="@+id/activity_main"

    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"

    android:orientation="vertical"

    tools:context="com.siwuxie095.launchmode.MainActivity">

       

    <TextView

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="Hello World!"

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

       

    <Button

    android:textAllCaps="false"

    android:text="启动MainActivity"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

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

    </LinearLayout>

       

       

    3)MainActivity.java 中,呈现任务栈ID和当前Activity的ID

    package com.siwuxie095.launchmode;

       

    import android.content.Intent;

    import android.support.v7.app.AppCompatActivity;

    import android.os.Bundle;

    import android.view.View;

    import android.widget.TextView;

       

    public class MainActivity extends AppCompatActivity {

       

       

    private TextView tv;

       

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

       

    //需要执行强制类型转换

    tv= (TextView) findViewById(R.id.tv);

    //设置TextView的呈现信息

    //任务栈ID 当前ActivityID(即Activity实例的ID

    //任务栈即一个堆栈,启动的实例都放入栈中,按返回键(后退键)会弹出栈顶实例

    //呈现上一个Activity实例,通过这种方式支持返回键(后退键)的导航

    tv.setText(String.format("TaskId: %d CurrentActivityId: %s",getTaskId(),toString()));

       

    findViewById(R.id.btnStartSelf).setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    //MainActivity启动自身

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

    }

    });

    }

    }

       

       

       

    4)在 AndroidManifest.xml 中设置启动模式,如果没有设置,

    即为默认启动模式---标准启动模式

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

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

    package="com.siwuxie095.launchmode">

       

    <application

    android:allowBackup="true"

    android:icon="@mipmap/ic_launcher"

    android:label="@string/app_name"

    android:supportsRtl="true"

    android:theme="@style/AppTheme">

    <activity android:name=".MainActivity"

    android:launchMode="standard">

    <intent-filter>

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

       

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

    </intent-filter>

    </activity>

    </application>

       

    </manifest>

       

       

    5)连续两次点击按钮,发现TaskId不变,而CurrentActivityId变了,

    点击一次返回,回到上一个Activity实例,点击三次返回后结束程序

    回到桌面,运行一览:

       

       

       

       

       

       

       

    2、singleTop启动模式

       

    1)直接修改 AndroidManifest.xml 的启动模式为 singleTop

       

    android:launchMode="singleTop"

       

    (2)运行后,点击"启动MainActivity",发现TaskId和CurrentActivityId都没有变化,

    点击返回直接结束程序回到桌面,看似Activity只能启动一次,一览:

       

       

    3)再new一个Empty Activity:BAty,此时工程结构目录一览:

       

       

    4)在 AndroidManifest.xml 中,同样将

    BAty启动模式设置为 singleTop,为 activity_main.xml 添加一个Button

    用于启动BAty,将activity_main.xml完全复制到activity_baty.xml

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

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

    xmlns:tools="http://schemas.android.com/tools"

    android:id="@+id/activity_main"

    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"

    android:orientation="vertical"

    tools:context="com.siwuxie095.launchmode.MainActivity">

       

    <TextView

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="Hello World!"

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

       

    <Button

    android:textAllCaps="false"

    android:text="启动MainActivity"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

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

       

    <Button

    android:textAllCaps="false"

    android:text="启动B Activity"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

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

    </LinearLayout>

       

       

       

       

    (5)同样,在MainActivity.java中做略微修改,复制到Baty.java中,再做略微修改

    MainActivity.java:

    package com.siwuxie095.launchmode;

       

    import android.content.Intent;

    import android.support.v7.app.AppCompatActivity;

    import android.os.Bundle;

    import android.view.View;

    import android.widget.TextView;

       

    public class MainActivity extends AppCompatActivity {

       

       

    private TextView tv;

       

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

       

    //需要执行强制类型转换

    tv= (TextView) findViewById(R.id.tv);

    //设置TextView的呈现信息

    //任务栈ID 当前ActivityID(即Activity实例的ID

    //任务栈即一个堆栈,启动的实例都放入栈中,按返回键(后退键)会弹出栈顶实例

    //呈现上一个Activity实例,通过这种方式支持返回键(后退键)的导航

    tv.setText(String.format("A: TaskId: %d CurrentActivityId: %s",getTaskId(),toString()));

       

    findViewById(R.id.btnStartSelf).setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    //MainActivity启动自身

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

    }

    });

    findViewById(R.id.btnStartBAty).setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    startActivity(new Intent(MainActivity.this, BAty.class));

    }

    });

    }

    }

       

       

    BAty.java:

    package com.siwuxie095.launchmode;

       

    import android.content.Intent;

    import android.support.v7.app.AppCompatActivity;

    import android.os.Bundle;

    import android.view.View;

    import android.widget.TextView;

       

    public class BAty extends AppCompatActivity {

       

    private TextView tv;

       

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_baty);

       

    //需要执行一个强制类型转换

    tv= (TextView) findViewById(R.id.tv);

    tv.setText(String.format("B: TaskId: %d CurrentActivityId: %s",getTaskId(),toString()));

       

    findViewById(R.id.btnStartSelf).setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    startActivity(new Intent(BAty.this, MainActivity.class));

    }

    });

    findViewById(R.id.btnStartBAty).setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    //BAty启动自身

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

    }

    });

    }

    }

       

       

    6)运行后发现,只点击"启动MainActivity",任务栈和实例的ID依然没有变化,

    此时点击"启动B Activity",再点击"启动MainActivity",任务栈没变,但实例ID已经变了

    (点击三次返回才会结束程序回到桌面)

    即:在同一个栈中,指明启动模式为singleTop,若一个Activity处于栈顶,那么只能创建一个实例

    ,若不处于栈顶才会创建新的实例,一览:

       

       

       

       

       

       

       

       

    3、singleTask启动模式

       

    1)先修改 AndroidManifest.xml 中的 launchMode 为 singleTask,直接运行,

    只点击"启动MainActivity",任务栈和实例ID没有变化,点击"启动B Activity",再点击

    "启动MainActivity",任务栈和实例ID依然没有变,点击一次返回就结束程序回到桌面,

    即此时任务栈中只剩下了MainActivity,BAty已经在最后一次点击"启动MainActivity"时

    就被弹出任务栈,一览:

       

       

       

       

       

       

       

       

    4、singleInstance启动模式

    1)先修改 AndroidManifest.xml 中的 launchMode 为 singleInstance,直接运行,

    只点击"启动MainActivity",任务栈和实例ID没有变化,点击"启动B Activity",TaskId 加1,

    即任务栈和实例ID都变了,再点击"启动MainActivity",又回到第一次启动MainActivity时的

    任务栈和实例ID,即没变,再点击"启动B Activity",同样回到第一次启动BAty时的任务栈和

    实例ID,也没变,即独立的任务栈只放一个实例,一览:

       

       

       

       

       

    【made by siwuxie095】

       

  • 相关阅读:
    毕业实习[招聘网站爬虫项目]之项目总结
    实际开发中,数据库设计可行的两种过程
    SpringBoot中Application开启与关闭
    SpringBoot学习笔记<一>入门与基本配置
    Maven学习笔记
    sbt 配置
    [转] prerender-SPA程序的SEO优化策略
    [转] 用SBT编译Spark的WordCount程序
    Spark
    RT: np
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6243492.html
Copyright © 2011-2022 走看看