Android Studio APP开发入门之活动Activity中启停活动页面的讲解及实战(附源码,包括Activity的启动结束、生命周期、跳转等)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Android Studio APP开发入门之活动Activity中启停活动页面的讲解及实战(附源码,包括Activity的启动结束、生命周期、跳转等)

运行有问题或需要源码请点赞关注收藏后评论区留言

Activity的启动和结束

通过startActivity方法可以从当前页面跳转到新页面,利用按钮控件中的点击事件去触发页面跳转。同样调用finish方法可以关闭当前页面,关闭了当前页面那么理所当然应该显示之前的页面,所以需要给箭头图标和完成按钮分别注册点击监听器,然后在onClick方法中调用finish方法。效果如下

通过点击按钮跳到ActFinishActivity类所显示的界面中

ActStartActivity类代码如下

package com.example.chapter04;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
// 活动类直接实现点击监听器的接口View.OnClickListener
public class ActStartActivity extends AppCompatActivity implements View.OnClickListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_act_start);
        // setOnClickListener来自于View,故而允许直接给View对象注册点击监听器
        findViewById(R.id.btn_act_next).setOnClickListener(this);
    }
    @Override
    public void onClick(View v) { // 点击事件的处理方法
        if (v.getId() == R.id.btn_act_next) {
            // 从当前页面跳到指定的新页面
            //startActivity(new Intent(ActStartActivity.this, ActFinishActivity.class));
            startActivity(new Intent(this, ActFinishActivity.class));
        }
    }
}

activity_act_startXML文件代码如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <Button
        android:id="@+id/btn_act_next"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="跳到下个页面"
        android:textColor="#000000"
        android:textSize="17sp" />
</LinearLayout>

ActFinishActivity类代码如下

package com.example.chapter04;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
// 活动类直接实现点击监听器的接口View.OnClickListener
public class ActFinishActivity extends AppCompatActivity implements View.OnClickListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_act_finish);
        // 给箭头图标注册点击监听器,ImageView由View类派生而来
        findViewById(R.id.iv_back).setOnClickListener(this);
        // 给完成按钮注册点击监听器,Button也由View类派生而来
        findViewById(R.id.btn_finish).setOnClickListener(this);
    }
    @Override
    public void onClick(View v) { // 点击事件的处理方法
        if (v.getId() == R.id.iv_back || v.getId() == R.id.btn_finish) {
            finish(); // 结束当前的活动页面
        }
    }
}

activity_act_finishXML文件代码如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <ImageView
        android:id="@+id/iv_back"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:padding="5dp"
        android:src="@drawable/ic_back" />
    <Button
        android:id="@+id/btn_finish"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="完成"
        android:textColor="#000000"
        android:textSize="17sp" />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:text="按返回键,或者点击左上角的箭头图标,或者点击上面的完成按钮,均可关闭当前页面、返回上个页面"
        android:textColor="#000000"
        android:textSize="17sp" />
</LinearLayout>

Activity的生命周期

App引入活动的概念而非传统的页面概念,原因在于页面更像是静态的,而活动更像是动态的。活动的生命周期行为对应的方法说明如下

onCreate 创建活动

onStart  开启活动

onResume 恢复活动

onPause  暂停活动

onStop  停止活动 活动页面不再屏幕上显示

onDestroy 销毁活动

onRestart  重启活动

onNewIntent  重启已有的活动实例

活动跳转之间的生命周期如下图

 

效果如下

ActLifeActivity类代码如下

package com.example.chapter04;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import com.example.chapter04.util.DateUtil;
public class ActLifeActivity extends AppCompatActivity implements View.OnClickListener {
    private final static String TAG = "ActLifeActivity";
    private TextView tv_life; // 声明一个文本视图对象
    private String mStr = "";
    private void refreshLife(String desc) { // 刷新生命周期的日志信息
        Log.d(TAG, desc);
        mStr = String.format("%s%s %s %s\n", mStr, DateUtil.getNowTimeDetail(), TAG, desc);
        tv_life.setText(mStr);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) { // 创建活动页面
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_act_life);
        findViewById(R.id.btn_act_next).setOnClickListener(this);
        tv_life = findViewById(R.id.tv_life); // 从布局文件中获取名叫tv_life的文本视图
        refreshLife("onCreate"); // 刷新生命周期的日志信息
    }
    @Override
    protected void onStart() { // 开始活动
        super.onStart();
        refreshLife("onStart"); // 刷新生命周期的日志信息
    }
    @Override
    protected void onStop() { // 停止活动
        super.onStop();
        refreshLife("onStop"); // 刷新生命周期的日志信息
    }
    @Override
    protected void onResume() { // 恢复活动
        super.onResume();
        refreshLife("onResume"); // 刷新生命周期的日志信息
    }
    @Override
    protected void onPause() { // 暂停活动
        super.onPause();
        refreshLife("onPause"); // 刷新生命周期的日志信息
    }
    @Override
    protected void onRestart() { // 重启活动
        super.onRestart();
        refreshLife("onRestart"); // 刷新生命周期的日志信息
    }
    @Override
    protected void onDestroy() { // 销毁活动
        super.onDestroy();
        refreshLife("onDestroy"); // 刷新生命周期的日志信息
    }
    @Override
    protected void onNewIntent(Intent intent) { // 重用已有的活动实例
        super.onNewIntent(intent);
        refreshLife("onNewIntent"); // 刷新生命周期的日志信息
    }
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_act_next) {
            // 从当前页面跳到指定的活动页面
            startActivity(new Intent(this, ActNextActivity.class));
        }
    }
}

activity_act_lifeXML文件代码如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <Button
        android:id="@+id/btn_act_next"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="跳到下个页面"
        android:textColor="#000000"
        android:textSize="17sp" />
    <TextView
        android:id="@+id/tv_life"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:textColor="#000000"
        android:textSize="17sp" />
</LinearLayout>

ActNextActivity类代码如下

package com.example.chapter04;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import com.example.chapter04.util.DateUtil;
public class ActNextActivity extends AppCompatActivity implements View.OnClickListener {
    private final static String TAG = "ActNextActivity";
    private TextView tv_life; // 声明一个文本视图对象
    private String mStr = "";
    private void refreshLife(String desc) { // 刷新生命周期的日志信息
        Log.d(TAG, desc);
        mStr = String.format("%s%s %s %s\n", mStr, DateUtil.getNowTimeDetail(), TAG, desc);
        tv_life.setText(mStr);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) { // 创建活动
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_act_next);
        findViewById(R.id.btn_act_pre).setOnClickListener(this);
        tv_life = findViewById(R.id.tv_life); // 从布局文件中获取名叫tv_life的文本视图
        refreshLife("onCreate");
    }
    @Override
    protected void onStart() { // 开始活动
        super.onStart();
        refreshLife("onStart"); // 刷新生命周期的日志信息
    }
    @Override
    protected void onStop() { // 停止活动
        super.onStop();
        refreshLife("onStop"); // 刷新生命周期的日志信息
    }
    @Override
    protected void onResume() { // 恢复活动
        super.onResume();
        refreshLife("onResume"); // 刷新生命周期的日志信息
    }
    @Override
    protected void onPause() { // 暂停活动
        super.onPause();
        refreshLife("onPause"); // 刷新生命周期的日志信息
    }
    @Override
    protected void onRestart() { // 重启活动
        super.onRestart();
        refreshLife("onRestart"); // 刷新生命周期的日志信息
    }
    @Override
    protected void onDestroy() { // 销毁活动
        super.onDestroy();
        refreshLife("onDestroy"); // 刷新生命周期的日志信息
    }
    @Override
    protected void onNewIntent(Intent intent) { // 重用已有的活动实例
        super.onNewIntent(intent);
        refreshLife("onNewIntent"); // 刷新生命周期的日志信息
    }
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_act_pre) {
            finish(); // 结束当前的活动页面
        }
    }
}

activity_act_nextXML文件代码如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <Button
        android:id="@+id/btn_act_pre"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="返回上个页面"
        android:textColor="#000000"
        android:textSize="17sp" />
    <TextView
        android:id="@+id/tv_life"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:textColor="#000000"
        android:textSize="17sp" />
</LinearLayout>

Activity的启动模式

系统给每个正在运行的APP都分配了活动栈,栈里面容纳着已经创建且尚未销毁的活动信息,鉴于栈式一种先进后出,后进先出的数据结构,故而后面入栈的活动总是先出栈。 示意图如下

启动模式launchMode几种属性值如下

standard 标准模式无论何时启动哪个互动,都是重新创建该页面的实例并放入栈顶

singleTop  启动新活动时,判断如果栈顶正好就是该活动的实例,则重用该实例

singleTask  启动新活动时 判断如果栈中存在该活动的实例,则重用该实例

singleInstance  启动新活动时 将该活动的实例放入一个新栈中 原栈的实例列表保持不动

JumpFirstActivity类代码如下

package com.example.chapter04;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class JumpFirstActivity extends AppCompatActivity implements View.OnClickListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_jump_first);
        findViewById(R.id.btn_jump_second).setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_jump_second) {
            // 创建一个意图对象,准备跳到指定的活动页面
            Intent intent = new Intent(this, JumpSecondActivity.class);
            // 栈中存在待跳转的活动实例时,则重新创建该活动的实例,并清除原实例上方的所有实例
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); // 设置启动标志
            startActivity(intent); // 跳转到意图对象指定的活动页面
        }
    }
}

activity_jump_firstXML文件代码如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <Button
        android:id="@+id/btn_jump_second"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="跳到第二个页面"
        android:textColor="#000000"
        android:textSize="17sp" />
</LinearLayout>

LoginInputActivity类代码如下

package com.example.chapter04;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class LoginInputActivity extends AppCompatActivity implements View.OnClickListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login_input);
        findViewById(R.id.btn_jump_success).setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_jump_success) {
            // 创建一个意图对象,准备跳到指定的活动页面
            Intent intent = new Intent(this, LoginSuccessActivity.class);
            // 设置启动标志:跳转到新页面时,栈中的原有实例都被清空,同时开辟新任务的活动栈
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent); // 跳转到意图指定的活动页面
        }
    }
}

activity_login_inputXML文件代码如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:text="这里是登录验证页面,此处省略了用户名和密码等输入框"
        android:textColor="#000000"
        android:textSize="17sp" />
    <Button
        android:id="@+id/btn_jump_success"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="跳到登录成功页面"
        android:textColor="#000000"
        android:textSize="17sp" />
</LinearLayout>

创作不易 觉得有帮助请点赞关注收藏

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
7天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
33 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
1天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
3天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
5天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
【10月更文挑战第35天】在数字化时代,安卓应用的开发成为了一个热门话题。本文旨在通过浅显易懂的语言,带领初学者了解安卓开发的基础知识,同时为有一定经验的开发者提供进阶技巧。我们将一起探讨如何从零开始构建第一个安卓应用,并逐步深入到性能优化和高级功能的实现。无论你是编程新手还是希望提升技能的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
3天前
|
存储 API 开发工具
探索安卓开发:从基础到进阶
【10月更文挑战第37天】在这篇文章中,我们将一起探索安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和建议。我们将从安卓开发的基础开始,逐步深入到更复杂的主题,如自定义组件、性能优化等。最后,我们将通过一个代码示例来展示如何实现一个简单的安卓应用。让我们一起开始吧!
|
4天前
|
存储 XML JSON
探索安卓开发:从新手到专家的旅程
【10月更文挑战第36天】在这篇文章中,我们将一起踏上一段激动人心的旅程,从零基础开始,逐步深入安卓开发的奥秘。无论你是编程新手,还是希望扩展技能的老手,这里都有适合你的知识宝藏等待发掘。通过实际的代码示例和深入浅出的解释,我们将解锁安卓开发的关键技能,让你能够构建自己的应用程序,甚至贡献于开源社区。准备好了吗?让我们开始吧!
15 2
|
5天前
|
Android开发
布谷语音软件开发:android端语音软件搭建开发教程
语音软件搭建android端语音软件开发教程!
|
13天前
|
编解码 Java Android开发
通义灵码:在安卓开发中提升工作效率的真实应用案例
本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。
|
12天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
24 5
|
10天前
|
JSON Java Android开发
探索安卓开发之旅:打造你的第一个天气应用
【10月更文挑战第30天】在这个数字时代,掌握移动应用开发技能无疑是进入IT行业的敲门砖。本文将引导你开启安卓开发的奇妙之旅,通过构建一个简易的天气应用来实践你的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你宝贵的学习资源。我们将一步步地深入到安卓开发的世界中,从搭建开发环境到实现核心功能,每个环节都充满了发现和创造的乐趣。让我们开始吧,一起在代码的海洋中航行!

热门文章

最新文章