Android基础知识整理一

news2024/11/14 12:02:40

1. Android基础知识(第一行代码-第2版)

1.1 Android开发特色
1.1.1 系统架构
Linux内核层,系统运行库层,应用框架层,应用层
1.1.2 四大组件
活动Activity,服务Service,广播接收器Broadcast Receiver,内容提供器Content Provider
应用所看到的在活动中;服务一直运行,关闭应用也一直运行;广播接收信息如电话,短信(通知);内容提供器在应用程序之间共享数据
1.1.3 数据库
SQLite轻量级数据库,支持标准sql语法,也支持封装的api进行操作
1.2 Android项目文件结构
app壳项目内,AndroidManifest.xml所有的四大组件在这里声明,以及权限声明;
res放资源,图片,字符串,布局等。
1.2.1 AndroidManifest.xml
   <application
        android:allowBackup="true"
      android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.JavaTestWithLeetcode"
        tools:targetApi="31" >
        <!-- 定义主Activity -->
        <activity android:name=".ui.MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

主Activity:应用一打开启动的活动就是这个activity

Android程序设计讲究逻辑和视图分离,在布局文件中编写界面,在活动中引用:setContentView()在活动中引入布局

1.2.2 build.gradle

有两层,一个是最外层(module:project) 一个app目录(module:app)

1.2.2.1 module:project
apply from: "config.gradle"
buildscript {
    repositories {
        google()
        mavenCentral()
        maven {
            url "http://maven.aliyun.com/nexus/content/groups/public/"
            allowInsecureProtocol = true
        }
    }
    dependencies {
        classpath "com.android.tools.build:gradle:7.1.3"
        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.41'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

注:不要将应用程序依赖项放在此处;他们属于在单个模块 build.gradle 文件中

  • buildscript块中的repositories用于构建脚本的依赖项,比如 Gradle 插件。

  • 项目级的repositories用于项目实际依赖项的解析。

  • 添加*maven仓库是为了使构建过程能够从指定地址中获取所需的依赖项,不是为了适配maven构建版本。

1.2.2.2 module:app
plugins {
    alias(libs.plugins.android.application)
}

android {
    namespace 'com.example.javatestwithleetcode'
    compileSdk 34

    defaultConfig {
        applicationId "com.example.javatestwithleetcode"
        minSdk 24
        targetSdk 34
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {

    implementation libs.appcompat
    implementation libs.material
    testImplementation libs.junit
    androidTestImplementation libs.ext.junit
    androidTestImplementation libs.espresso.core
    implementation 'com.google.android.material:material:1.7.0'
}
1.3 第一个Android项目

随机选择器

设计主要目的是对添加的选项进行随机选择,核心逻辑简单,即在数组中random一个下标,随机取那个下标的数组数;设计这个小需求主要是了解安卓的开发流程以及一些布局中的例如flowlayout和button等样式的深入理解。

1.整体先在layout中设计布局,在MainActivity中需要引用这个布局,setContentView(),注意:MainActivity需要在AndroidManifest.xml中注册
2.button需要使用android.widget.Button 否则背景颜色等会被影响
3.flowlayout流式布局,相当于整体和item
4.可以封装ToastUtil和LogUtil封装成工具类后直接使用
5.活动的生命周期,oncreate-->finish
    private void addDataToFlowLayout(ArrayList<String> dataList) {
        if(dataList.isEmpty()){
            return;
        }
        flowLayout.removeAllViews();
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT);
        layoutParams.setMargins(0, 0, getResources().getDimensionPixelSize(R.dimen.margin_100), 0);
        LayoutInflater inflater = LayoutInflater.from(this);
        for (String data : dataList) {
            View view = inflater.inflate(R.layout.item_flowlayout, flowLayout, false);
            TextView textView = view.findViewById(R.id.textView);
            textView.setText(data);
            textView.setPadding(getResources().getDimensionPixelSize(R.dimen.margin_40), getResources().getDimensionPixelSize(R.dimen.margin_40)
                    , getResources().getDimensionPixelSize(R.dimen.margin_40), getResources().getDimensionPixelSize(R.dimen.margin_40));
            textView.setSingleLine();
            textView.setTextColor(getResources().getColor(R.color.white));
            textView.setLayoutParams(layoutParams);
            textView.setOnClickListener(v->{
                ToastUtils.showToast(textView.getText().toString());
            });
            flowLayout.addView(view,layoutParams);
        }
    }
1.3.1 Intent

Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行 的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动、启动服务以及发送广 播等场景

1.Intent(Context packageContext, Class<?>
cls) 这个构造函数接收两个参数,第一个参数Context 要求提供一个启动活动的上下文,第二个参数Class 则是指定想要启动的目标活动
然后startActivity(intent)----显式intent
2.在AndroidManifest.xml的<activity>标签下面添加<intent-filter>内容,指定action和category,指明了这个activity可以响应的activity,category是附加信息,只有这两个同时匹配上才能响应Intent;每个Intent只能指定一个action但是多个category---隐式intent

隐式intent不仅可以启动自己程序内活动,还可以启动其他程序活动---->多个应用程序之间功能共享

button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
});

如果有多个可选择的响应会跳出选择;可以通过schema指定当前活动能够响应的intent的协议

1.1.3.1 intent传递数据
//1.传递数据给下一个活动
intent.putExtra("extra_data",data);//键值对形式存放数据
Intent intent=getIntent();
String data =data.getStringExtra("extra_data");//取数据
//2.返回数据给上一个活动
button1.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
       Intent intent = new Intent(FirstActivity.this,                SecondActivity.class);
       startActivityForResult(intent, 1);//启动方式改变,请求码是唯一值,此处为1
}
});

button2.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       Intent intent = new Intent();
       intent.putExtra("data_return", "Hello FirstActivity");
       setResult(RESULT_OK, intent);
       finish();//这里是SecondActivity,把返回值以键值对的形式放进去,然后给intent setResult,finish作用和back键一样
}
});
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent);
finish();//如果SecondActivity是通过back按钮返回的,重写onBackPressed()
}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
String returnedData = data.getStringExtra("data_return");
Log.d("FirstActivity", returnedData);//---活动被销毁后,回调上一个活动的onActivityResult()方法,通过重写这个方法获得返回的数据,这里是FirstAcitivity
}
break;
default:
}
}
1.3.2 活动的生命周期

Android使用任务Task管理活动,一个任务就是一组存放在返回栈Back Stack里的活动的集合

1.3.2.1 活动状态
状态名特征
运行状态一个活动位于返回栈栈顶(最不愿意回收)
暂停状态不位于栈顶,但是可见(内存极低,才可能回收)
停止状态不位于栈顶,不可见(有可能会被回收)
销毁状态从返回栈中移除(倾向于回收)
image-20241106141932139 image-20241106142149939

所以onCreate的参数Bundle savedInstanceState一般情况下是null 如果活动在被系统回收之前有通过onSaveInstanceState()这个方法保存数据,这个参数会带有之前保存的全部数据(键值对形式)

1.3.2.2 启动模式
standard,singleTop,singleTask,singleInstance
image-20241106145938324

singleInstance原理

1.3.3 UI组件

button,textview,progressBar,AlertDialog等组件 具体细节不作赘述,布局大部分使用约束布局Constraintlayout。

android:visibility 指定控件的可见属性,visible--可见 invisible--不可见但是占据位置 gone--不可见且不占用原来的位置和大小
0dp是一种比较规范的写法,用于指定控件的大大小、间距等属性的单位
帧布局FrameLayout,没有方便的定位方式,所有控件都会默认摆放在布局的左上角

注:ListView是展示大量数据,需要将数据提供好,数组中的数据无法直接传递给ListView,所以需要适配器来完成例如ArrayAdapter,调用listview.setAdapter

View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.fruit_item, parent, false);

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

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

相关文章

ThinkBook 14+ 2024 Ubuntu 触控板失效 驱动缺失问题解决

首先我的电脑是thinkbook14 2024&#xff0c;从ubuntu18到ubuntu24&#xff0c;笔者整个都试了一遍&#xff0c;触摸板都没反应&#xff0c;确认不是linux系统内核问题&#xff0c;原因为驱动缺失。 解决步骤&#xff1a; &#xff08;1&#xff09;下载驱动&#xff0c;网址如…

如何使用 Web Scraper API 高效采集 Facebook 用户帖子信息

目录 前言一、什么是Web Scraper API二、Web Scraper API 的优势&#xff1a;三、Web Scraper API 适用场景四、实践案例目标需求视频讲解1、选择Web Scraper API2、登录注册3、进入用户控制面板4、选择API5、触发数据收集 API6、获取爬虫结果7、分析爬虫结果&#xff08;1&…

Qt_day3_信号槽

目录 信号槽 1. 概念 2. 函数原型 3. 连接方式 3.1 自带信号 → 自带槽 3.2 自带信号 → 自定义槽 3.3 自定义信号 4. 信号槽传参 5. 对应关系 5.1 一对多 5.2 多对一 信号槽 1. 概念 之前的程序界面只能看&#xff0c;不能交互&#xff0c;信号槽可以让界面进行人机…

Elastic 通用分析:提高性能并降低成本

作者&#xff1a;来自 Elastic Luca Wintergerst•Tim Rhsen 在这篇博客中&#xff0c;我们将介绍我们的一位工程师的一项发现如何帮助我们在 QA 环境中节省数千美元的成本&#xff0c;并且一旦我们将这一变化部署到生产中&#xff0c;还可以节省更多的成本。 在当今的云服务和…

【WRF理论第十一期】检查WPS输出:geogrid和metgrid 的输出nc数据+ungrib输出WPS格式

【WRF理论第十一期】检查WPS输出&#xff1a;geogrid和metgrid输出nc数据ungrib输出WPS格式 检查WPS输出WPS 输出检查的重要性使用 NetCDF 格式查看 geogrid 和 metgrid 的输出检查和可视化数据的工具 ungrib 输出数据的格式使用 plotfmt 工具查看 ungrib 输出 参考 上一篇博客…

万字长文解读深度学习——卷积神经网络CNN

推荐阅读&#xff1a; 卷积神经网络&#xff08;CNN&#xff09;详细介绍及其原理详解 CNN笔记&#xff1a;通俗理解卷积神经网络 文章目录 &#x1f33a;深度学习面试八股汇总&#x1f33a;主要组件输入层卷积层 (Convolutional Layer)批归一化层&#xff08;Batch Normalizat…

Redis生产问题(缓存穿透、击穿、雪崩)——针对实习面试

目录 Redis生产问题什么是缓存穿透&#xff1f;如何解决缓存穿透&#xff1f;什么是缓存击穿&#xff1f;如何解决缓存击穿&#xff1f;缓存穿透和缓存击穿有什么区别&#xff1f;什么是缓存雪崩&#xff1f;如何解决缓存雪崩&#xff1f; Redis生产问题 什么是缓存穿透&#x…

19、centos7优化

优化条目&#xff1a; 优化条目&#xff1a; 1.sudo管理用户授权 &#xff08;不用root管理,以普通用户的名义通过sudo提权&#xff09; 2.更改默认的远程连接SSH服务端口,禁止root用户远程连接,&#xff08;提前建立普通用户&#xff09;&#xff08;甚至更改为只监听内网IP…

河北省内首台心磁图仪正式落户河北梅奥心血管病医院

河北省内首台心磁图仪正式落户河北梅奥心血管病医院。 2024年11月9日&#xff0c;河北梅奥心血管病医院迎来了一场激动人心的历史时刻——河北省首台心磁图仪启用仪式在医院内隆重举行&#xff0c;标志着这一顶尖医疗设备正式入驻&#xff0c;为医院心脏影像诊断技术开启了全新…

【C语言刷力扣】283.移动零

题目&#xff1a; 解题思路&#xff1a; 将不为 0 的元素依次放在数组前面&#xff0c;再在数组末尾补上 0。 时间复杂度&#xff1a; 空间复杂度&#xff1a; void moveZeroes(int* nums, int numsSize) {int i 0, j 0;for (; i < numsSize; i) {if (nums[i]) {nums…

网络初阶——应用层:HTTPS 协议

一、HTTPS & HTTP 的区别 从协议的名字来看&#xff0c;HTTP 比 HTTPS 少了一个 S。而这个 “S”&#xff0c;其实可以理解成 “Safe”&#xff0c;所以不难看出&#xff0c;其实 HTTPS 就是 HTTP 的安全版。就是为了保证客户端 cookie 的传输安全的。 二、相关概念 1、明…

怎么禁止Ubuntu自动更新升级

怎么禁止Ubuntu自动更新升级 笔者在做MIT 6.S081的时候发现他给我的qemu自动更新了又卡住了&#xff0c;故关闭了自动更新 文章目录 怎么禁止Ubuntu自动更新升级一、图形化修改二、基于命令行修改配置文件的方法 一、图形化修改 1.打开设置->软件和更新->更新 2.选择自…

Spring Boot框架:构建符合工程认证的计算机课程

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

机器学习—选择激活函数

可以为神经网络中的不同神经元选择激活函数&#xff0c;我们将从如何为输出层选择它的一些指导开始&#xff0c;事实证明&#xff0c;取决于目标标签或地面真相标签y是什么&#xff0c;对于输出层的激活函数&#xff0c;将有一个相当自然的选择&#xff0c;然后看看激活函数的选…

【学习记录】使用CARLA录制双目摄像头SLAM数据

一、数据录制 数据录制的部分参考了网上的部分代码&#xff0c;代码本身并不复杂&#xff0c;基本都是简单的CARLA语法&#xff0c;关键的一点在于&#xff0c;CARLA内部本身并没有预设的双目摄像头&#xff0c;需要我们添加两个朝向相同的摄像头来组成双目系统&#xff0c;这…

[论文粗读][REALM: Retrieval-Augmented Language Model Pre-Training

引言 今天带来一篇检索增强语言模型预训练论文笔记——REALM: Retrieval-Augmented Language Model Pre-Training。这篇论文是在RAG论文出现之前发表的。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们"。 语言模型预训练…

【人工智能】ChatGPT多模型感知态识别

目录 ChatGPT辅助细化知识增强&#xff01;一、研究背景二、模型结构和代码任务流程一&#xff1a;启发式生成 三、数据集介绍三、性能展示实现过程运行过程训练过程 ChatGPT辅助细化知识增强&#xff01; 多模态命名实体识别&#xff08;MNER&#xff09;最近引起了广泛关注。…

【黑马点评debug日记】

q1:登录无session跳转主页 p30&#xff0c;页面登录后返回&#xff0c;然后点击我的&#xff0c;需要重新设置&#xff0c;拦截器都没有问题。 参考&#xff1a; redis 黑马点评p30 login没有正常跳转&#xff0c;修改前端代码后还是一直跳转主界面_黑马点评登录后跳转到主页…

地面远阴影对光伏电站的影响

影响因素 1、太阳高度角和方位角 太阳高度角是指太阳光的入射方向和地平面之间的夹角。太阳高度角随时间、季节和地理位置的变化而变化。 方位角是指太阳光线在水平面上的投影与正南方向的夹角。方位角也随时间和地理位置的变化而变化。 可以通过天文公式或者专业的太阳位置…

消息队列高级

目录 消息可靠性 生产者消息确认 第一步&#xff1a;修改application.yml配置文件信息 第二步&#xff1a;定义发送者确认confirm回调方法 第三步&#xff1a;创建消息发送者回执return回调方法&#xff08;确保消息从交换机到消息队列&#xff09; 总结&#xff1a; 消息持…