目录
2、基于Activity模板创建SecondActivity
2、基于Activity模板创建SecondActivity
案例演示
一、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启动模式
-
两个应用程序公用一个窗口,不需要创建新的实例