Android 斗鱼面经

Android 斗鱼面经

文章目录

  • [Android 斗鱼面经](#Android 斗鱼面经)

一面

  1. 先简单描述一下JVM JRE JDK的关系

:::info

JVM(Java Virtual Machine)

Java 虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。所以说,JVM 是 Java 能够跨平台的核心。

JRE (Java Runtime Environment)

Java 运行时环境。它主要包含两个部分,JVM的标准实现和 Java 的一些基本类库。它相对于 JVM来说,多出来的是一部分的 Java 类库。

JDK (Java Development Kit)

Java 开发工具包。JDK 是整个 Java 开发的核心,它集成了 JRE 和一些好用的小工具,例如javac.exe、java.exe、jar.exe 等。

显然这三者的关系是一层层的嵌套关系,即JDK > JRE > JVM。

:::

  1. 静态代理和动态代理有什么区别吗,静态代理和动态代理的应用场景

:::info

1、静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类。

2、静态代理事先知道要代理的是什么,而动态代理不知道要代理什么东西,只有在运行时才知道。

3、动态代理是实现JDK里的InvocationHandler接口的invoke方法,但注意的是代理的是接口,也就是你的业务类必须要实现接口,通过Proxy里的newProxyInstance得到代理对象。

应用场景:如果⽬标类的数量很多的话,代理类的实现也必然得很多,可能会造成代码量过于庞⼤,可能会增加代码的冗余度...再者,如果⽬标类需要代理的⽅法很多的话,代理类需要对这些⽅法⼀⼀实现代理逻辑,代理类的实现也将会很庞⼤。目标对象不固定,在应用程序执行时,动态创建目标对象。这时候使用动态代理,目标角色固定,应用程序执行前就得到目标角色,这时候使用静态代理

:::

  1. leakcanaryd有看过吗?
  2. 四大引用
  3. JVM垃圾回收新生代是怎么进行划分的
  4. Android里面原生设计的设计模式举例分析一下

:::info

建造者模式:Android#AlertDialog Bitmap#Bulider

观察者模式:View#OnClickListener

单例模式:Application

责任链:Okhttp拦截器模式

适配器:RecyclerView.Adapter

推荐阅读:

从Android源码角度谈设计模式(一):创建型模式 - 掘金

从Android源码角度谈设计模式(二):结构型模式 - 掘金

从Android源码角度谈设计模式(三):行为型模式 - 掘金

:::

  1. 单例模式有哪几种实现方式
  2. Handler机制了解过吗?
  3. 斗鱼App主页的启动模式
  4. 怎么判断下载的软件已经被下载过,或者下载软件百分比

:::info

1.通过获取系统上已安装的所有app列表来查找【不推荐。因为要获取已安装的所有app信息,可能会有隐私泄露风险】

:::

java 复制代码
public static boolean checkAppInstalled(Context context, String pkgName) {
    if (TextUtils.isEmpty(pkgName)) {
        return false;
    }
    PackageManager packageManager = context.getPackageManager();
    // 获取已安装的app信息
    List<PackageInfo> pkgInfos = packageManager.getInstalledPackages(0);
    if (pkgInfos != null) {
        for (int i = 0; i < pkgInfos.size(); i++) {
            String pkg = pkgInfos.get(i).packageName;
            if (pkgName.equals(pkg)) {
                return true;
            }
        }
    }
    return false;
}

:::info

2.通过获取特定包名的app信息来判断【推荐。因为只关注特定包名的app信息,隐私泄露风险低】

:::

java 复制代码
public static boolean checkQQInstalled(Context context, String pkgName) {
    if (TextUtils.isEmpty(pkgName)) {
        return false;
    }
    try {
        context.getPackageManager().getPackageInfo(pkgName, 0);
    } catch (Exception x) {
        return false;
    }
    return true;
}

二面

这一面主要是项目和实习经验,基本都是考验你项目里面学到了什么,积累了什么

  1. Gson是怎么做数据解析的,怎么进行高效数据解析?
相关推荐
诸神黄昏EX1 小时前
Android 分区相关介绍
android
大白要努力!2 小时前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
Estar.Lee2 小时前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip
Winston Wood2 小时前
Perfetto学习大全
android·性能优化·perfetto
Dnelic-5 小时前
【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录
android·junit·单元测试·android studio·自学笔记
Eastsea.Chen8 小时前
MTK Android12 user版本MtkLogger
android·framework
长亭外的少年15 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
建群新人小猿17 小时前
会员等级经验问题
android·开发语言·前端·javascript·php
1024小神18 小时前
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
android·ios·tauri
兰琛19 小时前
20241121 android中树结构列表(使用recyclerView实现)
android·gitee