【Android】四大组件之Activity
目录
一、什么是Activity
二、如何创建和配置Activity
三、Activity 跳转与数据传递
四、数据保存与恢复
五、Activity 启动模式
六、自定义返回行为
七、复杂界面布局
你可以把Activity想象成手机屏幕上的一个“页面”。比如,当你打开一个App时,看到的第一个界面就是一个Activity;点击某个按钮跳转到另一个界面,那就是另一个Activity。每个Activity就是一个独立的“屏幕”,负责展示内容和与用户交互。
一、什么是Activity
Activity 是 Android 应用的核心交互组件。
1. 单屏交互容器
- 每个 Activity 对应一个独立的用户界面(UI)屏幕;
- 此界面承载用户可见的视图控件,如按钮、文本框等;
- 用户可在此界面进行交互操作,如点击、输入等。
- 应用通常包含多个 Activity,通过跳转实现不同功能界面的切换。
2. 生命周期管理
onCreate():Activity被创建时调用。通常会在这里初始化界面和变量,这时我们看到的是一片空白。
onStart():Activity即将可见时调用。此后页面可见,但用户还不能跟页面进行互动。
onResume():Activity获得焦点,用户可以与之交互时调用。
onPause():Activity失去焦点时调用。比如,用户按了Home键回到桌面,或者跳转到另一个页面,但页面还没有完全不可见。
onStop():Activity不再可见时调用。比如,你点击文章详情页跳转到了文章里面。首页面被完全覆盖。onRestart():Activity从停止状态重新启动时调用。首页Activity从后台回到前台,准备重新显示。
onDestroy():Activity被销毁时调用。比如,用户关闭了页面
3. 跨组件通信
- 使用 Intent 与其他 Activity 或组件传递数据或启动新界面。
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("key", "value");
startActivity(intent);
4. 关键功能
- 用户事件处理:监听触摸、按键等操作,响应交互逻辑。
- 界面动态更新:根据业务需求更新 UI 元素(如列表数据刷新)。
- 资源管理:在
onDestroy()
中释放数据库连接、网络请求等资源,避免内存泄漏。
5. 门店与后厨模型
- Activity 类似“门店”(直接面向用户),负责展示和接收指令;
- Service 类似“后厨”(后台处理任务),通过 Intent(“订单”)传递需求。
二、如何创建和配置Activity
1. 手动创建 Activity
- 在 Android Studio 中,右击包名(如java/com/demo)→ New → Activity → Empty Activity,输入名称(如
MainActivity
),取消勾选自动生成布局文件和主 Activity 选项。 - 自动生成的类需继承
AppCompatActivity
,并重写onCreate()
方法:
// java/com/demo/MainActivity.java
package com.demopublic class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 初始化组件和布局}@Overrideprotected void onStart() {// Activity 可见但未获取焦点}@Overrideprotected void onResume() {// 恢复交互,如重启动画}@Overrideprotected void onPause() {// 暂停耗时操作,保存临时数据}@Overrideprotected void onStop() {// 释放非必要资源}@Overrideprotected void onDestroy() {// 清理线程、关闭数据库连接和网络请求、释放资源,避免内存泄漏}
}
2. 配置布局文件
- 在
res/layout
目录新建 XML 文件(如activity_main.xml
),定义 UI 元素。 - 在 Activity 中通过
setContentView(R.layout.activity_main)
加载布局。
<?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"tools:context=".MainActivity"><!-- 顶部标题栏 --><TextViewandroid:id="@+id/tv_title"android:layout_width="match_parent"android:layout_height="60dp"android:gravity="center"android:text="用户登录"android:textSize="24sp"android:background="#3F51B5"android:textColor="#FFFFFF"/><!-- 输入区域 --><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:padding="16dp"><EditTextandroid:id="@+id/et_username"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="请输入用户名"android:inputType="text"/><EditTextandroid:id="@+id/et_password"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="12dp"android:hint="请输入密码"android:inputType="textPassword"/><Buttonandroid:id="@+id/btn_login"android:layout_width="match_parent"android:layout_height="48dp"android:layout_marginTop="24dp"android:text="立即登录"android:onClick="onLoginClick"android:backgroundTint="#2196F3"android:textColor="#FFFFFF"/></LinearLayout><!-- 底部操作区域 --><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:gravity="center"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="注册账号"android:textColor="#757575"/><Viewandroid:layout_width="1dp"android:layout_height="16dp"android:layout_marginHorizontal="12dp"android:background="#BDBDBD"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="忘记密码"android:textColor="#757575"/></LinearLayout></LinearLayout>
3. 注册 Activity
- 在
AndroidManifest.xml
中添加声明:
<activityandroid:name=".MainActivity"android:label="主界面"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
</activity>
三、Activity 跳转与数据传递
1. 显式 Intent 跳转
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("key", "value"); // 附加数据
startActivity(intent);
2. 隐式 Intent 跳转
在目标 Activity 的 Manifest 中声明:
<activity android:name=".SecondActivity"><intent-filter><action android:name="com.demo.action.ACTION_VIEW" /><category android:name="android.intent.category.DEFAULT" /></intent-filter>
</activity>
调用代码:
Intent intent = new Intent("com.demo.action.ACTION_VIEW");
startActivity(intent);// 或者
Intent intent = new Intent();
intent.setAction("com.demo.action.ACTION_VIEW");
startActivity(intent);
无需在代码中显式导入目标 Activity 的包名或类。
注意事项:
- 必须包含 DEFAULT category:隐式 Intent 的接收 Activity 需在
<intent-filter>
中声明android.intent.category.DEFAULT
,否则会触发ActivityNotFoundException
。 - 自定义 action 命名规范:如
com.demo.action.ACTION_VIEW
,避免与其他应用冲突。 - 多应用匹配处理:若多个应用声明相同
action
,系统会弹出选择器让用户选择目标应用。
3. 返回数据
使用 startActivityForResult()
启动 Activity,并在 onActivityResult()
处理返回数据。
-
MainActivity发送数据并启动新的SecondActivity。输入参数通过
Intent.putExtra()
传递。
public class MainActivity extends AppCompatActivity {// 自定义请求标识符,用于区分不同Activity的返回结果private static final int REQUEST_CODE = 1001;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btnOpen = findViewById(R.id.btn_open);btnOpen.setOnClickListener(v -> {// 1. 创建显式 IntentIntent intent = new Intent(MainActivity.this, SecondActivity.class);// 2. 传递输入参数intent.putExtra("username", "admin");intent.putExtra("max_tries", 3);// 3. 启动并等待返回结果startActivityForResult(intent, REQUEST_CODE);});}// 4. 接收返回结果的回调方法@Overrideprotected void onActivityResult(int requestCode,int resultCode,@Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_CODE) { // 匹配SecondActivity的返回结果if (resultCode == RESULT_OK && data != null) {// 5. 解析返回数据String result = data.getStringExtra("result_key");int score = data.getIntExtra("score", 0);// 6. 更新UI(示例:显示结果)TextView tvResult = findViewById(R.id.tv_result);tvResult.setText("结果: " + result + " 得分: " + score);} else {Toast.makeText(this, "用户取消操作", Toast.LENGTH_SHORT).show();}}}
}
- SecondActivity接收数据并返回结果。返回数据通过
setResult()
返回。
public class SecondActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);// 1. 接收输入参数Bundle extras = getIntent().getExtras();if (extras != null) {String username = extras.getString("username");int maxTries = extras.getInt("max_tries", 1);Log.d("DEBUG", "用户名: " + username + " 最大尝试次数: " + maxTries);}Button btnConfirm = findViewById(R.id.btn_confirm);btnConfirm.setOnClickListener(v -> {// 2. 创建返回数据的 IntentIntent resultIntent = new Intent();resultIntent.putExtra("result_key", "操作成功");resultIntent.putExtra("score", 85);// 3. 设置结果码并结束当前 ActivitysetResult(RESULT_OK, resultIntent);finish();});Button btnCancel = findViewById(R.id.btn_cancel);btnCancel.setOnClickListener(v -> {// 4. 用户取消操作的处理setResult(RESULT_CANCELED);finish();});}
}
结果码:
RESULT_OK
:操作成功完成RESULT_CANCELED
:用户取消操作- 也可自定义数值(需使用
Activity.RESULT_FIRST_USER
+ N 格式)
4. 新版 Activity Result API
Google 推荐使用 ActivityResultContracts
替代传统方式startActivityForResult():
// 在 Activity/Fragment 中初始化
ActivityResultLauncher<Intent> launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),result -> {if (result.getResultCode() == RESULT_OK) {Intent data = result.getData();// 处理返回数据}}
);// 启动 Activity
launcher.launch(new Intent(this, SecondActivity.class));
四、数据保存与恢复
1. 临时数据保存
屏幕旋转等场景,需通过 onSaveInstanceState()
保存数据,并在重建时通过 onCreate()
或 onRestoreInstanceState()
恢复。
public class MainActivity extends AppCompatActivity {private static final String KEY_COUNTER = "counter";private static final String KEY_TEXT = "user_input";private static final String KEY_USER = "user_object";private int mCounter = 0;private EditText mEditText;private User mUser; // 假设 User 类实现了 Parcelable@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mEditText = findViewById(R.id.et_input);// 方式1:通过 onCreate 恢复(推荐)if (savedInstanceState != null) {mCounter = savedInstanceState.getInt(KEY_COUNTER, 0);mEditText.setText(savedInstanceState.getString(KEY_TEXT));mUser = savedInstanceState.getParcelable(KEY_USER);Log.d("RESTORE", "通过onCreate恢复数据");}}// 方式2:通过 onRestoreInstanceState 恢复(可选)@Overrideprotected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);// 此处的 Bundle 一定非空,无需判空String tempText = savedInstanceState.getString(KEY_TEXT);if (!TextUtils.isEmpty(tempText)) {mEditText.setText(tempText);}Log.d("RESTORE", "通过onRestoreInstanceState恢复数据");}@Overrideprotected void onSaveInstanceState(@NonNull Bundle outState) {super.onSaveInstanceState(outState);// 保存基本类型outState.putInt(KEY_COUNTER, mCounter);// 保存用户输入outState.putString(KEY_TEXT, mEditText.getText().toString());// 保存自定义对象(需实现 Parcelable)if (mUser != null) {outState.putParcelable(KEY_USER, mUser);}Log.d("SAVE", "数据已保存");}// 示例按钮点击事件public void incrementCounter(View view) {mCounter++;TextView tvCounter = findViewById(R.id.tv_counter);tvCounter.setText(String.valueOf(mCounter));}
}
2. 持久化数据
建议在 onPause()
中执行保存操作。
特性 | SharedPreferences | SQLite |
---|---|---|
数据类型 | 简单键值对(基本类型、字符串) | 结构化数据(支持复杂查询) |
存储容量 | 适合小数据(KB级) | 适合大数据(MB级) |
查询能力 | 无 | 支持SQL查询、事务、索引 |
适用场景 | 用户设置、临时状态 | 用户生成内容、历史记录 |
性能表现 | 读写速度快 | 写操作较慢(需事务优化) |
a. 使用 SharedPreferences 保存数据(适合简单配置)
public class MainActivity extends AppCompatActivity {private static final String PREFS_NAME = "MyPrefs";private static final String KEY_USERNAME = "username";private static final String KEY_REMEMBER_ME = "remember_me";private EditText etUsername;private CheckBox cbRememberMe;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);etUsername = findViewById(R.id.et_username);cbRememberMe = findViewById(R.id.cb_remember);// 从 SharedPreferences 加载数据SharedPreferences prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);etUsername.setText(prefs.getString(KEY_USERNAME, ""));cbRememberMe.setChecked(prefs.getBoolean(KEY_REMEMBER_ME, false));}@Overrideprotected void onPause() {super.onPause();// 保存数据到 SharedPreferencesSharedPreferences.Editor editor= getSharedPreferences(PREFS_NAME, MODE_PRIVATE).edit();editor.putString(KEY_USERNAME, etUsername.getText().toString());editor.putBoolean(KEY_REMEMBER_ME, cbRememberMe.isChecked());editor.apply(); // 使用异步提交避免阻塞}
}
b. 使用 SQLite 保存数据(适合结构化数据)
数据库帮助类:
public class UserDbHelper extends SQLiteOpenHelper {private static final String DATABASE_NAME = "UserDatabase.db";private static final int DATABASE_VERSION = 1;// 用户表结构private static final String SQL_CREATE_ENTRIES ="CREATE TABLE " + UserContract.UserEntry.TABLE_NAME + " (" +UserContract.UserEntry._ID + " INTEGER PRIMARY KEY," +UserContract.UserEntry.COLUMN_NAME + " TEXT," +UserContract.UserEntry.COLUMN_EMAIL + " TEXT)";public UserDbHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(SQL_CREATE_ENTRIES);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 简单示例直接删除旧表db.execSQL("DROP TABLE IF EXISTS " + UserContract.UserEntry.TABLE_NAME);onCreate(db);}
}
数据操作实现:
public class MainActivity extends AppCompatActivity {private EditText etName, etEmail;private UserDbHelper dbHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);etName = findViewById(R.id.et_name);etEmail = findViewById(R.id.et_email);dbHelper = new UserDbHelper(this);loadDataFromDatabase();}private void loadDataFromDatabase() {SQLiteDatabase db = dbHelper.getReadableDatabase();Cursor cursor = db.query(UserContract.UserEntry.TABLE_NAME,null, null, null, null, null, null);if (cursor.moveToFirst()) {etName.setText(cursor.getString(cursor.getColumnIndex(UserContract.UserEntry.COLUMN_NAME)));etEmail.setText(cursor.getString(cursor.getColumnIndex(UserContract.UserEntry.COLUMN_EMAIL)));}cursor.close();}@Overrideprotected void onPause() {super.onPause();saveToDatabase();}private void saveToDatabase() {SQLiteDatabase db = dbHelper.getWritableDatabase();// 先清空旧数据(根据业务需求决定是否保留历史)db.delete(UserContract.UserEntry.TABLE_NAME, null, null);ContentValues values = new ContentValues();values.put(UserContract.UserEntry.COLUMN_NAME,etName.getText().toString());values.put(UserContract.UserEntry.COLUMN_EMAIL,etEmail.getText().toString());db.insert(UserContract.UserEntry.TABLE_NAME, null, values);}@Overrideprotected void onDestroy() {dbHelper.close(); // 必须关闭数据库连接super.onDestroy();}
}
五、Activity 启动模式
模式 | 行为描述 | 典型场景 |
---|---|---|
standard | 默认模式,每次启动创建新实例入栈,即使已存在相同Activity。 | 普通页面跳转,如列表→详情 |
singleTop | 若目标Activity在栈顶,直接复用,调用onNewIntent()。 | 避免重复推送,如通知栏点击 |
singleTask | 若栈中存在目标Activity实例,清空其上方所有实例并移至栈顶;否则,新建实例。 | 应用主页(保证唯一性) |
singleInstance | 独占新任务栈,全局唯一实例;其他应用调用时直接复用。 | 独立功能模块,如系统相机、系统拨号界面 |
1. 标准模式(默认)
<activity android:name=".DetailActivity" /> <!-- 默认无需显式声明 -->
2. 栈顶复用模式
<activity android:name=".NotificationActivity"android:launchMode="singleTop" /> <!-- 避免多次点击通知重复创建 -->
3. 任务栈内唯一模式
<activity android:name=".MainActivity"android:launchMode="singleTask" /> <!-- 应用主入口 -->
4. 全局单例模式(很少用)
<activity android:name=".CameraActivity"android:launchMode="singleInstance" <!-- 声明为全局单例模式 -->android:taskAffinity="com.example.camera.task" /> <!-- 指定独立任务栈(可选) -->
注意:
- 优先级冲突:若同时通过
Intent
标志(如FLAG_ACTIVITY_NEW_TASK
)设置启动模式,Intent
标志优先级高于AndroidManifest.xml
配置。 - 任务栈管理:
singleTask
和singleInstance
模式会显著影响任务栈结构,需结合实际业务逻辑设计。
当前主流实践推荐:核心页面(如主页)使用
singleTask
,高频复用页面(如通知页)使用singleTop
,以优化内存和用户体验。
六、自定义返回行为
基础自定义返回实现:
public class MainActivity extends AppCompatActivity {private long backPressedTime = 0;@Overridepublic void onBackPressed() {// 场景1:双击返回退出应用if (backPressedTime + 2000 > System.currentTimeMillis()) {super.onBackPressed(); // 执行默认返回finishAffinity(); // 关闭所有关联Activity} else {Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();}backPressedTime = System.currentTimeMillis();// 场景2:Fragment返回栈处理if (getSupportFragmentManager().getBackStackEntryCount() > 0) {getSupportFragmentManager().popBackStack();} else {super.onBackPressed(); // 必须调用父类方法}}
}
Android X推荐:
// 在Activity或Fragment中使用
private OnBackPressedCallback callback = new OnBackPressedCallback(true) {@Overridepublic void handleOnBackPressed() {// 自定义返回逻辑if (shouldInterceptBack()) {showExitConfirmation();} else {setEnabled(false); // 禁用当前回调requireActivity().onBackPressed(); // 触发系统返回}}
};@Override
public void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 注册返回回调(推荐在Fragment中使用)requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
}
七、复杂界面布局
1. Activity和Fragment
组件 | Activity | Fragment |
---|---|---|
核心生命周期方法 |
| 包含所有Activity方法,额外增加:
|
特有方法 | 无 | onAttach() (绑定宿主Activity)onCreateView() (创建UI视图)onDetach() (解绑宿主Activity) |
独立性 | 独立组件,可直接运行 | 依附于宿主Activity,不可独立存在 |
组件定位 | 系统级交互单元(处理权限、窗口管理等) | UI模块化组件(实现跨Activity界面复用与动态组合) |
2. 典型架构
架构模式 | 适用场景 | 优势 |
---|---|---|
单 Activity 架构 | 复杂导航流程、深度链接 | 统一管理导航、更好的状态恢复 |
多 Activity 架构 | 独立功能模块、不同任务栈需求 | 明确职责划分、方便权限管理 |
混合架构: 单Activity+多Fragment模式 多模块Activity+多Fragment模式 | 大型项目、模块化开发 | 灵活组合、便于团队协作 |
相关文章:
【Android】四大组件之Activity
目录 一、什么是Activity 二、如何创建和配置Activity 三、Activity 跳转与数据传递 四、数据保存与恢复 五、Activity 启动模式 六、自定义返回行为 七、复杂界面布局 你可以把Activity想象成手机屏幕上的一个“页面”。比如,当你打开一个App时,…...
数据库原理(1)
第一章 概论 一、基本概念 数据(Data)是数据库中存储的基本对象,描述事物的符号记录。例如学生的学号、姓名等信息都是数据。 数据库(Database,DB)长期存储在计算机内、有组织的、可共享的大量数据的集合。…...
SQL盲注问题深度解析与防范策略
引言 在当今互联网时代,Web应用程序的安全性是重中之重。SQL注入作为一种常见且极具威胁性的攻击手段,而其中的SQL盲注更是因其隐蔽性强、难以察觉而备受关注。攻击者借助SQL盲注,在无法直接获取数据库返回结果的情况下,通过精心构造特殊的SQL语句,利用页面的不同响应来逐…...
Android JIT( ART即时编译器),Just In Time Compiler,即时编译技术
Android JIT( ART即时编译器),Just In Time Compiler,即时编译技术 Android Runtime (ART) 包含一个具备代码分析功能的即时 (JIT) 编译器,该编译器可以在 Android 应用运行时持续提高其性能。JIT是Just In Time Compiler…...
当自动驾驶遇上“安全驾校”:NVIDIA如何用技术给无人驾驶赋能?
自动驾驶技术的商业化落地,核心在于能否通过严苛的安全验证。国内的汽车企业其实也在做自动驾驶,但是吧,基本都在L2级别。换句话说就是在应急时刻内,还是需要人来辅助驾驶,AI驾驶只是决策层,并不能完全掌握…...
Unity中数据储存
在Unity项目开发中,会有很多数据,有需要保存到本地的数据,也有直接保存在缓存中的临时数据,一般为了方便整个项目框架中各个地方能调用需要的数据,因此都会实现一个数据工具或者叫数据管理类,用来管理项目中所有的数据。 首先保存在缓存中的数据,比如用户信息,我们只需…...
【C++11】可变参数模板
前言: 上文我们学到右值引用及其移动语义,学习到了C11中对性能提升对重要的更新之一。C11进阶之路:右值引用和移动语义,让代码跑得更快!-CSDN博客 本文我们来讲讲,C11的下一个新语法:可变参数模…...
c语言知识整理
一 数据的存储 对于整形的存储 无论是正负在存储中都是使用补码进行存储的 那个一个数字的补码在转换正负时不同的 对于存储中 首位一定是符号位 如果是0 那么是正数 如果是1 那么是负数 (32位 除符号位 缺少的位数使用0补齐) 如果是正数 …...
算法习题-力扣446周赛题解
算法可以调度思维,让程序员的思维发散,找到更好的解决方案。 第一题:执行指令后的得分 题目: 给你两个数组:instructions 和 values,数组的长度均为 n。你需要根据以下规则模拟一个过程: 从下标…...
基于共享上下文和自主协作的 RD Agent 生态系统
在llmangentmcp这个框架中: LLM: 依然是智能体的“大脑”,赋予它们理解、推理、生成和规划的能力,并且也用于处理和利用共享上下文。Agent: 具备特定 R&D 职能的自主单元,它们感知共享上下文࿰…...
Operating System 实验五 进程管理编程实验
实验目标: 写个多线程的程序,重现竞争条件,并通过信号量或者互斥量,解决临界区问题某工厂有两个生产车间和一个装配车间,两个生产车间分别生产A、B两种零件,装配车间的任务是把A、B两种零件组装成产品。两个生产车间每生产一个零件后,都要分别把它们送到装配车间的货架F…...
Deep Reinforcement learning for real autonomous mobile robot navigation
https://www.youtube.com/watch?vKyA2uTIQfxw AI Learns to Park - Deep Reinforcement Learning https://www.youtube.com/watch?vVMp6pq6_QjI Q Learning simply explained | SARSA and Q-Learning Explanation https://www.youtube.com/watch?vMI8ByADM…...
计算机网络 | 应用层(4)--DNS:因特网的目录服务
💓个人主页:mooridy-CSDN博客 💓文章专栏:《计算机网络:自定向下方法》 大纲式阅读笔记_mooridy的博客-CSDN博客 🌹关注我,和我一起学习更多计算机网络的知识 🔝🔝 目录 …...
WPF核心技术解析与使用示例
WPF核心技术解析与使用示例 一、依赖属性(Dependency Property)详解 1. 依赖属性基础 核心概念: 依赖属性是WPF实现数据绑定、样式、动画等特性的基础通过属性系统实现高效的内存管理和值继承标准定义模式: public class MyControl : Control {// 1. 定义…...
JVM运行机制全景图:从源码到执行的全过程
JVM运行机制全景图:从源码到执行的全过程 引言:你真的了解 Java 是怎么跑起来的吗? 许多开发者写完 Java 代码之后,就交给编译器和运行时去“神奇”地执行了。但你有没有想过,一段 .java 文件是如何一步步变成可运行的程序?今天,我们就从 源码 ➝ 字节码 ➝ 类加载 ➝…...
使用 AFL++ 对 IoT 二进制文件进行模糊测试 - 第二部分
在上一部分中,我们研究了如何使用 AFL++ 对简单的物联网二进制文件进行模糊测试。这些程序接受来自文件的输入,并且易于模糊测试。 在本文中,我们将研究套接字二进制文件。使用套接字进行网络通信的模糊测试二进制文件与使用基于文件 I/O 的模糊测试二进制文件不同。Vanill…...
在华为云平台上使用 MQTT 协议:构建高效可靠的物联网通信
🌐 在华为云平台上使用 MQTT 协议:构建高效可靠的物联网通信 随着物联网(IoT)技术的发展,设备间的高效通信变得尤为重要。MQTT(Message Queuing Telemetry Transport)作为一种轻量级的消息传输…...
基于STM32的物流搬运机器人
功能:智能循迹、定距夹取、颜色切换、自动跟随、自动避障、声音夹取、蓝牙遥控、手柄遥控、颜色识别夹取、循迹避障、循迹定距…… 包含内容:完整源码、使用手册、原理图、视频演示、PPT、论文参考、其余资料 资料只私聊...
H.264/AVC标准主流开源编解码器编译说明
An artisan must first sharpen his tools if he is to do his work well. 工欲善其事,必先利其器. 前言 想研究和学习H.264/AVC视频编解码标准的入门的伙伴们,不论是学术研究还是工程应用都离不开对源码的分析,因此首要工作是对各类编解码器进行编译,本文针对主流的一些符…...
Xilinx FPGA支持的FLASH型号汇总
以博主这些年的FPGA开发使用经验来看,FPGA开发的主流还是以Xilinx FPGA为主,贸易战关税战打了这么多年,我们做研发的也不可避免的要涉及一些国产替代的工作;这里把Xilinx FPGA官方支持的各类(国产和非国产)…...
【C++ 类和数据抽象】消息处理示例(1):从设计模式到实战应用
目录 一、数据抽象概述 二、消息处理的核心概念 2.1 什么是消息处理? 2.2 消息处理的核心目标 三、基于设计模式的消息处理实现 3.1 观察者模式(Observer Pattern) 3.2 命令模式(Command Pattern) 四、实战场景…...
LiveCharts.WPF图表模块封装
WPF LiveCharts.WPF 封装实现 下面是一个完整的 WPF LiveCharts.WPF 封装实现,提供了常用图表的简单使用方式,并支持数据绑定和更新。 一、LiveCharts.WPF 封装类 1. 图表基类 (ChartBase.cs) using LiveCharts; using LiveCharts.Wpf; using System.Collections.Generic;…...
微信小程序,基于uni-app的轮播图制作,轮播图本地文件图片预览
完整代码 <template><swiper class"banner" indicator-dots circular :autoplay"false"><swiper-item v-for "item in picture" :key"item.id"><view><image tap"onPreviewImage(item.img)" :…...
【QQmusic】复习笔记第四章分点讲解
4.1 音乐加载 功能概述 该部分实现了从本地磁盘加载音乐文件到程序中,并在界面上显示的功能。通过QFileDialog类创建文件选择对话框,用户可选择多个音乐文件,程序筛选出有效音频文件后,交由MusicList类管理,并更新到…...
设置右键打开VSCode
在日常的开发工作中,VSCode 是一款非常受欢迎的代码编辑器。为了更加便捷地使用它,我们可以将 VSCode 添加到右键菜单中,这样只需右键点击文件或文件夹,就能快速用 VSCode 打开,极大地提高工作效率。下面我就来介绍一下…...
数据结构和算法(八)--2-3查找树
目录 一、平衡树 1、2-3查找树 1.1、定义 1.2、查找 1.3、插入 1.3.1、向2-结点中插入新键 1.3.2、向一棵只含有一个3-结点的树中插入新键 1.3.3、向一个父结点为2-结点的3-结点中插入新键 1.3.4、向一个父结点为3-结点的3-结点中插入新键 1.3.5、分解根结点 1.4、2…...
JSAPI2.4——正则表达式
一、语法 const str 一二三四五六七八九十 //判断内容 const reg /二/ //判断条件 console.log(reg.test(str)); //检查 二、test与exec方法的区别 test方法:用于判断是否符合规则的字符串,返回值是布尔值 exec方法&…...
FPGA 100G UDP纯逻辑协议栈
随着器件等级的升高,高速serdes的线速率也随之提高,RFSOC 4x最大可支持100G,主流方案为RDMA方案,该方案相对比较复杂,除了需要负责逻辑端的开发,还需操作系统中开发RDMA的驱动,对于对丢包不那么…...
分享一个可以批量巡检GET和POST接口的Shell脚本
一、场景痛点与需求分析 在分布式系统架构中,服务接口的可用性和稳定性直接影响业务连续性。当面临以下场景时,需批量巡检GET和POST接口: 上线验证:新版本发布后批量验证核心接口 故障恢复:异常数据修复后的批量重试…...
机器学习之一:机械式学习
正如人们有各种各样的学习方法一样,机器学习也有多种学习方法。若按学习时所用的方法进行分类,则机器学习可分为机械式学习、指导式学习、示例学习、类比学习、解释学习等。这是温斯顿在1977年提出的一种分类方法。 有关机器学习的基本概念,…...
区分PROJECT_SOURCE_DIR, CMAKE_SOURCE_DIR,CMAKE_CURRENT_SOURCE_DIR
目录 示例工程 PROJECT_SOURCE_DIR的行为 CMAKE_SOURCE_DIR的行为 CMAKE_CURRENT_SOURCE_DIR 示例工程 根目录 |-----CMakeLists.txt |-----sub1 |--------CMakeLists.txt |-----sub2 |--------CMakeLists.txt 根目录下的CMakeList.txt: project(main)message("main …...
Python循环结构深度解析与高效应用实践
引言:循环结构在编程中的核心地位 循环结构作为程序设计的三大基本结构之一,在Python中通过while和for-in两种循环机制实现迭代操作。本文将从底层原理到高级应用,全面剖析Python循环机制的使用技巧与优化策略,助您掌握高效迭代的…...
25【干货】在Arcgis中根据字段属性重新排序并自动编号的方法(二)
上一篇关于属性表自动编号的文章因为涉及到代码(【干货】在Arcgis中根据字段属性重新排序并自动编号的方法(一)),担心大家有些东西确实不熟悉,今天就更新一篇不需要代码也能达到这个目的的方法。主要的思路…...
SinSR模型剪枝实验报告
SinSR模型剪枝实验报告 实验概述 我成功地对SinSR模型进行了L1范式剪枝,剪枝比例为50%。通过分析剪枝前后的模型参数和性能,我们得出了以下结论。 剪枝实现方法 创建专用的main_prune.py脚本,用于剪枝训练。创建quick_prune.py脚本&#…...
IT社团分析预测项目(pandas、numpy、sklearn)
IT社团人数的增长陷入迟滞,同时不同目标任务和不同经营模式的社团更是层出不穷。在面临内忧外患的情况下,本社团希望结合社团行业现状,分析同学和出勤的数据,挖据数据中的信息,通过对人数流失进行预测寻找到相应的对策…...
C语言中位段的应用
一,位段的主要应用场景 硬件寄存器操作 嵌入式开发中,硬件寄存器通常以位为单位控制设备状态。位段可直接映射到寄存器,简化位操作: typedef struct {unsigned int enable : 1; // 使能位unsigned int mode : 3; // 模式选择&…...
【Linux网络#1】:网络基础知识
1、网络发展 在计算机发展历程中,经历过下面四个阶段: 1.独立模式 独立模式:计算机之间相互独立,每台计算机做自己的事情,彼此之间没有直接信息传递。如果两台计算机需要通信就需要将当前计算机的数据通过某种方式拷贝…...
基于物联网的园林防火监测系统
标题:基于物联网的园林防火监测系统 内容:1.摘要 随着全球气候变化和人类活动影响,园林火灾发生频率呈上升趋势,给生态环境和人类生命财产造成巨大损失。为有效预防和应对园林火灾,本文提出基于物联网的园林防火监测系统。该系统综合运用传感…...
华为云loT物联网介绍与使用
🌐 华为云 IoT 物联网平台详解:构建万物互联的智能底座 随着万物互联时代的到来,物联网(IoT)已成为推动数字化转型的关键技术之一。华为云 IoT 平台(IoT Device Access)作为华为云的核心服务之…...
Redis 数据类型全览:特性、场景与操作实例
Redis 是一款开源的内存数据库,支持多种数据类型,以下是对常见 Redis 数据类型的介绍: 1. String(字符串) 描述 字符串是 Redis 里最基础的数据类型,其值可以是简单的字符串、数字,甚至是二进…...
Qt动态库信号崩溃问题解决方案
在Qt中,当动态库向主程序发送信号导致崩溃时,通常涉及线程安全或对象生命周期问题。以下是逐步解决方案: 1. 检查线程上下文 问题:动态库所在的线程与主程序线程不同,跨线程信号未正确处理。解决方案: 显式…...
Go设计模式-观察者模式
简介 在软件开发中,我们常常会遇到这样的场景:一个对象的状态变化需要通知到多个其他对象,让它们做出相应的反应。观察者模式(Observer Pattern)就是解决这类问题的一种设计模式。在 Go 语言中,由于其简洁…...
《TCP/IP详解 卷1:协议》之第七、八章:Ping Traceroute
目录 一、ICMP回显请求和回显应答 1、ICMP回显请求 2、ICMP回显应答 二、ARP高速缓存 三、IP记录路由选项(Record Route,RR) 1、记录路由选项的工作过程 2、RR 选项的 IP 头部格式 2.1、RR 请求 2.2、RR响应 四、ping 的去返路径 五…...
Unity任务系统笔记
数据结构设计 任务基类包括的字段: string 任务内容; Transform 任务目的地; MyCharacter 任务开启后要更新对话的NPC; MyTalkData 任务开启后相关NPC要说的对话数据; 共同方法:开启任务、完成任务。…...
Three.js + React 实战系列-3D 个人主页:构建 Hero 场景组件(项目核心)✨
在本节中,我们将完成整个 3D 主业项目中最核心的组件 —— Hero.jsx。 这个组件作为首页的主视觉部分,整合了 3D 模型、动画相机、交互按钮与自适应布局,构建出一个立体、酷炫、可交互的主场景。 前置准备: ✅安装依赖ÿ…...
线程池(二):深入剖析synchronized关键字的底层原理
线程池(二):深入剖析synchronized关键字的底层原理 线程池(二):深入剖析synchronized关键字的底层原理一、基本使用1.1 修饰实例方法1.2 修饰静态方法1.3 修饰代码块 二、Monitor2.1 Monitor的概念2.2 Moni…...
网络原理 - 9
目录 数据链路层 以太网 以太网帧格式 MAC 地址 DNS(Domain Name System) 完! 数据链路层 这里的内容也是简单了解,除非是做交换机开发,一般程序员不需要涉及~~ 以太网 ”以太网“不是一种具体的网络…...
springboot入门-业务逻辑核心service层
在 Spring Boot 中,Service 层是业务逻辑的核心,负责协调数据访问层(Repository 或 Mapper)和控制器层(Controller),处理业务规则、事务管理以及数据转换。以下是 Service 层的详细说明、常用注…...
在RHEL 10上安装和配置TFTP服务器(不使用xinetd)
RHEL10已经废弃xinetd,使用下面的方式安装配置TFTP服务器。 1. 安装TFTP服务器和客户端 sudo dnf install tftp-server tftp -y 2. 配置TFTP服务器 创建TFTP根目录并设置权限 sudo mkdir -p /var/lib/tftpboot sudo chmod -R 777 /var/lib/tftpboot sudo chown -R…...
AIGC在游戏开发中的革命:自动化生成3A级游戏内容
一、智能游戏开发架构 1.1 传统开发痛点与AIGC创新 开发环节 传统痛点 AIGC解决方案 角色原画设计 美术资源产能瓶颈 文生图3D模型自动生成 场景搭建 重复劳动占比高 程序化生成风格迁移 NPC行为设计 模式化严重 强化学习驱动智能行为 任务系统 剧情线性缺乏变化 动态剧情生成系…...