【Android】碎片—动态添加、创建Fragment生命周期、通信

简单用法

在一个活动中添加两个碎片,并让这两个碎片平分活动空间

先新建一个左侧碎片布局和一个右侧碎片布局

左侧碎片

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="Button"/></LinearLayout>

右侧碎片

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:background="#00ff00"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:textSize="20sp"android:text="这是文本"/></LinearLayout>

然后新建一个LeftFragment类和一个RightFragment类继承Fragment

package com.example.fragmentpractice;import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;public class LeftFragment extends Fragment {@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.left_fragment, container, false);return view;}
}
package com.example.fragmentpractice;import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;public class RightFragment extends Fragment {@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.right_fragment, container, false);return view;}
}

修改activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><fragmentandroid:id="@+id/left_fragment"android:name="com.example.fragmentpractice.LeftFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><fragmentandroid:id="@+id/right_fragmgent"android:name="com.example.fragmentpractice.RightFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1" /></LinearLayout>

使用了<fragment>添加碎片,需要用android:name属性来显示指明要添加的碎片类名

动态添加碎片

步骤

  1. 创建待添加的碎片实例
  2. 获取FragmentManager,在活动中可直接通过调用getSupportFragmentManager()方法得到
  3. 开启一个事务,通过调用beginTransaction()方法开启
  4. 向容器内添加或替换碎片,一般使用replace()方法实现,需要传入容器的id和待添加的碎片实例
  5. 提交事务,调用commit()方法来完成

代码

新建another_rigth_fragment

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:background="#ffff00"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:textSize="20sp"android:text="这是另一个文本"/></LinearLayout>

创建AnotherRightFragment(和之前的操作一样)

package com.example.fragmentpractice;import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;public class AnotherRightFragment extends Fragment {@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.another_right_fragment, container, false);return view;}
}

修改activity_main代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><fragmentandroid:id="@+id/left_fragment"android:name="com.example.fragmentpractice.LeftFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><FrameLayoutandroid:id="@+id/right_layout"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"></FrameLayout></LinearLayout>

修改MainActivity中的代码

package com.example.fragmentpractice;import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;// 主活动类,继承自 AppCompatActivity,并实现 View.OnClickListener 接口
public class MainActivity extends AppCompatActivity implements View.OnClickListener {// 活动创建时调用@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 启用 Edge-to-Edge 模式EdgeToEdge.enable(this);// 设置活动的布局setContentView(R.layout.activity_main);// 找到布局中的按钮Button button = (Button) findViewById(R.id.button);// 为按钮设置点击监听器button.setOnClickListener(this);// 初始化时替换碎片replaceFragment(new RightFragment());}// 点击事件处理@Overridepublic void onClick(View v) {if (v.getId() == R.id.button) {// 当按钮被点击时,替换碎片replaceFragment(new AnotherRightFragment());}}// 替换碎片的方法private void replaceFragment(Fragment fragment) {// 获取 FragmentManagerFragmentManager fragmentManager = getSupportFragmentManager();// 开始一个新的事务FragmentTransaction transaction = fragmentManager.beginTransaction();// 替换指定布局中的碎片transaction.replace(R.id.right_layout, fragment);// 提交事务transaction.commit();}
}

在碎片中模拟返回栈

在上面的例子中,点击按钮后返回会直接退出,如果想让他返回到上一个界面得模仿类似于栈的效果

只需要给MainActivity中的replaceFragment中添加:

transaction.replace(R.id.right_layout, fragment);

就行了。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);Button button = (Button) findViewById(R.id.button);button.setOnClickListener(this);replaceFragment(new RightFragment());}@Overridepublic void onClick(View v) {if (v.getId() == R.id.button) {replaceFragment(new AnotherRightFragment());}}private void replaceFragment(Fragment fragment) {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction transaction = fragmentManager.beginTransaction();transaction.replace(R.id.right_layout, fragment);transaction.addToBackStack(null);transaction.commit();}
}

碎片与活动之间的通信

FragmentManager提供了一个类似于findViewById()的方法,用于从布局文件中获取碎片的实例:

RightFragment rightFragment = (RightFragment) getSupportFragmentManager().findFragmentById(R.id.right_layout);

碎片的生命周期

onAttach()

  • 用法:当 Fragment 与 Activity 关联时调用。
  • 常用操作:初始化需要与 Activity 交互的组件或回调,确保 Fragment 与其宿主 Activity 之间的通信。

onCreate()

  • 用法:Fragment 被创建时调用。
  • 常用操作:初始化不与 UI 相关的资源,如创建或恢复数据、启动后台线程等。

onCreateView()

  • 用法:为 Fragment 创建视图层次结构时调用。
  • 常用操作:通过 LayoutInflater 填充 Fragment 的布局,初始化与视图相关的资源。

onActivityCreated()

  • 用法:确保与 Activity 相关的工作已经完成时调用。
  • 常用操作:在 Activity 的 onCreate() 方法执行完成后调用,可以在这里与 Activity 交互。

onStart()

  • 用法:Fragment 可见时调用。
  • 常用操作:注册任何需要在 Fragment 可见时工作的广播接收器或其他组件。

onResume()

  • 用法:Fragment 准备与用户交互时调用。
  • 常用操作:恢复暂停的 UI 更新或交互。

onPause()

  • 用法:Fragment 不再与用户交互时调用。
  • 常用操作:暂停与 UI 相关的操作,保存重要数据或状态。

onStop()

  • 用法:Fragment 不再可见时调用。
  • 常用操作:停止耗时的操作,如动画或播放视频,注销在 onStart() 中注册的广播接收器。

onDestroyView()

  • 用法:销毁 Fragment 的视图层次结构时调用。
  • 常用操作:清理与视图相关的资源,避免内存泄漏。

onDestroy()

  • 用法:销毁 Fragment 时调用。
  • 常用操作:清理所有资源,包括后台线程、数据和其他持有的资源。

onDetach()

  • 用法:Fragment 与 Activity 解除关联时调用。
  • 常用操作:清理与 Activity 相关的资源或回调,确保 Fragment 可以正确地与新的 Activity 关联。

image-20240722112404028

动态加载布局

使用限定符

修改activity_main文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><fragmentandroid:id="@+id/left_fragment"android:name="com.example.fragmentpractice.LeftFragment"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>

只留下一个左侧碎片

在res目录下新建layout-large文件夹,在这个文件夹下新建一个布局,也叫做activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><fragmentandroid:id="@+id/left_fragment"android:name="com.example.fragmentpractice.LeftFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><fragmentandroid:id="@+id/right_fragment"android:name="com.example.fragmentpractice.RightFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="3"/></LinearLayout>

添加方法如下:

image-20240722121554656

使用最小宽度限定符

在res目录下新建layout-sw600dp文件夹,新建activity_main布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><fragmentandroid:id="@+id/left_fragment"android:name="com.example.fragmentpractice.LeftFragm25ent"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><fragmentandroid:id="@+id/right_fragment"android:name="com.example.fragmentpractice.RightFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="3"/>
</LinearLayout>

当程序运行在屏幕宽度大于等于600dp的设备上,会加载layout-sw600dp/activity_main布局,小于600dp加载默认的layout/activity_main布局

创建Fragment的生命周期

静态创建

  1. Fragment Constructor、onInflate、onCreate
  • Fragment Constructor
    • 当Fragment实例化时,调用其构造函数。此时可以进行一些初始设置,但不应涉及视图创建或其他可能耗时的操作。
  • onInflate
    • 当Fragment需要从布局文件中加载视图时调用。此时可以进行视图的初步配置。该方法在Fragment被附加到Activity之前调用。
  • onCreate
    • Fragment在创建时调用。此时可以进行非视图相关的初始化工作,比如初始化变量、设置配置等。
  1. Activity onCreate
  • 当Activity首次创建时调用。在这个方法中,通常会进行视图的初始化、设置事件监听器、初始化数据等操作。这是Activity生命周期中非常重要的一个方法。

动态创建

  1. Activity onCreate
  • 同静态创建中描述的一样,Activity在首次创建时调用onCreate方法。动态创建Fragment的步骤一般在这里进行,比如通过FragmentManager添加、替换Fragment。
  1. Fragment Constructor、onCreate
  • Fragment Constructor
    • 与静态创建类似,动态创建时Fragment实例化时也会调用构造函数进行初始设置。
  • onCreate
    • Fragment在创建时调用。动态创建时,可以在这里进行Fragment的初始化工作,比如从Activity传递过来的数据进行处理。与静态创建不同的是,这里通常会涉及到从Activity获取数据或传递数据给Activity。

工具

Fragment Transaction

Fragment Transaction是管理和操作Fragments的关键工具。

常用方法

  1. add():添加一个Fragment到Activity中。

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.add(R.id.fragment_container, new ExampleFragment());
    transaction.commit();
    
  2. replace():替换当前的Fragment。

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_container, new ExampleFragment());
    transaction.addToBackStack(null); // 可选,将事务添加到返回栈
    transaction.commit();
    
  3. remove():从Activity中移除一个Fragment。

    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
    if (fragment != null) {FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();transaction.remove(fragment);transaction.commit();
    }
    
  4. hide():隐藏一个Fragment。

  5. show():显示一个隐藏的Fragment。

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.hide(existingFragment);
    transaction.show(newFragment);
    transaction.commit();
    
  6. attach():重新附加一个Fragment到UI。

  7. detach():从UI中分离一个Fragment。

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.detach(existingFragment);
    transaction.attach(existingFragment);
    transaction.commit();
    
  8. addToBackStack():将事务添加到返回栈中,以便用户可以按返回键撤销该事务。

  9. commit():提交事务。

// 获取FragmentManager
FragmentManager fragmentManager = getSupportFragmentManager();// 开始一个事务
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();// 创建一个新的Fragment实例
Fragment fragment = new ExampleFragment();// 添加Fragment到容器
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.addToBackStack(null); // 可选,将事务添加到返回栈
fragmentTransaction.commit(); // 提交事务

Fragment Manager

常用方法

  1. findFragmentById(int id):通过Fragment的容器视图ID来查找Fragment。

    FragmentManager fragmentManager = getSupportFragmentManager();
    Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);if (fragment != null) {// 找到的Fragment实例
    }
    
  2. findFragmentByTag(String tag):通过Fragment的标签(tag)来查找Fragment。

    FragmentManager fragmentManager = getSupportFragmentManager();
    Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);if (fragment != null) {// 找到的Fragment实例
    }
    
  3. getFragments():获取当前FragmentManager中所有的Fragment(API Level 26及以上可用)。

    FragmentManager fragmentManager = getSupportFragmentManager();
    List<Fragment> fragments = fragmentManager.getFragments();for (Fragment fragment : fragments) {// 处理每个Fragment实例
    }
    

增删查替

Fragment的增删查替是通过FragmentManagerFragmentTransaction来实现的

增加

添加一个Fragment到Activity中

  1. 获取FragmentManager:

    FragmentManager fragmentManager = getSupportFragmentManager();
    
  2. 开启一个事务:

    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    
  3. 添加Fragment:

    MyFragment myFragment = new MyFragment();
    fragmentTransaction.add(R.id.fragment_container, myFragment);
    
  4. 提交事务:

    fragmentTransaction.commit();
    

删除

从Activity中移除一个Fragment

  1. 获取FragmentManager:

    FragmentManager fragmentManager = getSupportFragmentManager();
    
  2. 找到要移除的Fragment:

    MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.fragment_container);
    
  3. 开启一个事务:

    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    
  4. 移除Fragment:

    if (myFragment != null) {fragmentTransaction.remove(myFragment);
    }
    
  5. 提交事务:

    fragmentTransaction.commit();
    

查找

根据ID或标签查找Fragment

  1. 获取FragmentManager:

    FragmentManager fragmentManager = getSupportFragmentManager();
    
  2. 根据ID查找:

    MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.fragment_container);
    
  3. 根据标签查找:

    MyFragment myFragment = (MyFragment) fragmentManager.findFragmentByTag("MY_FRAGMENT_TAG");
    

替换

替换Activity中的一个Fragment

  1. 获取FragmentManager:

    FragmentManager fragmentManager = getSupportFragmentManager();
    
  2. 开启一个事务:

    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    
  3. 替换Fragment:

    MyNewFragment newFragment = new MyNewFragment();
    fragmentTransaction.replace(R.id.fragment_container, newFragment);
    
  4. 提交事务:

    fragmentTransaction.commit();
    

Fragment与Activity之间的通信

Activity向Fragment

  1. 在Activity中设置数据:

    使用Fragment的setArguments方法来传递数据。在创建Fragment实例时,可以通过Bundle将数据传递给Fragment。

// 在Activity中
Bundle bundle = new Bundle();
bundle.putString("key", "value");MyFragment myFragment = new MyFragment();
myFragment.setArguments(bundle);getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, myFragment).commit();
  1. 在Fragment中接收数据:

    在Fragment的onCreate方法中获取传递过来的数据。

// 在Fragment中
@Override
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (getArguments() != null) {String value = getArguments().getString("key");// 使用获取到的数据}
}

Fragment向Activity

  1. 定义一个接口:

    在Fragment中定义一个接口,Activity实现该接口来接收数据。

// 在Fragment中定义接口
public interface OnFragmentInteractionListener {void onFragmentInteraction(String data);
}private OnFragmentInteractionListener mListener;@Override
public void onAttach(Context context) {super.onAttach(context);if (context instanceof OnFragmentInteractionListener) {mListener = (OnFragmentInteractionListener) context;} else {throw new RuntimeException(context.toString()+ " must implement OnFragmentInteractionListener");}
}// 使用接口传递数据
public void sendDataToActivity(String data) {if (mListener != null) {mListener.onFragmentInteraction(data);}
}
  1. 在Activity中实现接口:

    实现Fragment定义的接口,在接口方法中处理接收到的数据。

// 在Activity中实现接口
public class MyActivity extends AppCompatActivity implements MyFragment.OnFragmentInteractionListener {@Overridepublic void onFragmentInteraction(String data) {// 处理从Fragment接收到的数据}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);MyFragment myFragment = new MyFragment();getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, myFragment).commit();}
}

Fragment之间的数据传递

Fragment之间的通信可以通过它们共同的Activity来实现。一个Fragment将数据传递给Activity,然后Activity将数据传递给另一个Fragment。

1.Fragment A 向 Activity 传递数据

使用上面描述的Fragment向Activity传递数据的方法。

2.Activity 接收数据并传递给 Fragment B

在Activity中接收数据:

@Override
public void onFragmentInteraction(String data) {FragmentB fragmentB = (FragmentB) getSupportFragmentManager().findFragmentById(R.id.fragment_b_container);if (fragmentB != null) {fragmentB.updateData(data);}
}

在Fragment B中定义方法来接收数据:

// 在Fragment B中
public void updateData(String data) {// 更新Fragment B中的数据
}

已经到底啦!

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

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

相关文章

Unity Android接入SDK 遇到的问题

1. buildtools、platformtools、commandline tools 以及compiled sdk version、buildtools sdk version、target sdk version 的说明 Android targetSdkVersion了解一下 - 简书 2. 查看.class 和.jar文件 jd_gui 官网地址&#xff1a; 下载jd_gui 工具 &#xff0c;或者 idea 下…

ITK-均值滤波

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 均值滤波原理 均值滤波是一种常用的图像平滑技术&#xff0c;用于减少图像中的噪声。其基本原理是通过计算图像中每个像素及其邻…

linux ftp操作记录

一.ftp 创建用户 passwd: user ftpuser does not exist 如果你遇到 passwd: user ftpuser does not exist 的错误&#xff0c;这意味着系统中不存在名为 ftpuser 的用户。你需要首先确认FTP用户是否是系统用户&#xff0c;还是FTP服务器软件&#xff08;如Pure-FTPd&#xff…

【React】通过实际示例详解评论列表渲染和删除

文章目录 一、引言二、初始状态与状态更新1. 使用useState钩子管理状态2. 评论列表的初始数据 三、列表渲染的实现1. list.map(item > { ... })2. return 语句3. JSX 语法4. 为什么这样设计5. 完整解读 四、列表项的唯一标识1. key 的作用2. key 的用法3. 可以没有 key 吗&a…

【Stable Diffusion】(基础篇五)—— 使用SD提升分辨率

使用SD提升分辨率 本系列博客笔记主要参考B站nenly同学的视频教程&#xff0c;传送门&#xff1a;B站第一套系统的AI绘画课&#xff01;零基础学会Stable Diffusion&#xff0c;这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilibili 在前期作画的…

c++ 构造函数与析构函数

本文参考菜鸟教程&#xff0c;仅作笔记用。 构造函数 构造函数&#xff08;Constructor&#xff09;是一种特殊的方法&#xff0c;用于在创建对象时进行初始化操作。构造函数的名称与类的名称是完全相同的&#xff0c;并且不会返回任何类型&#xff0c;也不会返回 void。在面…

Pytorch使用教学4-张量的索引

1 张量的符号索引 张量也是有序序列&#xff0c;我们可以根据每个元素在系统内的顺序位置&#xff0c;来找出特定的元素&#xff0c;也就是索引。 1.1 一维张量的索引 一维张量由零维张量构成 一维张量索引与Python中的索引一样是是从左到右&#xff0c;从0开始的&#xff…

搭建NFS、web、dns服务器

目录 1、搭建一个nfs服务器&#xff0c;客户端可以从该服务器的/share目录上传并下载文件 服务端配置&#xff1a; 客户端测试&#xff1a; 2、搭建一个Web服务器&#xff0c;客户端通过www.haha.com访问该网站时能够看到内容:this is haha 服务端配置&#xff1a; 客户端…

【Web爬虫逆向】“企业预警通”模糊查询公司信息,逆向案例实战

“企业预警通”模糊查询公司信息&#xff0c;逆向案例实战 功能介绍效果演示思路分析1、先找到模糊查询的接口2、分析headers与params中参数并进行构造3、JS逆向&#xff0c;跟栈&#xff0c;找到js中key和dataCategory的生成方法&#xff0c;并完成js补码构造4、成功还原key后…

UART编程框架详解

1. UART介绍 UART&#xff1a;通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;简称串口。 调试&#xff1a;移植u-boot、内核时&#xff0c;主要使用串口查看打印信息 外接各种模块 1.1 硬件知识_UART硬件介绍 UART的全称是Unive…

新160个crackme - 011-wocy.1

运行分析 显示Unregister&#xff0c;点击注册无反应&#xff0c;猜测要先注册 PE分析 C 程序&#xff0c;32位&#xff0c;无壳 静态分析 ida发现关键字符串&#xff0c;进入关键函数 动态调试 设置断点动态调试&#xff0c;CWnd::UpdateData(true) &#xff1a;用于将屏幕上控…

MATLAB基础:数据和变量

今天我们开始学习MATLAB基础知识 1、常用非运算符及其作用 1、“,” 作为程序运行的分隔符&#xff0c;起到分隔语句的作用 2、“;” 同样作为分隔符&#xff0c;与“,”不同的是“;”会在程序运行时隐藏该行语句 如下图&#xff1a; 3、“...” 三个英文句点表示续行符…

W30-python03-pytest+selenium+allure访问百度网站实例

此篇文章为总结性&#xff0c;将pystest、selenium、allure结合起来 功能如下&#xff0c;web自动化&#xff0c;输入baidu网站&#xff0c;搜索“雷军”、打开网页中第一条内容 pytestsel.py如下&#xff1a; import time import re import allure import pytest from tools…

提升ROI:利用高级爬虫技术优化营销策略

如何通过高级爬虫技术高效提升营销ROI&#xff1f; 摘要&#xff1a; 在当今数据驱动的营销环境中&#xff0c;提升投资回报率&#xff08;ROI&#xff09;的关键在于精准洞察市场与用户行为。本文将探讨如何运用高级爬虫技术来优化营销策略&#xff0c;从海量互联网数据中挖掘…

【数据分享】2008-2022年我国省市县三级的逐日NO2数据(excel\shp格式)

空气质量数据是在我们日常研究中经常使用的数据&#xff01;之前我们给大家分享了2000-2022年的省市县三级的逐日PM2.5数据、2013-2022年的省市县三级的逐日CO数据和2013-2022年的省市县三级的逐日SO2数据&#xff08;均可查看之前的文章获悉详情&#xff09;&#xff01; 本次…

jmeter实战(1)- Mac环境安装

一、安装 JDK 这个就不介绍了&#xff0c;本地自行安装 JDK 并且配置好环境变量 二、安装 Jmeter 1. 下载地址 —> 下载链接点击这里 2. 选择合适的版本下载 3. 解压到本地目录 解压后&#xff0c;会得到下面的目录文件&#xff1a; 输入cd bin&#xff0c;进入到bin…

[STM32]HAL库实现自己的BootLoader-BootLoader与OTA-STM32CUBEMX

目录 一、前言 二、BootLoader 三、BootLoader的实现 四、APP程序 五、效果展示 六、拓展 一、前言 听到BootLoader大家一定很熟悉&#xff0c;在很多常见的系统中都会存在BootLoader。本文将介绍BootLoader的含义和简易实现&#xff0c;建议大家学习前掌握些原理基础。 …

【Android】Activity与Fragment的数据传递

上一篇文章学到了碎片的创建与生命周期&#xff0c;接下来学习碎片的常用操作&#xff0c;其中会用到上一篇文章的三个碎片&#xff0c;就做一个简单的说明吧&#xff1a;LeftFragment&#xff08;包含一个按钮&#xff09;、RightFragment4&#xff08;以粉色为背景的文本&…

408专业课130|零基础五个月速成攻略

计算机考研&#xff0c;有两个选择&#xff0c;一个是自命题&#xff0c;一个是408。如果你只是考一个普通院校&#xff0c;可以选择考自命题院校&#xff0c;容易上岸&#xff0c;但是如果考985/211/这类院校&#xff0c;最好还是选择408&#xff0c;因为408的考风险能力很强&…

Apollo部署与简易架构梳理

文章目录 apollo 安装apollo的基本架构组件机制component编译与加载 节点通讯数据的传输消息读写的实现消息的写端消息读端 常用术语ComponentChannelTaskNodeReader/WriterService/ClientParameter服务发现CRoutineSchedulerMessageDag文件Launch文件Record文件Mainboard Moni…