android知识总结

Activity启动模式

standard (标准模式)

 每次启动该 Activity(例如,通过 startActivity()),系统总会创建一个新的实例,并将其放入调用者(启动它的那个 Activity)所在的任务栈中。

singleTop (栈顶复用模式)

 如果要启动的 Activity 已经位于调用者任务栈的栈顶,系统不会创建新实例,而是通过调用该已有实例的 onNewIntent() 方法将新的 Intent 传递给它。如果要启动的 Activity 不在栈顶(即使它存在于栈中但不是栈顶),系统会创建一个新的实例

singleTask (栈内复用模式 / 单任务模式)

 如果在栈中已经存在该 Activity 的实例(无论是否在栈顶),系统会销毁该实例之上的所有其他 Activity,将这个实例带到栈顶,并通过 onNewIntent() 传递新的 Intent。

singleInstance (单实例模式)

系统会为这个 Activity 创建一个新的任务栈这个新栈中只能有这个 Activity 的实例。 任何其他 Activity(包括它自己再次被启动)都不能放入这个栈中。

 Intent

它主要用于在 Android 应用组件之间或不同应用之间执行启动组件、传递数据、广播事件等操作。

显式 Intent

明确指定了目标组件的完整类名,系统直接将 Intent 递送给指定的组件,不进行任何查找或过滤

隐式 Intent

请求系统或其他应用执行一个通用操作,或者启动一个能处理这种操作描述的组件。当发出隐式 Intent 时,Android 系统会将其与设备上所有已安装应用的组件在 AndroidManifest.xml 中声明的 <intent-filter> 进行比较。

Android 四大组件

Activity(活动): 一个 Activity 代表应用中的一个屏幕界面。它是用户与应用交互的主要入口点

Service(服务): Service 是一种在后台执行长时间运行操作的组件,没有用户界面

BroadcastReceiver(广播接收器):BroadcastReceiver 是一个负责响应系统或应用内部广播消息的组件。

ContentProvider(内容提供器): 应用间的数据共享

Activity生命周期

onCreate(Bundle savedInstanceState): Activity 首次创建时调用。

onStart():Activity 即将变得可见(进入前台)时调用。

onResume():可以开始与用户交互时调用。在 onStart() 之后调用,或者在另一个 Activity 离开前台(如对话框关闭、电话挂断)后调用。

onPause(): 当系统即将启动另一个 Activity 或当前 Activity 正在失去焦点但仍部分可见(如启动一个半透明或非全屏的 Activity,如对话框)时调用。

onStop():Activity 对用户完全不可见时调用。

onRestart():当 Activity 从 Stopped 状态重新回到前台时调用。

onDestroy(): Activity 被销毁之前调用。

Fragment

Fragment 的出现是为了解决 Activity 在构建复杂 UI 和适应多屏幕设备时的局限性。

屏幕旋转后Activity生命周期变化

用户首次进入页面后执行的生命周期回调方法onCreate(),onStart(),onResume()

屏幕旋转后活动被销毁并新建,onPause(),onStop(),onDestroy(),onCreate(),onStart(),onResume()。

Android 布局

LinearLayout(线性布局)

子视图按单一方向(水平/垂直)顺序排列。

<LinearLayoutandroid:orientation="vertical" <!-- vertical/horizontal -->>...
</LinearLayout>

 RelativeLayout(相对布局)

通过相对定位确定视图位置.

FrameLayout(帧布局)

所有子视图叠加显示

RecyclerView

RecyclerView 是 Android 中用于高效展示大量数据集的高级视图容器,通过 ViewHolder 模式减少频繁的 findViewById() 开销。

    RecyclerView展示数据的容器视图
    Adapter将数据绑定到视图上(核心逻辑)
    ViewHolder缓存视图组件,避免重复查找
    LayoutManager控制布局排列方式(线性/网格/瀑布流)
    ItemDecoration绘制分割线/间隔样式

    LiveData

    LiveData 是一种可观察的数据存储器类。LiveData 只会将更新通知给活跃的观察者。

    优点

    数据实时更新LiveData 遵循观察者模式。当底层数据发生变化时,LiveData 会通知 Observer对象。

    不会发生内存泄漏:观察者会绑定到Lifecycle对象,并在其关联的生命周期遭到销毁后进行自我清理。

    不再需要手动处理生命周期:LiveData 将自动管理所有这些操作。

    MVVM架构

    • View层:Activity/Fragment
    • ViewModel层:Jetpack ViewModel + Jetpack LivaData
    • Model层:Repository仓库,包含 本地持久性数据 和 服务端数据

    Android 中如何优化性能

    布局优化:避免嵌套过深的布局,使用 ConstraintLayout 替代嵌套布局。

    避免主线程阻塞:将耗时操作放到子线程中。

    自定义view

    当系统提供的标准控件 无法满足设计或功能要求时,就需要自定义 View。

    生命周期

    [改变可见性] --> 构造View() --> onFinishInflate() --> onAttachedToWindow() --> onMeasure() --> onSizeChanged() --> onLayout() --> onDraw() --> onDetackedFromWindow()

    onFinishInflate(): view从xml加载完成调用。 

    onAttachedToWindow():View 被添加到窗口(Window)时调用。

    onMeasure():确定 View 自身及其子 View(如果是 ViewGroup)的大小。

    onSizeChanged():View 尺寸首次确定或发生变化时。

    onLayout(): 确定 View 自身的位置。

    onDraw():将 View 内容绘制到屏幕上。

    SharedPreferences

    是Android平台上一个轻量级的存储辅助类,在应用中通常做一些简单数据的持久化缓存。

    //获取对象,user为文件名,第二个参数为文件存储方式(是否允许其他应用读写)
    SharedPreferences sharedPreferences = getSharedPreferences("user",MODE_PRIVATE);
    获取Editor对象的引用
    SharedPreferences.Editor editor = sharedPreferences.edit();
    //数据持久化,共6种类型String,set,int,long,float,booleaneditor.putString("name", "lucas");//获取数据
    SharedPreferences sharedPreferences= getSharedPreferences("user", MODE_PRIVATE);
    //第二个参数为默认值,即user文件中未找到name,直接返回该值。String name=sharedPreferences.getString("name","");int age = sharedPreferences.getInt("age",0);

    Activity和Activity之间怎么传递数据?

    1.通过Intent传递数据

    直接使用intent传递数据

    // 发送方 Activity,
    Intent intent = new Intent(SenderActivity.this, ReceiverActivity.class);
    //通过putExtra直接发送数据
    intent.putExtra("key_string", "Hello");
    intent.putExtra("key_int", 100);
    intent.putExtra("key_boolean", true);
    startActivity(intent);// 接收方 Activity (onCreate中)
    Intent intent = getIntent();
    //通过getExtra获取数据
    String text = intent.getStringExtra("key_string");
    int number = intent.getIntExtra("key_int", 0); // 0为默认值
    boolean flag = intent.getBooleanExtra("key_boolean", false);

    传递 Bundle 对象

    // 发送方
    Bundle bundle = new Bundle();
    bundle.putString("name", "Alice");
    bundle.putInt("age", 30);Intent intent = new Intent(this, ReceiverActivity.class);
    intent.putExtras(bundle); // 或 intent.putExtra("myBundle", bundle)
    startActivity(intent);// 接收方
    Bundle bundle = getIntent().getExtras(); // 或 getIntent().getBundleExtra("myBundle")
    String name = bundle.getString("name");
    int age = bundle.getInt("age");

    2.通过 SharedPreferences传递数据

    第一个Activity中通过SharedPreferences将数据存入xml文件中,再在第二个Activity中通过SharedPreferences获取数据。

    Fragment与Activity之间的传值 

    1.在activity中建一个bundle,把要传的值存入bundle,然后通过fragment的setArguments(bundle)传到fragment,在fragment中,用getArguments接收

        Bundle bundle=new Bundle();bundle.putString("one","要传的值");fragment.setArguments(bundle);FragmentManager fm = getFragmentManager();FragmentTransaction ft=fm.beginTransaction();ft.add(R.id.frame,myFragment,"myFragment");ft.commit();Bundle bundle=getArguments();String s=bundle.getString("one");
    

    2.在Fragment中设置set,get方法,通过调用前设置属性值,完成数据传递。

    FragmentManager fm = getFragmentManager();
    MyFragment myFragment = (MyFragment)fm.findFragmentById(R.id.fragment);
    myFragment.setValue("传值");//Fragment内部private String value;private void setValue(String value){this.value = value;}private String getValue(){return this.value;}

    View和Viewgroup区别?

    View主要用来展示信息或与用户进行交互;而ViewGroup则更多地作为容器,用来组织和管理一组View或其他ViewGroup。 

    ViewGroup可以包含View和其他ViewGroup;而View只能单独存在。

     

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

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

    相关文章

    第3章 MySQL数据类型

    MySQL数据类型 1、数字数据类型1.1 整数类型1.2 定点类型1.3 浮点类型1.4位值类型1.5 超出范围和溢出处理1.5.1 超出范围处理1.5.2 溢出处理 2、日期和时间数据类型3、字符串数据类型3.1 char和varchar类型3.2 binary和varbinary类型3.3 blob 和 text类型3.4 enum类型3.4.1 创建…

    label-studio的使用教程(导入本地路径)

    文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…

    mysql为什么一个表中不能同时存在两个字段自增

    背景。设置sort自增。会引发错误 通常自增字段都是用于表示数据的唯一性。数据库限制。需要自定义排序字段大小。

    牛客round95D

    原题链接&#xff1a;D-小红的区间修改&#xff08;一&#xff09;_牛客周赛 Round 95 题目背景&#xff1a; 初始拥有一个长度10^100元素全为0的数组&#xff0c;进行q查询&#xff0c;每次查询如果区间内的元素都为0就将区间变为首项为 1、公差为 1 的等差数列&#xff1b;否…

    visual studio 2022更改主题为深色

    visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成

    实践篇:利用ragas在自己RAG上实现LLM评估②

    文章目录 使用ragas做评估在自己的数据集上评估完整代码代码讲解1. RAG系统构建核心组件初始化文档处理流程 2. 评估数据集构建3. RAGAS评估实现1. 评估数据集创建2. 评估器配置3. 执行评估 本系列阅读&#xff1a; 理论篇&#xff1a;RAG评估指标&#xff0c;检索指标与生成指…

    微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

    微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…

    PostgreSQL 安装与配置全指南(适用于 Windows、macOS 与主流 Linux 发行版)

    PostgreSQL 是一个功能强大、开源、稳定的对象关系数据库系统&#xff0c;广泛用于后端开发、数据处理与分布式架构中。本指南将手把手教你如何在 Windows、macOS 以及主流 Linux 发行版 上安装 PostgreSQL&#xff0c;并附上安装验证命令与基础配置方法。 一、Windows 安装与配…

    WordPress博客文章SEO的优化技巧

    在数字时代&#xff0c;博客不仅用于表达观点&#xff0c;也能提升品牌影响力并吸引潜在客户。许多服务器提供商&#xff08;如 Hostease&#xff09;支持 WordPress 一键安装功能&#xff0c;方便新手快速完成安装&#xff0c;专注于内容创作和 SEO 优化。然而&#xff0c;写出…

    Python:操作 Excel 折叠

    💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…

    雨季智慧交通:从车辆盲区到客流统计的算法全覆盖

    雨季智慧交通中的视觉分析技术应用 一、背景&#xff1a;雨季交通的复杂挑战 雨季是城市交通管理的关键考验期。以济南为例&#xff0c;强对流天气伴随的短时强降水、雷雨大风及冰雹&#xff0c;不仅导致道路积水、能见度骤降&#xff0c;还加剧了大型车辆&#xff08;如渣土…

    安全生产管理是什么?安全生产管理系统都有哪些核心功能?

    随着法律法规的日益严格和公众对安全意识的提升&#xff0c;企业面临的安全生产压力也越来越大。无论是大型企业还是中小型企业&#xff0c;安全生产管理不仅关系到企业的生存与发展&#xff0c;更直接关系到员工的生命安全和企业的社会形象。因此&#xff0c;理解并实施有效的…

    【PyCharm必会基础】正确移除解释器及虚拟环境(以 Poetry 为例 )

    #工作记录 【PyCharm使用基础】 当遇到虚拟环境难以修复的场景&#xff0c;我们需要删除当前解释器和虚拟环境然后再重新创建虚拟环境&#xff0c;以下是在PyCharm中正确移除的步骤。 一、进入解释器设置 在 PyCharm 界面右下角&#xff0c;点击Poetry (suna0)&#xff0c;选…

    day028-Shell自动化编程-判断进阶

    文章目录 1. 特殊变量补充2. 变量扩展-变量子串2.1 获取变量字符的长度2.2 给变量设置默认值 3. 命令3.1 dirname3.2 basename3.3 cut 4. 条件测试命令&#xff1a;[]4.1 逻辑运算符4.2 文件测试4.3 案例&#xff1a;书写脚本-检查文件类型4.4 逻辑运算4.5 案例&#xff1a;书写…

    oracle sql 语句 优化方法

    1、表尽量使用别名&#xff0c;字段尽量使用别名.字段名&#xff0c;这样子&#xff0c;可以减少oracle数据库解析字段名。而且把 不需要的字段名剔除掉&#xff0c;只保留有用的字段名&#xff0c;不要一直使用 select *。 2、关联查询时&#xff0c;选择好主表 。oracle解析…

    【Java】Ajax 技术详解

    文章目录 1. Filter 过滤器1.1 Filter 概述1.2 Filter 快速入门开发步骤:1.3 Filter 执行流程1.4 Filter 拦截路径配置1.5 过滤器链2. Listener 监听器2.1 Listener 概述2.2 ServletContextListener3. Ajax 技术3.1 Ajax 概述3.2 Ajax 快速入门服务端实现:客户端实现:4. Axi…

    07 APP 自动化- appium+pytest+allure框架封装

    文章目录 一、PO二、代码简单实现项目框架预览&#xff1a;base_page.pydir_config.pyget_data.pylogger.pystart_session.pyconfig.yamlkey_code.yamllaunch_page_loc.pylogin_page_loc.pylaunch_page.pylogin_page.pytest_login.pypytest.inirun.py APP 自动化代码总和 一、P…

    用户体验升级:表单失焦调用接口验证,错误信息即时可视化

    现代前端应用中&#xff0c;表单交互是用户体验的重要组成部分。而表单验证作为其中的核心环节&#xff0c;不仅需要前端的即时反馈&#xff0c;还需要与后端接口联动进行数据合法性校验。本文将详细介绍如何在Vue3中实现表单输入与接口验证的无缝联动&#xff0c;并优雅地展示…

    Vue 插槽(Slot)用法详解

    插槽(Slot)是Vue中一种强大的内容分发机制&#xff0c;它允许你在组件中定义可替换的内容区域&#xff0c;为组件提供了更高的灵活性和可复用性。本文将全面介绍Vue插槽的各种用法。 1. 基本插槽 基本插槽是最简单的插槽形式&#xff0c;它允许父组件向子组件插入内容。 子组…

    C++ 标准模板库(STL)详解文档

    C 标准模板库&#xff08;STL&#xff09;详解文档 1 前言2 常用容器2.1 内容总览2.2 向量 vector2.2.1 概述2.2.2 常用方法2.2.3 适用场景2.2.4 注意事项 2.3 栈 stack2.3.1 概述2.3.2 常用方法2.3.3 注意事项 2.4 队列 queue2.4.1 概述2.4.2 常用方法2.4.3 注意事项 2.5 优先…