Activity作为Android四大组件之一,是构建用户界面的核心单元。笔者通过郭霖著的第一行代码入门安卓,内容基本都取自书中,这篇博客作为笔者的笔记同时精简了一些书中内容分享在csdn中

一、Activity的创建与基础配置

1.1 创建Activity的基本步骤

在Android项目中创建一个Activity需要遵循以下步骤:

  1. 定义Java类:新建一个继承自Activity或其子类(如AppCompatActivity)的Java类
  2. 注册到清单文件:在AndroidManifest.xml中声明Activity,并配置必要的属性(如launchMode
  3. 绑定布局:在onCreate()中调用setContentView(R.layout.xxx)加载界面布局
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); // 绑定布局}
}

在实际开发中,Android Studio会自动完成大部分配置工作。我们只需在Java目录下创建Activity,IDE会自动生成必要的XML配置。

1.2 Context的理解与应用

Activity继承自Context类,这是一个抽象类,代表应用程序的环境信息,提供以下核心功能:

  • 访问应用程序资源(如字符串、图片等)
  • 启动其他组件(Activity、Service等)
  • 获取系统服务(如布局填充器、通知服务等)

在Activity内部使用this即可获取Context对象,但在内部类中需要使用ActivityName.this来避免混淆。

1.3 Toast的合理使用

Toast用于向用户显示短暂的提示信息,会自动消失且不干扰用户操作:

Button button = findViewById(R.id.button);
button.setOnClickListener(v -> {Toast.makeText(MainActivity.this, "操作成功", Toast.LENGTH_SHORT).show();
});

二、Activity的销毁机制

2.1 finish()方法详解

调用finish()方法会触发Activity的销毁流程:

  1. 生命周期回调顺序:onPause()onStop()onDestroy()
  2. 系统最终会释放资源并移除Activity实例

重要特性

  • finish()不会立即终止当前方法的执行,后续代码仍会正常执行
  • 它只是标记Activity为待销毁状态,系统会在当前方法执行完毕后处理销毁操作
  • 如果不调用finish(),Activity会保留在返回栈中,可能占用内存资源
button.setOnClickListener(v -> {finish(); // 标记销毁Log.d("TEST", "这行代码仍会执行"); // 正常输出startActivity(new Intent(this, NextActivity.class));
});

2.2 销毁场景分析

场景是否自动调用finish()备注
用户按返回键系统默认处理
调用startActivity启动新Activity旧Activity保留在栈中
配置变更(如旋转屏幕)是(但会重建)系统自动处理
内存不足被系统回收不可预测

三、Activity间的切换与数据传递

1 显式Intent切换Activity

显式Intent明确指定要启动的目标Activity类:

Intent intent = new Intent(CurrentActivity.this, TargetActivity.class);
startActivity(intent);

特点:

  • 明确知道要启动哪个Activity
  • 代码耦合性较高
  • 适用于应用内部跳转

2 隐式Intent切换Activity

隐式Intent通过指定action、category等信息,由系统匹配合适的Activity:

<!-- AndroidManifest.xml中配置 -->
<activity android:name=".TargetActivity" android:exported="true"><intent-filter><action android:name="com.example.ACTION_TARGET"/><category android:name="android.intent.category.DEFAULT"/></intent-filter>
</activity>

还可以跳转到网页上,指定Intent的action为Intent.ACTION_VIEW,然后通过Uri.parse()方法将网址字符串解析成Uri对象,再调用Intent的setData方法将该Uri对象传递进去。

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.first_layout);Button bt1 = findViewById(R.id.button1);bt1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, "提醒一下", Toast.LENGTH_SHORT).show();finish();Intent intent = new Intent(Intent.ACTION_VIEW);intent.setData(Uri.parse("https://www.quark.cn/s/JHK6vrGF1K12Y0Nl52?from=kkframenew_resultsearch&uc_param_str=ntnwvepffrbiprsvchutosstxs&by=submit&q=%E5%94%90%E4%BA%BA&queryId=h5FJGAyNpZHUOP9W0M9ypNrZ8Sxncku32B8QU6h4TDKLYwGehGZhZ35QkEgGGcqA0cWn4bVJAJDup1bvTQJ53ojFoMG12Bn1H11uPKOD0soRtrKZCUSFGJSGHK2sn"));startActivity(intent);}});

应用场景:

  • 启动其他应用的Activity(如分享功能)
  • 实现应用内模块解耦
  • 处理系统广播和通知

传递数据

1.向下一个活动传递数据

Intent中提供了一系列putExtra()方法的重载,可以把向传递的数据暂存在Intent中,启动另一个活动后只需要把数据再从Intent中取出就可以了。比如MainActivity中有一个字符串,想把字符串传递到SecondaryActivity中,运行如下代码后可以在logcat中直接看到传递的Hello,world(xml文件中各加一个Button即可)。其中putExtra第一个参数相当于一个键,第二个参数是要传递的数据。

package com.example.myapplication;import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d("MainActivity:", this.toString());setContentView(R.layout.first_layout);Button bt1 = findViewById(R.id.button1);bt1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String data = "Hello, world";Intent intent = new Intent(MainActivity.this, SecondaryActivity.class);intent.putExtra("main_data", data);startActivity(intent);}});}
}

接受数据的活动代码中,先调用getIntent()得到该intent对象,然后用getStringExtra得到该数据。

package com.example.myapplication;import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;import androidx.activity.EdgeToEdge;
import androidx.annotation.LongDef;
import androidx.appcompat.app.AppCompatActivity;public class SecondaryActivity extends AppCompatActivity {private static final String TAG = "SecondaryActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d("SecondaryActivity:", this.toString());EdgeToEdge.enable(this);setContentView(R.layout.activity_secondary);Button button  = findViewById(R.id.btn2);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = getIntent();String data = intent.getStringExtra("main_data");Log.d("SecondaryActivity", data);}});}@Overrideprotected void onStop() {super.onStop();Log.d(TAG, "onStop: ");}@Overrideprotected void onDestroy() {super.onDestroy();Log.d(TAG, "onDestroy: ");}
}

2.返回数据给上一个活动

返回上一个活动只需要一个back键,并没有启动活动的intent来传递数据,但是Activity中有一个startActivityForResult()也是用来启动活动的。该方法接收两个参数,第一个参数是Intent,第二个参数是一个请求码,用于在之后的回调中判断数据来源.

package com.example.myapplication;import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d("MainActivity:", this.toString());setContentView(R.layout.first_layout);Button bt1 = findViewById(R.id.button1);bt1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String data = "Hello, world";Intent intent = new Intent(MainActivity.this, SecondaryActivity.class);startActivityForResult(intent, 1);}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);switch (requestCode) {case 1:if (resultCode == RESULT_OK) {String returnedData = data.getStringExtra("data_return");Log.d( "First_Activity", returnedData);}break;default:}}
}

下面是另一个活动的代码,我们还是构建一个Intent,但仅用来传递数据而不指定任何"意图"切换活动,然后用setResult方法向上一个活动返回数据,接收两个参数,第一个用于向上一个互动返回处理结果,一般使用RESULT_OKRESULT_CANCELD两个值,第二个则把带有数据的Intent传递回去,然后用finish销毁该活动以返回上一个活动。由于使用startActivityForResult启动活动,,在第二个活动被销毁后会回调上一个活动的onActivityResult()方法,因此需要重写第一个活动中这个方法得到返回的数据。该方法有三个参数,第一个参数resultCode,即传入的请求码,第二个参数resultCode是返回的处理结果,第三个参数data即携带返回数据的Intent

package com.example.myapplication;import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;import androidx.activity.EdgeToEdge;
import androidx.annotation.LongDef;
import androidx.appcompat.app.AppCompatActivity;public class SecondaryActivity extends AppCompatActivity {private static final String TAG = "SecondaryActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d("SecondaryActivity:", this.toString());EdgeToEdge.enable(this);setContentView(R.layout.activity_secondary);Button button  = findViewById(R.id.btn2);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent();intent.putExtra("data_return", "Hello, world");setResult(RESULT_OK, intent);finish();}});}@Overrideprotected void onStop() {super.onStop();Log.d(TAG, "onStop: ");}@Overrideprotected void onDestroy() {super.onDestroy();Log.d(TAG, "onDestroy: ");}
}

四、Activity的生命周期管理

4.1 Activity的四种状态

  1. 运行状态(Active/Running)

    • 位于栈顶,可见且可交互
    • 系统最不可能回收的状态
  2. 暂停状态(Paused)

    • 不再处于栈顶但仍部分可见
    • 如被对话框式Activity覆盖时
    • 系统可能在内存紧张时回收
  3. 停止状态(Stopped)

    • 完全不可见
    • 仍保留状态和成员变量
    • 系统可能回收内存
  4. 销毁状态(Destroyed)

    • 被系统回收或调用finish()
    • 需要重建才能再次使用

4.2 生命周期回调方法

Activity类定义了7个核心回调方法:

  1. onCreate()

    • 首次创建时调用
    • 完成初始化(加载布局、绑定数据等)
    • 必须调用super.onCreate()
  2. onStart()

    • 由不可见变为可见时调用
    • 适合启动动画、注册监听器等
  3. onResume()

    • 进入可交互状态
    • 恢复暂停时被停止的功能(如相机)
  4. onPause()

    • 失去焦点,部分可见
    • 必须快速执行(不能做耗时操作)
    • 保存持久性数据
  5. onStop()

    • 完全不可见
    • 适合释放不必要资源
  6. onDestroy()

    • 被销毁前调用
    • 释放所有资源,避免内存泄漏
  7. onRestart()

    • 由停止状态重新启动时调用
    • 后接onStart()

4.3 生命周期场景分析

启动Activity: onCreate -> onStart -> onResume
按下Home键: onPause -> onStop
返回应用: onRestart -> onStart -> onResume
回退退出: onPause -> onStop -> onDestroy

对话框式Activity的影响

  • 只会触发onPause(),不会触发onStop()
  • 底层Activity仍部分可见

五、Activity的启动模式

AndroidManifest.xml中通过android:launchMode属性配置:

5.1 standard(标准模式)

  • 默认模式
  • 每次启动都创建新实例
  • 允许多个相同Activity实例存在
  • 典型的栈内管理方式
<activity android:name=".StandardActivity" android:launchMode="standard"/>

5.2 singleTop(栈顶复用)

  • 如果目标Activity已在栈顶,则复用实例
  • 避免重复创建相同Activity
  • 适用于通知跳转等场景
<activity android:name=".SingleTopActivity"android:launchMode="singleTop"/>

5.3 singleTask(栈内复用)

  • 整个任务栈中只存在一个实例
  • 如果已存在,则清除其上的所有Activity
  • 适合应用的主页Activity
<activity android:name=".MainActivity"android:launchMode="singleTask"/>

5.4 singleInstance(单例模式)

  • 启用独立的返回栈管理
  • 保证只有一个实例存在
  • 多个应用共享同一个Activity实例
  • 适合闹钟等系统级功能
<activity android:name=".AlarmActivity"android:launchMode="singleInstance"/>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/909597.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/909597.shtml
英文地址,请注明出处:http://en.pswp.cn/news/909597.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解 Python 的 secrets 模块:打造更安全的随机数生成机制

深入理解 Python 的 secrets 模块&#xff1a;打造更安全的随机数生成机制 在构建涉及用户身份认证、权限管理、加密通信等系统时&#xff0c;开发者最不能忽视的一个问题就是“安全性”。安全问题的核心之一在于“随机性”——尤其是密码、验证码、Token、Session、API Key 的…

CHAPTER 19 Concurrency Models in Python

一、A Bit of Jargon 1、关键术语解析 1.1 并发 (Concurrency) 定义: 并发是指同时处理多个待处理任务的能力&#xff0c;这些任务可以依次或并行&#xff08;如果可能&#xff09;进行&#xff0c;最终每个任务都会成功或失败。 理解: 单核 CPU: 即使是单核 CPU 也可以实…

DCM4CHEE Archive Light 开发环境部署(5)-IDEA集成调试配置

系列文章目录 DCM4CHEE Archive light 开发环境部署(1)-前言DCM4CHEE Archive light 开发环境部署(2)-PostgreSQLDCM4CHEE Archive light 开发环境部署(3)-OpenLDAPDCM4CHEE Archive light 开发环境部署(4)-Wildfly(JBoss)DCM4CHEE Archive light 开发环境部署(5)-IDEA集成…

在rust中执行命令行输出中文乱码解决办法

如果你使用标准的依赖库执行命令中包含中文的话&#xff0c; 就会发现中文乱码&#xff0c;如果你的输出中没有中文&#xff0c;就可以正常输出&#xff0c;因为windows的命令行默认使用的是gbk编码。。。。。 #[tauri::command] pub async fn run_command(command: String) -…

判断当前浏览器卡不卡

方法一&#xff1a;使用 requestAnimationFrame 和时间戳计算平均 FPS let frameCount 0; let lastTime performance.now(); let fps 0; let isSlow false; // 是否卡顿的标志function calculateFPS(currentTime) {frameCount;// 每隔大约 1000 毫秒&#xff08;1秒&#…

51c嵌入式~电路~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/11748634 一、延长电子元器件的货架寿命 本文探讨了电子元器件的货架寿命问题&#xff0c;重点讨论了氧化、湿度敏感等级&#xff08;MSL&#xff09;与货架寿命之间的关系。文章通过具体例子说明了氧化对电子元器件可…

Eureka 与 Feign(一)

Eureka 与 Feign 知识解析 1. Eureka Spring Cloud Eureka 是服务发现组件&#xff0c;包含&#xff1a; Eureka Server&#xff1a;注册中心&#xff0c;管理服务实例Eureka Client&#xff1a;服务实例&#xff0c;向注册中心注册/获取服务信息 核心功能&#xff1a; 服…

AN动画软件|Animate 2025百度云下载与安装教程指南

如大家所了解的&#xff0c;‌Animate全称Adobe Animate&#xff0c;常常也被简称为AN。它是一款2D动画制作软件‌&#xff0c;其前身为Flash Professional CC&#xff0c;2016年更名为Animate CC&#xff0c;支持Flash SWF文件及HTML5动画创作&#xff0c;广泛应用于网页交互、…

提示词工程中常见协议框架应用实例

一、生成式诊断催化协议(Generative Diagnosis Catalysis, GDC) 技术原理:基于神经符号系统的因果推理引擎,融合贝叶斯网络与强化学习 实施场景: class DiagnosticCatalyst:def __init__(self, domain="医疗诊断"):self.causal_graph

资深Java工程师的面试题目(七)JDK JVM

以下是针对 Java 面试者 的 JVM 和 JDK 相关题目&#xff0c;涵盖核心知识点、实际应用场景和进阶问题&#xff1a; 一、JVM 基础 1. JVM 内存模型 题目&#xff1a; 请描述 JVM 的内存模型及其组成部分&#xff0c;并说明每个区域的作用。 解析&#xff1a; JVM 内存模型分…

【系统设计【4】】设计一个限流器:从理论到实践的完整解决方案

文章目录 第一步&#xff1a;理解问题并确定设计范围1、为什么需要限流器2、需求澄清的艺术3、需求总结与优先级 第二步&#xff1a;提出高层次设计并获得认同1. 限流器的部署位置选择2. 限流算法的选择与权衡3. 高层架构设计 第三步&#xff1a;深入设计1、限流规则的设计与管…

基于DETR目标检测项目

DETR见解 DETR&#xff08;Detection Transformer&#xff09;是一种端到端的目标检测模型&#xff0c;由Facebook AI Research&#xff08;FAIR&#xff09;于2020年提出。DETR采用了Transformer架构&#xff0c;与传统的基于区域的目标检测方法有所不同&#xff0c;它通过全…

ZooKeeper 集群部署

ZooKeeper 集群部署 前言安装部署资源下载JDK 部署Zookeeper 部署 前言 在 Linux 服务器上部署 Zookeeper 之前&#xff0c;需要先安装 JDK。以下是相关版本及环境信息&#xff1a; JDK 版本 jdk-17_linux-x64_bin.tar.gz Zookeeper 部署的版本 3.5.7 操作系统版本 Red Hat E…

8.TCP Server端实现

1.C/S模型 2.Server 端功能分析 tcp_server.c #include "tcp_server.h" #include "lwip/sockets.h" #include <stdio.h>char ReadBuff[BUFF_SIZE]; /* TCP服务器任务函数 */ void vTcpserver_Task(void) {int sfd, cfd, n, i;struct sockaddr_in…

课设作业图书管理系统

用户注册&#xff0c;登录 播放地址 课设作业图书管理系统_哔哩哔哩_bilibili 对图书进行增删改查 package com.xwr.controller; import com.xwr.entity.Book; import com.xwr.entity.Category; import com.xwr.service.BookService; import com.xwr.service.CategoryServ…

springboot 配置加密

springboot 配置加密 [TOC](springboot 配置加密) 前言一、在配置类赋值之前解密二、修改赋值后加密的配置类 前言 在一些国家项目中经常会要求不能暴露数据库链接和密码, 所以需要对配置文件里面的一些配置进行加密处理。 解决方法有两种&#xff1a;一种是在配置加载后还没给…

【操作系统】macOS软件提示“已损坏,打不开”的解决方案

macOS软件提示“已损坏&#xff0c;打不开”的解决方案 在使用 macOS 系统时&#xff0c;不少用户都遇到过这样的情况&#xff1a;当尝试打开某个应用程序时&#xff0c;系统弹出提示“xxx 已损坏&#xff0c;打不开。您应该将它移到废纸篓”&#xff0c;或者显示“无法打开‘…

数据库系统概论(二十)数据库恢复技术

数据库系统概论&#xff08;二十&#xff09;数据库恢复技术 前言一、事务的基本概念1. 什么是事务&#xff1f;2. 事务的两种"打开方式"2.1 隐式事务2.2 显式事务&#xff1a;自己动手打包操作 3. 事务的四大"铁律3.1 原子性3.2 一致性3.3 隔离性3.4 持久性 4.…

java将pdf文件转换为图片工具类

一、相关依赖 <!-- PDFBox for PDF processing --><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version></dependency>二、工具类 import org.apache.pdfbox.p…

零门槛探索国产数据库硬核实力 —— 金仓数据库在线体验平台体验记

1、 金仓数据库在线体验平台 最近&#xff0c;我发现了一个超棒的数据库宝藏 —— 金仓数据库在线体验平台。它在金仓社区上线后&#xff0c;凭借 “零门槛体验 多场景交互” 的特点&#xff0c;迅速吸引了众多数据库爱好者的目光&#xff0c;我也忍不住去体验了一番。 2、 …