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是怎么做数据解析的,怎么进行高效数据解析?
相关推荐
开心呆哥32 分钟前
如何使用 Python 控制 Android 设备的蓝牙和 WiFi
android·python
bytebeats3 小时前
Kotlin 注解全面指北
android·java·kotlin
q567315234 小时前
Python 中的字符串匹配算法
android·java·javascript·python·算法
jzlhll1234 小时前
kotlin android Handler removeCallbacks runnable不生效的一种可能
android·开发语言·kotlin
大耳猫5 小时前
Android Studio 多工程公用module引用
android·java·kotlin·android studio
良技漫谈6 小时前
Rust移动开发:Rust在Android端集成使用介绍
android·程序人生·rust·kotlin·学习方法
Erorrs9 小时前
Android13 系统/用户证书安装相关分析总结(二) 如何增加一个安装系统证书的接口
android·java·数据库
东坡大表哥10 小时前
【Android】常见问题集锦
android
ShuQiHere11 小时前
【ShuQiHere】️ 深入了解 ADB(Android Debug Bridge):您的 Android 开发利器!
android·adb
魔法自动机13 小时前
Unity3D学习FPS游戏(9)武器音效添加、创建敌人模型和血条
android·学习·游戏