安卓学习 Day4:启动模式

目录

案例演示

一、standard启动模式

1、创建应用

2、编辑主布局资源文件activity_main.xml

3、编辑字符串资源文件strings.xml

4、项目清单文件里设置MainActivity的启动模式

 5、编写主界面代码

 6、运行程序,查看效果

二、singleTop启动模式 

1、创建安卓应用

2、基于Activity模板创建SecondActivity

3、 编写主窗口布局文件代码

4、编写字符串资源文件代码

5、编写项目清单文件代码

6、编写主窗口文件代码 

7、编写第二个窗口文件代码

        8、 运行程序,查看效果

 三、singleTask启动模式

1、创建安卓应用

2、基于Activity模板创建SecondActivity

3、编写主窗口布局文件代码

4、编写第二个窗口的布局文件代码

5、在字符串资源文件添加变量

6、编写项目清单文件

7、编写主窗口代码

8、编写第二个窗口代码

9、运行程序,查看效果

四、singleInstance启动模式


案例演示

一、standard启动模式

1、创建应用

  • 选择模板

  • 完善项目信息

 

2、编辑主布局资源文件activity_main.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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10sp"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tvTaskId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text=""
        android:textSize="20dp" />

    <TextView
        android:id="@+id/tvHashCode"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text=""
        android:textSize="20dp" />

    <Button
        android:id="@+id/tvStartMainActivity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="doStartMainActivity"
        android:text="@string/start_main_activity"
        android:textSize="20dp" />
</LinearLayout>

3、编辑字符串资源文件strings.xml

 

4、项目清单文件里设置MainActivity的启动模式

 5、编写主界面代码

  • 源代码
package net.zs.standard;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private TextView tvTaskId;
    private TextView tvHashCode;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 利用布局资源文件设置用户界面
        setContentView(R.layout.activity_main);
        // 通过资源标识符获取控件实例
        tvTaskId = findViewById(R.id.tvTaskId);
        tvHashCode = findViewById(R.id.tvHashCode);
        // 显示任务标识符与主窗口哈希码
        displayTaskIdAndHashCode();
    }

    /**
     * 显示任务标识符与主窗口哈希码
     */
    private void displayTaskIdAndHashCode() {
        // 显示任务标识符
        tvTaskId.setText(String.format("TaskId: %d", getTaskId()));
        // 显示主窗口哈希码
        tvHashCode.setText(String.format("MainActivityHashCode: %d", hashCode()));
    }

    /**
     * 启动主窗口
     * @param view
     */
    public void doStartMainActivity(View view) {
        // 启动主窗口
        startActivity(new Intent(MainActivity.this, MainActivity.class));
        // 显示任务标识符与主窗口哈希码
        displayTaskIdAndHashCode();
    }
}

 6、运行程序,查看效果

  •  单击启动按钮

  • TaskId值没有变,但是MainActivityHashCode值变了,也就是说,标准模式启动Activity,在同一个任务栈里,但是每次启动都会创建一个新的实例。

二、singleTop启动模式 

1、创建安卓应用

  • 选择模块

  • 完善项目信息

 

2、基于Activity模板创建SecondActivity

 

 

3、 编写主窗口布局文件代码

  • 源代码 
<?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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10sp"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tvTaskId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text=""
        android:textSize="20dp" />

    <TextView
        android:id="@+id/tvHashCode"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text=""
        android:textSize="20dp" />

    <Button
        android:id="@+id/tvStartMainActivity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="doStartMainActivity"
        android:text="@string/start_main_activity"
        android:textSize="20dp" />

    <Button
        android:id="@+id/tvStartSecondActivity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="doStartSecondActivity"
        android:text="@string/start_second_activity"
        android:textSize="20dp" />
</LinearLayout>

4、编写字符串资源文件代码

5、编写项目清单文件代码

 

6、编写主窗口文件代码 

  • 源代码
package net.zs.singletop;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private TextView tvTaskId;
    private TextView tvHashCode;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 利用布局资源文件设置用户界面
        setContentView(R.layout.activity_main);
        // 通过资源标识符获取控件实例
        tvTaskId = findViewById(R.id.tvTaskId);
        tvHashCode = findViewById(R.id.tvHashCode);
        // 显示任务标识符与主窗口哈希码
        displayTaskIdAndHashCode();
    }

    /**
     * 显示任务标识符与主窗口哈希码
     */
    private void displayTaskIdAndHashCode() {
        // 显示任务标识符
        tvTaskId.setText(String.format("TaskId: %d", getTaskId()));
        // 显示主窗口哈希码
        tvHashCode.setText(String.format("MainActivityHashCode: %d", hashCode()));
    }

    /**
     * 启动主窗口
     * @param view
     */
    public void doStartMainActivity(View view) {
        // 启动主窗口
        startActivity(new Intent(MainActivity.this, MainActivity.class));
        // 显示任务标识符与主窗口哈希码
        displayTaskIdAndHashCode();
    }

    /**
     * 启动第二个窗口
     * @param view
     */
    public void doStartSecondActivity(View view) {
        // 启动第二个窗口
        startActivity(new Intent(MainActivity.this, SecondActivity.class));
    }
}

 7、编写第二个窗口文件代码

  • 源代码
package net.zs.singletop;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {
    private TextView tvTaskId;
    private TextView tvHashCode;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 利用布局资源文件设置用户界面
        setContentView(R.layout.activity_main);
        // 通过资源标识符获取控件实例
        tvTaskId = findViewById(R.id.tvTaskId);
        tvHashCode = findViewById(R.id.tvHashCode);
        // 显示任务标识符与第二个窗口哈希码
        displayTaskIdAndHashCode();
    }

    /**
     * 显示任务标识符与主窗口哈希码
     */
    private void displayTaskIdAndHashCode() {
        // 显示任务标识符
        tvTaskId.setText(String.format("TaskId: %d", getTaskId()));
        // 显示第二个窗口哈希码
        tvHashCode.setText(String.format("SecondActivityHashCode: %d", hashCode()));
    }

    /**
     * 启动主窗口
     * @param view
     */
    public void doStartMainActivity(View view) {
        // 启动主窗口
        startActivity(new Intent(SecondActivity.this, MainActivity.class));
    }

    /**
     * 启动第二个窗口
     * @param view
     */
    public void doStartSecondActivity(View view) {
        // 启动第二个窗口
        startActivity(new Intent(SecondActivity.this, SecondActivity.class));
        // 显示任务标识符与第二个窗口哈希码
        displayTaskIdAndHashCode();
    }
}

8、 运行程序,查看效果

  • 单击【启动MAINACTIVITY】按钮,发现Taskld和MainActivityHashCode值都没有发生变化
  • 单击【启动SECONDACTIVITY】按钮

  •  Taskld的值没有变,因为第二个窗口个第一个窗口属于同一个任务栈
  • SecondActivityHashCode的值发生改变,因为打开了一个新的窗口,创建了一个新的实例
  • 这时单击【启动MAINACTIVITY】按钮

  •  SecondActivityHashCode的值再次发生变化,因为打开了另一个窗口,创建了新的MainActivity实例

 三、singleTask启动模式

1、创建安卓应用

  • 选择模板

  • 完善项目信息

 

 2、基于Activity模板创建SecondActivity

 

3、编写主窗口布局文件代码

 

  •  源代码
<?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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10sp"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tvTaskId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text=""
        android:textSize="20dp" />

    <TextView
        android:id="@+id/tvHashCode"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text=""
        android:textSize="20dp" />

    <Button
        android:id="@+id/tvStartMainActivity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="doStartMainActivity"
        android:text="@string/start_main_activity"
        android:textSize="20dp" />

    <Button
        android:id="@+id/tvStartSecondActivity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="doStartSecondActivity"
        android:text="@string/start_second_activity"
        android:textSize="20dp" />
</LinearLayout>

4、编写第二个窗口的布局文件代码

  •  源代码
<?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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10sp"
    tools:context=".SecondActivity">

    <TextView
        android:id="@+id/tvTaskId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text=""
        android:textSize="20dp" />

    <TextView
        android:id="@+id/tvHashCode"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text=""
        android:textSize="20dp" />

    <Button
        android:id="@+id/tvStartMainActivity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="doStartMainActivity"
        android:text="@string/start_main_activity"
        android:textSize="20dp" />

    <Button
        android:id="@+id/tvStartSecondActivity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="doStartSecondActivity"
        android:text="@string/start_second_activity"
        android:textSize="20dp" />
</LinearLayout>

5、在字符串资源文件添加变量

6、编写项目清单文件

 

7、编写主窗口代码

 

  • 源代码
package net.zs.singletask;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private TextView tvTaskId;
    private TextView tvHashCode;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 利用布局资源文件设置用户界面
        setContentView(R.layout.activity_main);
        // 通过资源标识符获取控件实例
        tvTaskId = findViewById(R.id.tvTaskId);
        tvHashCode = findViewById(R.id.tvHashCode);
        // 显示任务标识符与主窗口哈希码
        displayTaskIdAndHashCode();
    }

    /**
     * 显示任务标识符与主窗口哈希码
     */
    private void displayTaskIdAndHashCode() {
        // 显示任务标识符
        tvTaskId.setText(String.format("TaskId: %d", getTaskId()));
        // 显示主窗口哈希码
        tvHashCode.setText(String.format("MainActivityHashCode: %d", hashCode()));
    }

    /**
     * 启动主窗口
     * @param view
     */
    public void doStartMainActivity(View view) {
        // 启动主窗口
        startActivity(new Intent(MainActivity.this, MainActivity.class));
        // 显示任务标识符与主窗口哈希码
        displayTaskIdAndHashCode();
    }

    /**
     * 启动第二个窗口
     * @param view
     */
    public void doStartSecondActivity(View view) {
        // 启动第二个窗口
        startActivity(new Intent(MainActivity.this, SecondActivity.class));
    }
}

8、编写第二个窗口代码

  •  源代码
package net.zs.singletask;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {
    private TextView tvTaskId;
    private TextView tvHashCode;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 利用布局资源文件设置用户界面
        setContentView(R.layout.activity_main);
        // 通过资源标识符获取控件实例
        tvTaskId = findViewById(R.id.tvTaskId);
        tvHashCode = findViewById(R.id.tvHashCode);
        // 显示任务标识符与第二个窗口哈希码
        displayTaskIdAndHashCode();
    }

    /**
     * 显示任务标识符与主窗口哈希码
     */
    private void displayTaskIdAndHashCode() {
        // 显示任务标识符
        tvTaskId.setText(String.format("TaskId: %d", getTaskId()));
        // 显示第二个窗口哈希码
        tvHashCode.setText(String.format("SecondActivityHashCode: %d", hashCode()));
    }

    /**
     * 启动主窗口
     *
     * @param view
     */
    public void doStartMainActivity(View view) {
        // 启动主窗口
        startActivity(new Intent(SecondActivity.this, MainActivity.class));
    }

    /**
     * 启动第二个窗口
     *
     * @param view
     */
    public void doStartSecondActivity(View view) {
        // 启动第二个窗口
        startActivity(new Intent(SecondActivity.this, SecondActivity.class));
        // 显示任务标识符与第二个窗口哈希码
        displayTaskIdAndHashCode();
    }
}

9、运行程序,查看效果

 

  • 单击【启动MAINACTIVITY】按钮 

  •  没有发生变化
  • 单击【启动SECONDACTIVITY】按钮

 

  • 此时SecondActivity处于任务栈顶层
  • 单击【启动MAINAVTIVITY】按钮

 

  • 可以看到,再次跳转回来的主窗口还是同一个,说明并没有创建新的实例 
  • SingTask可以用来退出应用
  • 在主界面中重写onNewlntent方法。

  •  运行程序,查看效果

  • 单击【启动SECONDACTIVITY】按钮后跳转到第二个窗口,单击【启动MAINACTIVITY】按钮后会退出主窗口。

四、singleInstance启动模式

  • 两个应用程序公用一个窗口,不需要创建新的实例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值