Android学习

news2025/1/11 14:33:09

安卓期末考题复习

知识点总结

View
布局管理
线性布局

实现垂直或者水平布局。

orientation属性控制控件排列方向,包含两个属性值:vertical(垂直)、horizontal(水平);weight属性表示权重。

相对布局

根据控件之间的相对位置进行布局。

帧布局

控件只能放在页面的左上角,新添加的控件会覆盖已存在的控件。

表格布局

将整个页面划分为行列表格进行布局。

绝对布局

控件的位置根据x,y坐标进行设定。

控件

view和viewGroup

TextView

autoLink属性

Button
EditView
imageView
RadioGroup

RadioButton

image-20240628160337803

checkBox
Spinner

image-20240628160509289

Toast

Toast是Android系统提供的轻量级信息提醒机制,用于向用户提示即时消息,它显示在应用程序界面的最上层,显示一段时间后自动消失不会打断当前操作,也不获得焦点。

Toast.makeText(MainActivity.this,“WIFI已断开”,Toast.LENGTH_SHORT).show();

BroadCast
广播机制实现流程

image-20240625154512649

BroadcastReceiver

广播的接收 注册在哪 怎么注册 静态注册 动态注册

  1. 创建BroadcastReceiver类: 创建一个继承自 BroadcastReceiver 的类,并在其中重写 onReceive() 方法,以便在接收到广播时执行特定的操作。

    public class MyBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            // 在这里处理接收到的广播
            String action = intent.getAction();
            if ("your.custom.action".equals(action)) {
                // 根据广播的action进行相应的处理
            }
        }
    }
    
  2. 注册BroadcastReceiver: 有两种方式可以注册 BroadcastReceiver,一种是在代码中动态注册,另一种是在AndroidManifest.xml中静态注册。

    • 动态注册: 在Activity或其他组件的生命周期内动态注册Receiver。

      IntentFilter filter = new IntentFilter("your.custom.action");
      registerReceiver(new MyBroadcastReceiver(), filter);
      

      记得在组件销毁时注销Receiver:

      @Override
      protected void onDestroy() {
          super.onDestroy();
          unregisterReceiver(myBroadcastReceiver);
      }
      
    • 静态注册: 在 AndroidManifest.xml 中注册,这样Receiver会随着应用的启动而启动,不需要额外的注册代码。

      <receiver android:name=".MyBroadcastReceiver">
          <intent-filter>
              <action android:name="your.custom.action" />
              <category android:name="android.intent.category.DEFAULT" />
          </intent-filter>java
      </receiver>
      
  3. 发送广播: 使用 ContextsendBroadcast() 方法发送广播。

    Intent intent = new Intent("your.custom.action");
    sendBroadcast(intent);
    

    如果需要发送有序广播,可以使用 sendOrderedBroadcast()

Activity
生命周期

1.onCreate(): 在Activity第一次创建时调用。这里通常进行初始化,例如设置用户界面、绑定数据等。

2.onStart(): 在Activity变得对用户可见时调用。Activity此时还不可与用户交互。

3.onResume(): 在Activity开始与用户交互时调用。Activity位于前台并获取用户焦点。

4.onPause(): 在系统即将启动另一个Activity时调用。这时Activity仍然部分可见,但不可与用户交互。应该在这里保存任何需要在暂停期间保存的数据。

5.onStop(): 在Activity不再对用户可见时调用。Activity被其他Activity完全遮盖。

6.onRestart(): 在Activity从停止状态变为活动状态之前调用。这通常用于重新初始化已释放的资源。

7.onDestroy(): 在Activity被销毁之前调用。通常在这里做清理工作。

各类测试中Activity的回调函数调用顺序

正常启动程序:onCreate → onStart → onResume【创建、启动、恢复】
程序启动后点击返回:onPause → onStop → onDestory【暂停、停止、再见】
正常启动后按Home键:onPause → onStop
按Home键后再单击应用进入:onRestart → onStart → onResume
正常启动后切换为横屏(Ctrl+F11):onPause → onStop → onDestroy → onCreate → onStart→ onResume
锁屏后解锁:onPause → onStop → onRestart → onStart → onResume
来电通话后挂机(来电是以通知的形式显示,接通后onPause部分遮挡?,挂机后onResume):onPause → onResume

Activity的任务栈和启动模式

1.standard模式,每启动一个Activity就会在栈顶创建一个新的实例。

2.singleTask模式,检查栈中是否存在当前Activity的实例,如果存在,把它之上的实例出栈。

3.singleInstance模式,创建新的任务栈。

两个Activity之间传递数据❤

直接举例说明:FirstActivity将两个整数通过Intent传给SecondActivity,进行加法计算后,将结果通过广播返回给FirstActivity,用Toast的形式将结果展示出来。

步骤:

  1. FirstActivity 中启动 SecondActivity 并传递两个整数。
  2. SecondActivity 中接收这两个整数,执行加法计算。
  3. SecondActivity 发送一个包含计算结果的广播。
  4. FirstActivity 接收这个广播并使用 Toast 显示结果。

代码:

// FirstActivity.java
package com.example.myapp;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;

public class FirstActivity extends AppCompatActivity {

private static final String ACTION_RESULT = "com.example.myapp.ACTION_RESULT";
private ResultReceiver resultReceiver;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_first);

    // 注册广播接收器
    resultReceiver = new ResultReceiver();
    IntentFilter filter = new IntentFilter(ACTION_RESULT);
    registerReceiver(resultReceiver, filter);

    // 启动 SecondActivity 并传递两个整数
    Intent intent = new Intent(this, SecondActivity.class);
    intent.putExtra("num1", 5);
    intent.putExtra("num2", 10);
    startActivity(intent);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    // 注销广播接收器
    unregisterReceiver(resultReceiver);
}

// 广播接收器类
private class ResultReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null && ACTION_RESULT.equals(intent.getAction())) {
            int result = intent.getIntExtra("result", 0);
            Toast.makeText(FirstActivity.this, "Result: " + result, Toast.LENGTH_LONG).show();
        }
    }
}

}

// SecondActivity.java
package com.example.myapp;

import android.content.Intent;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;

public class SecondActivity extends AppCompatActivity {

private static final String ACTION_RESULT = "com.example.myapp.ACTION_RESULT";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_second);

    // 获取传递过来的两个整数
    Intent intent = getIntent();
    int num1 = intent.getIntExtra("num1", 0);
    int num2 = intent.getIntExtra("num2", 0);

    // 进行加法运算
    int result = num1 + num2;

    // 通过广播发送结果
    Intent resultIntent = new Intent(ACTION_RESULT);
    resultIntent.putExtra("result", result);
    sendBroadcast(resultIntent);

    // 结束 SecondActivity
    finish();
}

}

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".SecondActivity"></activity>
    <activity android:name=".FirstActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
Service
生命周期
  • 创建onCreate() -> 服务被创建。
  • 启动onStartCommand() -> 服务被启动,可以被调用多次。
  • 绑定onBind() -> 客户端绑定到服务。
  • 解绑onUnbind() -> 所有客户端都解绑了服务。
  • 销毁onDestroy() -> 服务被销毁。
如何启动

Service的启动有两种方式

startService()和bindService()

一、startService()方式

// MyService.java
package com.example.myapp;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {

private static final String TAG = "MyService";

@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG, "Service Created");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "Service Started");
    // 在这里处理任务
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.d(TAG, "Service Destroyed");
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}

}

// 在Activity中启动服务
Intent intent = new Intent(this, MyService.class);
startService(intent);

// 在Activity中停止服务
Intent intent = new Intent(this, MyService.class);
stopService(intent);

二、bindService()方式

这种方式用于绑定一个服务,适用于需要与活动进行交互的情况。绑定服务后,活动和服务之间可以进行通信。

// MyService.java
package com.example.myapp;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {

private static final String TAG = "MyService";
private final IBinder binder = new LocalBinder();

public class LocalBinder extends Binder {
    MyService getService() {
        return MyService.this;
    }
}

@Override
public void onCreate() {
    super.onCreate();
    Log.d(TAG, "Service Created");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(TAG, "Service Started");
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.d(TAG, "Service Destroyed");
}

@Override
public IBinder onBind(Intent intent) {
    return binder;
}

public String getGreeting() {
    return "Hello from Service";
}

}

// 在Activity中绑定和解绑服务
package com.example.myapp;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.os.Bundle;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
private static final String TAG = “MainActivity”;
private MyService myService;
private boolean isBound = false;

private ServiceConnection serviceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        MyService.LocalBinder binder = (MyService.LocalBinder) service;
        myService = binder.getService();
        isBound = true;
        Log.d(TAG, myService.getGreeting());
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        isBound = false;
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 绑定服务
    Intent intent = new Intent(this, MyService.class);
    bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (isBound) {
        // 解绑服务
        unbindService(serviceConnection);
        isBound = false;
    }
}

}

AndroidManifest.xml 中声明服务

Fragment
生命周期

1.onAttach(): 当Fragment与Activity关联时调用。可以通过参数传递的方式获取Activity的引用。

2.onCreate(): 在Fragment创建时调用。用于初始化不依赖视图的部分。

3.onCreateView(): 在Fragment创建视图层次结构时调用。需要在这里返回Fragment的视图。

4.onActivityCreated(): 当Activity的onCreate()方法返回时调用。表示Activity与Fragment的视图已经创建完毕。

5.onStart(): 在Fragment可见时调用。

6.onResume(): 在Fragment可与用户交互时调用。

7.onPause(): 在Fragment不再与用户交互时调用。

8.onStop(): 在Fragment不可见时调用。

9.onDestroyView(): 在Fragment的视图被销毁时调用。通常在这里清理与视图相关的资源。

10.onDestroy(): 在Fragment被销毁时调用。用于清理不依赖视图的资源。

11.onDetach(): 当Fragment与Activity取消关联时调用。

Intent

image-20240625160118007

Intent传递数据
  1. 原始数据类型:如整数(int)、浮点数(float)、字符串(String)等。
  2. URI:可以通过 Intent 传递文件、网络资源等的URI。
  3. Serializable对象:实现了 Serializable 接口的对象可以通过 Intent 传递,但需要注意的是,这些对象需要是可序列化的,即它们的状态可以被转换为字节流。
  4. Parcelable对象:实现了 Parcelable 接口的对象也可以通过 Intent 传递。与 Serializable 相比,Parcelable 提供了更灵活的序列化方式,并且通常比 Serializable 更高效。

image-20240627155157860

考试题型分析

选择题
简答题

image-20240628103057194

image-20240628104812755

image-20240628105018834

image-20240628105047165

image-20240628105336632

image-20240628105443083

image-20240628105454488

image-20240628110056273

代码题

image-20240628102747989

image-20240628102732890

image-20240628102805671

activity通信 结果回传 一个传给另一个

数据传递

颜色定义的使用,监听按钮的方法的复写

布局管理器哪些属性是共有的

在Android开发中,布局管理器(Layout Managers)是用于在屏幕上组织和显示视图组件的系统。不同的布局管理器如LinearLayout、RelativeLayout、FrameLayout等,虽然各自有其特定的属性和行为,但它们也有一些共有的属性,这些属性可以在大多数布局管理器中找到:

  1. id - 每个布局管理器都可以有一个唯一的资源ID,用于在代码中引用。
  2. layout_width - 指定布局的宽度,可以是match_parent(父布局的宽度)、wrap_content(根据子视图内容自动调整)或者具体的尺寸。
  3. layout_height - 指定布局的高度,与宽度类似,可以是match_parentwrap_content或者具体尺寸。
  4. background - 设置布局的背景颜色或背景资源。
  5. padding - 设置布局内边距,可以是统一的数值或者分别对左、上、右、下进行设置。
  6. margin - 设置布局外边距,可以是统一的数值或者分别对左、上、右、下进行设置。
  7. clipChildren - 决定子视图是否被裁剪到布局的边界内。
  8. clipToPadding - 决定是否裁剪子视图到内边距的边界。
  9. fitsSystemWindows - 决定布局是否应该扩展到系统窗口(如状态栏或导航栏)。
  10. importantForAccessibility - 定义布局对于辅助功能的重要性。
  11. layout_margin, layout_marginStart, layout_marginEnd, layout_marginTop, layout_marginBottom - 这些属性用于在不同方向上设置布局的外边距。
  12. layout_gravity - 指定布局在其父布局中的对齐方式。
  13. animateLayoutChanges - 在某些布局管理器中,如ConstraintLayout,这个属性可以设置是否在布局变化时执行动画。
  14. transitionGroup - 指定布局是否作为一个过渡组,允许子视图在过渡期间保持其状态。
  15. saveEnabled - 决定布局是否应该保存其状态。
题目收集

1.Android平台由(操作系统),(中间件),(用户界面)和(应用软件)组成。

2.Android 四大组件是( Activity ),( Service ),( BroadcaseReceiver )和( ContentProvider )。

3.阐述 android:padding 和 android:layout_margin 的异同?

  • android:padding 仅影响组件自身内部的空间,不会影响到其他组件。
  • android:layout_margin 影响组件与其他组件之间的空间,是组件与周围环境的间隔。

4.Android中的数据存储方式

文件存储、SharedPreferences 方式、内容提供器( Content provider )方式、SQLite 数据库方式和网路存储方式

5.简述Toast消息提示框的特点

一种快速的即时消息;消息内容简短;悬浮于应用程序的最上方;不获得焦点;用于提示任务是否完成的消息提示机制

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

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

相关文章

css 布局出现无法去除的空白

案件介绍&#xff1a;在没有设置任何的css样式的情况下 文字顶部出现无法去除的空白 源代码 <div click"onClick" ><div class"tableTextButton--container"></div><Icon v-if"loading || thisLoading" type"ios-lo…

图数据库 vs 向量数据库

最近大模型出来之后&#xff0c;向量数据库重新翻红&#xff0c;业界和市场上有不少声音认为向量数据库会极大的影响图数据库&#xff0c;图数据库市场会萎缩甚至消失&#xff0c;今天就从技术原理角度来讨论下图数据库和向量数据库到底差别在哪里&#xff0c;适合什么场景&…

广和通 OpenCPU 二次开发(一) —— 串口

广和通 OpenCPU 二次开发&#xff08;一&#xff09; —— 串口 1.port&#xff0c;端口号2.引脚序列号对应芯片引脚图找&#xff0c;也可以对照GPIO功能复用表找3.要复用的pin脚对应的功能mode根据GPIO功能复用表选择 一、核心配置## 标题代码 int port 1; fibo_gpio_mode_s…

iML6602-无滤波器2×30W,60W音频放大器

iML6602是一款由集创北方推出的国产高性能、高效率的双声道D类音频功率放大器&#xff1b;它提供2X30W和60W的功率输出&#xff0c;支持无滤波器立体声&#xff0c;适用于蓝牙/无线扬声器、条形音响、LCD/LED电视和家庭影院等应用&#xff1b;可替代TI-TPA3128/3118/3110/3130/…

【知识图谱系列】Neo4j使用Py2neo与python进行链接

目录 一、安装py2neo 二、打开Neo4j 三、使用Python操作Neo4j 一、安装py2neo pip install --upgrade py2neo -i https://pypi.tuna.tsinghua.edu.cn/simple 可以先阅读下文档&#xff1a;https://py2neo.org/v4/index.html 这个文档里有好多关于这个工具包的API介绍&#x…

awk的用法

目录 awk简述 awk的用法 选项 内置变量 命令格式 打印行号 打印指定行 打印奇偶行 按行取列 BEGIN打印模式 乘法计算 awk -v 变量赋值 awk的条件判断 面试题awk的三元表达式 awk的精确筛选 逻辑且、或关系 awk做小数运算 curl 练习 1.获取其中的所有子域名…

MATLAB-振动问题:单自由度阻尼振动系统受迫振动

一、基本理论 二、MATLAB实现 单自由度阻尼振动系统受迫振动&#xff0c;MATLAB代码如下&#xff1a; clear; clc; close allA 1; psi 0; F0 10; D 20; Rm 0.5; M 1; omega 2; delta Rm / (2*M); omega0 sqrt(D / M); Omega sqrt(omega0^2 - delta^2); Zm Rm i *…

Python学习笔记25:进阶篇(十四)常见标准库使用之性能测试timeit模块学习使用

前言 本文是根据python官方教程中标准库模块的介绍&#xff0c;自己查询资料并整理&#xff0c;编写代码示例做出的学习笔记。 根据模块知识&#xff0c;一次讲解单个或者多个模块的内容。 教程链接&#xff1a;https://docs.python.org/zh-cn/3/tutorial/index.html 性能测量…

视频共享融合赋能平台LntonCVS安防监控平台现场方案实现和应用场景

LntonCVS国标视频融合云平台采用端-边-云一体化架构&#xff0c;部署简单灵活&#xff0c;功能多样化。支持多协议&#xff08;GB28181/RTSP/Onvif/海康SDK/Ehome/大华SDK/RTMP推流等&#xff09;和多类型设备接入&#xff08;IPC/NVR/监控平台&#xff09;。主要功能包括视频直…

数据中心机柜如何正确选择

选择适合数据中心的机柜是一个综合考量多个因素的过程&#xff0c;以下是一些关键点&#xff0c;帮助您做出正确的选择&#xff1a; 结构与承重&#xff1a; 考虑机柜的类型&#xff08;开放式或封闭式&#xff09;、重量载荷能力&#xff0c;确保它能承受数据中心内设备的总重…

期末C语言易错知识点整理

1.在定义多维数组时&#xff0c;除了最左边的维度&#xff0c;其余的维度必须明确指定大小 2.int m[1][4]{4}; 定义的是一个 1 行 4 列的二维数组&#xff0c;初始化时提供了一个元素 4&#xff0c;其余元素默认初始化为 0&#xff0c;因此是正确的。 3.二维数组 a[3][6] 中的索…

flash-Attention2安装和使用

flash-Attention2安装和使用 文章目录 flash-Attention2安装和使用写在前面解决方案 写在前面 就怕你不知道怎么查 pytorch、cuda 的版本 配置cuda&#xff1a;vim ~/.bashrc export CUDA_HOME/usr/local/cuda/ export PATH$PATH:$CUDA_HOME/bin export LD_LIBRARY_PATH$LD_LIB…

分页插件 count有数据,代码不往下执行

如下:如果打印了sql那么当row>0时会有图2下面sql详情的输出 问题出在了分页参数上,pageNum为1,并且pageSize>2才能打印出图二的结果,图一为pageNum值是0,注意,查询第一页,分页应该传入的是1而不是0

松下的台灯值得入手吗?书客、飞利浦真实横评大分享!

我们都知道&#xff0c;无论是学习还是工作&#xff0c;都需要一个良好的照明环境&#xff0c;而台灯就是我们日常生活中非常重要的照明工具。它不仅能够提供额外的光线&#xff0c;还能减少眼睛疲劳&#xff0c;提高我们的工作和学习效率。 所以&#xff0c;选购一款合适的台…

根据后端返回的省市区重新封装树结构(省市区通过children表示)

对比图&#xff08;截取部分&#xff09;&#xff1a; 注&#xff1a;先看分步&#xff0c;最后会附上完整代码&#xff08;如果有用&#xff0c;可以给小编点个赞吗&#xff1f;十分感谢&#xff09; 1.首先将前端返回相同的省份只展示一次 const obj {}; let keyList []r…

安防监控视频平台LntonAIServer视频监控管理平台裸土检测算法技术核心和应用场景

LntonAIServer裸土检测算法是一种基于人工智能技术的创新解决方案&#xff0c;旨在实现对裸土地表的自动识别。以下是对该算法的详细分析&#xff1a; 技术基础&#xff1a; 1、该算法利用深度学习和计算机视觉技术&#xff0c;通过捕捉视频或图像中的关键信息&#xff0c;如…

SDIO学习(2)--SD卡 2.0协议

目录 1 SD卡简介 1.1 SD卡概念 1.2 SD卡外形和接口 1.3 SD卡特点 2 SD 2.0特点 3 SD 2.0总线拓扑结构 3.1 SD模式 3.2 SPI模式 4 SD 2.0总线协议 5 SD卡寄存器 5.1 OCR寄存器 5.2 CID 寄存器 5.3 CSD 寄存器 5.3.1 CSD结构 5.3.2 CSD寄存器 (CSD Version 2.0)…

软件测试之接口测试(Postman/Jmeter)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是接口测试 通常做的接口测试指的是系统对外的接口&#xff0c;比如你需要从别的系统来…

从零开始备考CCIE安全,这么做就对了

CCIE Security认证是思科提供的最高级别的安全认证&#xff0c;验证在设计、实施和故障排除复杂的安全网络基础设施方面的能力。 获得CCIE Security认证不仅是对你网络安全专业知识的高度认可&#xff0c;更是职业发展的重要转折。 它能够显著提升你的职业竞争力&#xff0c;为…