Android 同花顺面经

Android 同花顺面经

文章目录

  • Android 同花顺面经
    • 一面

一面

  1. Android组件化搭建使用接口层路由有什么缺点?
    • 如果更改接口的话,其他的依赖的moudle都得改
  2. 说说kotlin和java的区别?
    • Java是支持面向对象的编程,Kotlin是支持面向对象支持函数式编程
    • Kotlin允许用户创建扩展函数,Java不支持任何扩展函数
    • Kotlin使用var val 来定义变量
    • Kotlin拥有很强大的Lambda表达式
    • Kotlin 程序不需要分号,而 Java 程序需要分号
    • 语言脚本功能允许您直接在 Gradle 构建脚本中使用 Kotlin,而 Java 不提供语言脚本功能。
    • Kotlin 中没有空变量或对象,空变量或对象是 Java 语言的一部分。
  3. 假如老年代和新生代有互相引用,他使用标记清除怎么处理?
    • 只需要在新生代上建立一个全局的数据结构,这个数据结构将老年代划分为若干个小块,每次都只记录老年代中的哪一块内存存在跨代引用。此后每当发生Minor GC时,只有包含了跨代引用的那一小块内存才会被加入到GC Roots中进行扫描。
    • 新生代维护一个卡表,一个卡页内存中通常包含不止一个对象,只要卡页内某个对象的字段存在跨代指针,那就将对应卡表数组对应位置上的元素标示为1,称之为Dirty,没有则标示为0,称之为Clean。在垃圾收集时,只需要筛选出卡表中变脏的元素,就能够找到对应卡页内存块中包含的跨代指针,将其加入到GC Roots中一并扫描。
    • 跨代引用、记忆集、卡表
  4. 实例.getClass() 与ClassForName.(类的全限定名)在执行过程中有什么区别?
    • 出现的时期不同:Class.forname()在运行时加载;Class.class和对象名.getClass()是在编译时加载
    • Class c = Class.class,是Class的class属性,Class c = c.getClass()则是通过对象获得类Class.forname(“全限定类名”),在运行时加载,对类进行加载,使用反射
  5. AIDL的具体实现步骤,sub对象是什么角色?
    • 新建一个IImoocAIDL.aidl文件作文服务端,rebuild一下,自动生成IImoocAIDL.java的接口文件。
    • 自动生成的AIDL文件,里面有
/*
* This file is auto-generated.  DO NOT MODIFY.
* Original file: F:\\AS for android\\AIDLTest\\aidlclient\\src\\main\\aidl\\com\\mecury\\aidltest\\IImoocAIDL.aidl
*/
package com.mecury.aidltest;
// Declare any non-default types here with import statementspublic interface IImoocAIDL extends android.os.IInterface {/**
* Local-side IPC implementation stub class.
*/public static abstract class Stub extends android.os.Binder implements com.mecury.aidltest.IImoocAIDL {private static final java.lang.String DESCRIPTOR = "com.mecury.aidltest.IImoocAIDL"; //Binder的唯一标识/**
* Construct the stub at attach it to the interface.
*/public Stub() {this.attachInterface(this, DESCRIPTOR);}/**
* Cast an IBinder object into an com.mecury.aidltest.IImoocAIDL interface,
* generating a proxy if needed.
*///将服务端的Binder对象转换成客户需要的AIDL对象,转换区分进程,客户端服务端位于同一进程,返回服务端的//Stub对象本身;否则返回的是系统的封装后的Stub.proxy对象。public static com.mecury.aidltest.IImoocAIDL asInterface(android.os.IBinder obj) {if ((obj == null)) {return null;}android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);if (((iin != null) && (iin instanceof com.mecury.aidltest.IImoocAIDL))) {return ((com.mecury.aidltest.IImoocAIDL) iin);}return new com.mecury.aidltest.IImoocAIDL.Stub.Proxy(obj);}//返回当前Binder对象@Overridepublic android.os.IBinder asBinder() {return this;}//运行在服务端的Binder线程池中@Overridepublic boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {switch (code) {case INTERFACE_TRANSACTION: {reply.writeString(DESCRIPTOR);return true;}case TRANSACTION_add: {data.enforceInterface(DESCRIPTOR);//读取客户端传递过来再data中存储的方法的参数int _arg0;_arg0 = data.readInt();int _arg1;_arg1 = data.readInt();//调用方法int _result = this.add(_arg0, _arg1);//将计算结果写入reply中reply.writeNoException();reply.writeInt(_result);return true;}}return super.onTransact(code, data, reply, flags); //向Transact传递数据}//代理类,运行在客户端private static class Proxy implements com.mecury.aidltest.IImoocAIDL {private android.os.IBinder mRemote; //声明一个IBinder对象Proxy(android.os.IBinder remote) {mRemote = remote;}//返回当前Binder对象@Overridepublic android.os.IBinder asBinder() {return mRemote;} public java.lang.String getInterfaceDescriptor() {return DESCRIPTOR;}//客户端调用此方法,传递进来num1和num2两个参数,@Overridepublic int add(int num1, int num2) throws android.os.RemoteException {android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();int _result;try {//向_data中写入参数_data.writeInterfaceToken(DESCRIPTOR);_data.writeInt(num1);_data.writeInt(num2);//通过transact方法向服务端传递参数,并调用了方法,返回的结果写入_reply中mRemote.transact(Stub.TRANSACTION_add, _data, _reply, 0);_reply.readException();_result = _reply.readInt();} finally {_reply.recycle();_data.recycle();}return _result;}}//标识位static final int TRANSACTION_add = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);}//计算num1 + num2public int add(int num1, int num2) throws android.os.RemoteException;}
- 在服务端新建一个Service用来监听客户端连接请求
 private IBinder iBinder = new IImoocAIDL.Stub(){@Overridepublic int add(int num1, int num2) throws RemoteException {Log.e("TAG","收到了来自客户端的请求" + num1 + "+" + num2 );return num1 + num2;}};
- <font style="color:rgb(79, 79, 79);">在AndroidMainfest.xml注册Service</font>
- <font style="color:rgb(79, 79, 79);">客户端绑定服务并调用服务端方法</font>
private ServiceConnection conn = new ServiceConnection() {//绑定服务,回调onBind()方法@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {iImoocAIDL = IImoocAIDL.Stub.asInterface(service);}@Overridepublic void onServiceDisconnected(ComponentName name) {iImoocAIDL = null;}};

:::info
sub是extends Binder类,相当于可以进行跨进程通信,implement 业务类。本身也是一个抽象类

:::

  1. 谈谈你对window和Activity和DecoView的关系的理解

:::info
Activity就像个控制器,不负责视图部分。Window像个承载器,装着内部视图。DecorView就是个顶层视图,是所有View的最外层布局。ViewRoot像个连接器,负责沟通,通过硬件的感知来通知视图,进行用户之间的交互。

推荐阅读:简析 Window、Activity、DecorView 以及 ViewRoot 之间的错综关系

:::

  1. AIDL与Messenger、Binder区别

:::info

  1. 只有当你允许来自不同的客户端访问你的服务并且需要处理多线程问题时你才必须使用AIDL
  2. 如果进程间的通信来自同一应用,应该使用Binder
  3. 如果进程间的通信不需要处理多线程,应该使用Messenger
  4. Messenger不适用大量并发的请求:Messenger以串行的方式来处理客户端发来的消息,如果大量的消息同时发送到服务端,服务端仍然只能一个个的去处理。
  5. Messenger主要是为了传递消息:对于需要跨进程调用服务端的方法,这种情景不适用Messenger。
  6. Messenger的底层实现是AIDL,系统为我们做了封装从而方便上层的调用。
  7. AIDL适用于大量并发的请求,以及涉及到服务端端方法调用的情况

:::

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

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

相关文章

Django入门教程——用户管理实现

第六章 用户管理实现 教学目的 复习数据的增删改查的实现。了解数据MD5加密算法以及实现模型表单中&#xff0c;自定义控件的使用中间件的原理和使用 需求分析 系统问题 员工档案涉及到员工的秘密&#xff0c;不能让任何人都可以看到&#xff0c;主要是人事部门进行数据的…

BugKu练习记录:矛盾

题目&#xff1a; $num$_GET[num]; if(!is_numeric($num)) { echo $num; if($num1) echo flag{**********}; }关键在于绕过is_numeric&#xff0c;PHP中字符串与数字弱比较&#xff0c;会将字符串转换为数字&#xff0c;截至到非数字字符&#xff0c;如果第一个字符就是非数字…

安宝特分享 | AR技术引领:跨国工业远程协作创新模式

在当今高度互联的工业环境中&#xff0c;跨国合作与沟通变得日益重要。然而&#xff0c;语言障碍常常成为高效协作的绊脚石。安宝特AR眼镜凭借其强大的多语言自动翻译和播报功能&#xff0c;正在改变这一局面&#xff0c;让远程协作变得更加顺畅。 01 多语言翻译优势 安宝特A…

逗号运算符应用举例

在main.cpp里输入程序如下&#xff1a; #include <iostream> //使能cin(),cout(); #include <iomanip> //使能setbase(),setfill(),setw(),setprecision(),setiosflags()和resetiosflags(); //setbase( char x )是设置输出数字的基数,如输出进制数则用set…

vxe-table v4.8+ 与 v3.10+ 虚拟滚动支持动态行高,虚拟渲染更快了

Vxe UI vue vxe-table v4.8 与 v3.10 解决了老版本虚拟滚动不支持动态行高的问题&#xff0c;重构了虚拟渲染&#xff0c;渲染性能大幅提升了&#xff0c;行高自适应和列宽拖动都支持&#xff0c;大幅降低虚拟渲染过程中的滚动白屏&#xff0c;大量数据列表滚动更加流畅。 自适…

ICPC区域赛成都站【赛后回顾+总结】

传送门 前言赛后总结赛后回顾赛后感悟 前言 首先&#xff0c;这是本人本赛季第一场XCPC区域赛&#xff0c;也是本人算竞生涯中第一场XCPC区域赛&#xff08;之前只打过邀请赛和省赛&#xff09;。 赛后总结 然后赛后总结一下&#xff1a;我队天崩开局&#xff0c;我队出师不利…

c盘满了怎么清理垃圾而不误删?6招轻松清理C盘,快来试试

c盘满了怎么清理垃圾而不误删&#xff1f;相信平时工作生活中离不开电脑&#xff0c;随着使用电脑时间就了&#xff0c;C 盘的空间会不断被占据&#xff0c;进而致使系统运行变得迟缓&#xff0c;甚至出现卡顿现象。因此&#xff0c;定期清理 C 盘的是非常重要的。很多电脑小白…

excel的宏1

1宏和vba visual basic for applications 一种编程语言 2vba编写一系列指令的程序&#xff0c;就是宏 3完成重复性的数据任务 点击开发工具 使用设置的宏之后表格的变化 excel帮忙编写了一个代码 以上为自动编写的代码

Swarm-LIO: Decentralized Swarm LiDAR-inertial Odometry论文翻译

文章目录 前言一、介绍二、相关工作三、方法A. 问题表述B. 框架概述C. 群体系统的初始化D. 去中心化激光雷达-惯性状态估计 四. 实验A. 室内飞行B. 退化环境飞行C. 去中心化部署 五. 结论和未来工作 前言 原文&#xff1a;原文 准确的自我状态和相对状态估计是完成群体任务的关…

光耦合器的关键作用和创新---腾恩科技

光耦合器或光隔离器已成为电路中必不可少的器件&#xff0c;它允许信号在无需直接电接触的情况下跨不同电压域传输。这种隔离能力对于保护低压元件免受高压电路的潜在损坏至关重要。本文将仔细研究光耦合器在当今技术中发挥的独特作用&#xff0c;并探讨其在各种应用中不断扩展…

linux:回车换行+进度条+git理解与使用以及如何解决免密码push问题

目录 特殊符号 Linux小程序---进度条 1.\n和\r的理解 2.缓冲区 3.设计简单的倒计时 4.设计简单的进度条 git-版本控制器 1.理解什么是版本控制器? 2.git的使用 3.git的其他说明 总结上传过程 特殊符号 1.(取消显化) 的作用:执行指令,但指令本身不会显化; 举个例子:我…

vscode摸鱼学习插件开发

不知道大家在摸鱼的时候&#xff0c;会不会想要学习&#xff1f; 或者有没有考公人&#xff0c;下班要学习的&#xff1f; 上班时间摸鱼&#xff0c;下班时间不够学习&#xff1f; 为此&#xff0c;我决定开发一个vscode插件&#xff0c;来刷粉笔题 粉笔插件名称&#xff1a;…

如何解决RabbitMQ消息的重复消费问题

什么情况下会导致消息的重复消费——在消费者还没成功发送自动确认机制时发生&#xff1a; 网络抖动消费者挂了 解决方案 每条消息设置一个唯一的标识id幂等方案&#xff1a;【Redis分布式锁、数据库锁&#xff08;悲观锁、乐观锁&#xff09;】 面试官&#xff1a;如何解决…

Kafka 与传统 MQ 消息系统之间有三个关键区别?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka 与传统 MQ 消息系统之间有三个关键区别&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; Kafka 与传统 MQ 消息系统之间有三个关键区别&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 …

软件测试基础知识最强总结(2024版)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是软件&#xff1f; 软件是计算机系统中的程序和相关文件或文档的总称。 二、什么是软件测试&#xff1f; 说法一&#xff1a;使用人工或自动的手段…

智慧用电监控装置:引领0.4kV安全用电新时代

在智能科技日新月异的今天&#xff0c;电力安全与管理正迎来一场前所未有的革新。为0.4kV以下TT、TN系统打造的智慧用电在线监控装置不仅重新定义了电力监控的边界&#xff0c;更为建筑安全用电筑起了一道坚不可摧的防线。 装置集成了单、三相交流电精确测量、四象限电能计量、…

【GL09】(算法)卡尔曼滤波

一、简介 卡尔曼滤波&#xff08;Kalman Filter&#xff09;是一种有效的递归滤波器&#xff08;自回归滤波器&#xff09;&#xff0c;它能够从一系列的包含统计噪声的测量中估计动态系统的状态。卡尔曼滤波广泛应用于信号处理、控制理论、自动驾驶、金融等领域。 基本公式&am…

IIC学习总结

一、基本概念 IIC&#xff08;Inter-Integrated Circuit&#xff09;其实是IICBus简称&#xff0c;所以中文应该叫集成电路总线&#xff0c;它是一种串行通信总线&#xff0c;使用多主从架构。 二、模块结构 I2C串行总线一般有两根信号线&#xff0c;一根是双向的数据线SDA&…

go 聊天系统项目-1

1、登录界面 说明&#xff1a;这一节的内容采用 go mod 管理【GO111MODULE‘’】的模块&#xff0c;从第二节开始使用【GO111MODULE‘off’】GOPATH 管理模块。具体参见 go 包相关知识 1.1登录界面代码目录结构 代码所在目录/Users/zld/Go-project/day8/chatroom/ 1.2登录…

qt QCheckBox详解

QCheckBox 是 Qt 框架中的一个控件&#xff0c;用于创建复选框&#xff0c;允许用户进行选择和取消选择。它通常用于表单、设置界面和任何需要用户选择的场景。 QCheckBox继承自QAbstractButton类&#xff0c;因此继承了按钮的特性。它表示一个复选框&#xff0c;用户可以通过…