美文网首页Android开发
Android面试题知识点积累(五)

Android面试题知识点积累(五)

作者: 奔跑吧李博 | 来源:发表于2021-03-22 17:28 被阅读0次
    高清大图加载该怎么处理?

    如果是高清大图,那就说明不允许进行图片压缩,比如微博长图,清明上河图。

    所以我们就要对图片进行局部显示,这就用到BitmapRegionDecoder属性,主要用于显示图片的某一块矩形区域。实际项目使用中,我们可以根据手势滑动,然后不断更新我们的Rect参数来实现具体的功能即可。

    fun setImagePart() {
        val inputStream: InputStream = assets.open("test.jpg")
        val bitmapRegionDecoder: BitmapRegionDecoder =
            BitmapRegionDecoder.newInstance(inputStream, false)
        val options = BitmapFactory.Options()
        val bitmap = bitmapRegionDecoder.decodeRegion(
            Rect(0, 0, 100, 100), options)
        image.setImageBitmap(bitmap)
    }
    
    Scroller是怎么实现View的弹性滑动?

    在MotionEvent.ACTION_UP事件触发时调用startScroll()方法,该方法并没有进行实际的滑动操作,而是记录滑动相关量(滑动距离、滑动时间)
    接着调用invalidate/postInvalidate()方法,请求View重绘,导致View.draw方法被执行
    当View重绘后会在draw方法中调用computeScroll方法,而computeScroll又会去向Scroller获取当前的scrollX和scrollY;然后通过scrollTo方法实现滑动;接着又调用postInvalidate方法来进行第二次重绘,和之前流程一样,如此反复导致View不断进行小幅度的滑动,而多次的小幅度滑动就组成了弹性滑动,直到整个滑动过成结束。

    mScroller = new Scroller(context);
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_UP:
                // 滚动开始时X的坐标,滚动开始时Y的坐标,横向滚动的距离,纵向滚动的距离
                mScroller.startScroll(getScrollX(), 0, dx, 0);
                invalidate();
                break;
        }
        return super.onTouchEvent(event);
    }
    
    @Override
    public void computeScroll() {
        // 重写computeScroll()方法,并在其内部完成平滑滚动的逻辑
        if (mScroller.computeScrollOffset()) {
            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
            invalidate();
        }
    }
    
    Binder在在Android中的应用

    Binder在Android中的应用除了ServiceManager,你还想到了什么呢?

    系统服务是用过getSystemService获取的服务,内部也就是通过ServiceManager。例如四大组件的启动调度等工作,就是通过Binder机制传递给ActivityManagerService,再反馈给Zygote。而我们自己平时应用中获取服务也是通过getSystemService(getApplication().WINDOW_SERVICE)代码获取。
    AIDL(Android Interface definition language)。例如我们定义一个IServer.aidl文件,aidl工具会自动生成一个IServer.java的java接口类(包含Stub,Proxy等内部类)。
    前台进程通过bindService绑定后台服务进程时,onServiceConnected(ComponentName name, IBinder service)传回IBinder对象,并且可以通过IServer.Stub.asInterface(service)获取IServer的内部类Proxy的对象,其实现了IServer接口。

    synchronized和volatile区别

    1.volatile本质是告诉JVM当前变量在寄存器中的值是不确定的,需要从主存中读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
    2.volatile仅能用在变量级别,而synchronized可以使用在变量、方法、类级别。
    3.volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。
    4.volatile不会造成线程阻塞,synchronized可能会造成线程阻塞。
    5.volatile标记的变量不会被编译器优化,synchronized标记的变量可以被编译器优化。
    volatile不能保证原子性的原因:线程A修改了变量还没结束时,线程B可以看到已修改的值,而且可以修改这个变量,而不用等A结束,是因为volatile变量没上锁。

    SharedPreference的commit ,apply区别,SharedPreference是线程安全的吗?
    1. apply没有返回值而commit返回boolean表明修改是否提交成功。
    2. apply是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 而commit是同步的提交到硬件磁盘,因此,在多个并发的提交commit的时候,他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率。而apply只是原子的提交到内容,后面有调用apply的函数的将会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率。
      代码中可以看到读写操作时都有大量的synchronized,因此它是线程安全的。
    android签名打包v1和v2有什么区别?

    v1签名是对jar进行签名,V2签名是对整个apk签名:官方介绍就是:v2签名是在整个APK文件的二进制内容上计算和验证的,v1是在归档文件中解压缩文件内容。

    两种签名所产生的结果:
    v1:在v1中只对未压缩的文件内容进行了验证,所以在APK签名之后可以进行很多修改——文件可以移动,甚至可以重新压缩。即可以对签名后的文件在进行处理
    v2:v2签名验证了归档中的所有字节,而不是单独的ZIP条目,如果您在构建过程中有任何定制任务,包括篡改或处理APK文件,请确保禁用它们,否则您可能会使v2签名失效,从而使您的APKs与Android 7.0和以上版本不兼容。

    描述LayoutInflate的整个过程

    使用代码:

    LayoutInflater layoutInflater = LayoutInflater.from(this);  
    View buttonLayout = layoutInflater.inflate(R.layout.layutid, null); 
    
    Android硬件加速原理

    软件绘制与硬件加入对比:


    如果硬件加速不支持或者被关闭,则使用软件绘制,生成的Canvas即Canvas.class的对象;
    如果支持硬件加速,则生成的是DisplayListCanvas.class的对象;
    两者的isHardwareAccelerated()方法返回的值分别为false、true,View根据这个值判断是否使用硬件加速。

    线上native crash收集实现方案

    上图给出NativeCrash收集的整体实现方案。APP中接入提供的SDK,包含一个通用SO和一个JAR,当APP中发生NDK崩溃时,会在手机端生成一个dmp文件,待下次APP重启后,将此dmp文件上传至服务端,在服务端进行解析、分类、聚合、可读展示等过程。

    如果项目接入了Bugly,也就可以收集到NativeCrash上传至Bugly。

    手机号一键免密登陆怎么做

    三大运营商支持了手机号一键登录功能,需要实现一键登录需要接入各运营商的一键登录SDK,在集成官网创建应用。

    内存抖动实际怎么解决

    产生的原因是在代码中频繁、循环地创建对象,导致大量对象频繁创建和销毁。普通的会因为内存使用越来越多导致卡顿。严重的,会产生大量不连续的内存空间,如果此时有一个大对象需要申请内存,就有可能申请失败,导致OOM内存溢出。

    进入AS的Profiler工具,进入Memory指标,如果发现内存状态为起起伏伏的锯齿状走势,可以认为是内存抖动发生。

    点击Record进行记录


    一段时间后,stopRecord,这张表格代表的是,你Record这段时间之内创建的对象,点击一下第二列Allocations,对创建的数量进行排序,找出创建次数最多的对象去解决,减去不必要的对象创建。


    mainfest中配置LargeHeap,真的能分配到大内存吗?能增加多大内存?

    设置android:largeHeap="true"属性之后,进行如下测试查看最大可用内存,发现最大可用内存真的增大了。但是最大不能超过系统能分配给App的最大内存。

    ActivityManager.getLargeMemoryClass()  //可以获得开启largeHeap最大的内存大小
    
    ReentrantLock和synchronized区别

    (1) synchronized 是Java的一个内置关键字,而ReentrantLock是Java的一个类。
    (2) synchronized只能是非公平锁。而ReentrantLock可以实现公平锁和非公平锁两种。
    (3) synchronized不能中断一个等待锁的线程,而Lock可以中断一个试图获取锁的线程。
    (4) synchronized不能设置超时,而Lock可以设置超时。
    (5) synchronized会自动释放锁,而ReentrantLock不会自动释放锁,必须手动释放,否则可能会导致死锁。

    Bitmap Drawable View 三者之间的联系和区别

    bitmap: 仅仅就是一个位图 你可以理解为一张图片在内存中的映射。 就这么简单。这个很多人都知道
    view: 这个就是android的核心了,你看到的一切东西都是view 这个很多人也知道。 但是这个理解成都还不够,view最大的作用是2个 一个是draw 也就是canvas的draw方法,还有一个作用 就是测量大小。 要想明白这点。
    drawable: 他其实本身和bitmap没有关系, 你可以把他理解为是一个绘制工具,和view的第一个作用是一摸一样的,你能用view的canvas 画出来的东西 你用drawable 一样可以画出来, 不一样的是drawable 仅仅能绘制,但是不能测量自己的大小,但是view可以。换句话说 drawable 承担了view的一半作用。

    WebView秒开的一些优化可以怎么做

    首先我们要知道不能秒开的原因有哪些?

    1.文件下载耗时:包括html、css、js、图片等
    2.页面渲染耗时:页面渲染,解析js、css文件等
    3.WebView创建耗时:首次创建WebView耗时大约需要500ms左右,第二次创建耗时大约需要20ms左右

    今日头条针对自己平台的文章详情页做了很多优化,具体包括以下几点:

    内置文章详情页所需的css、js等文件,并可以控制版本
    WebView在Application中预创建
    预加载包含文章详情页所需的css、js的空html
    在列表页预加载文章详情所需的内容使用LRU内存缓存并保存到本地数据库
    在文章详情页获取预创建的WebView(预加载了html),直接调用js设置页面内容
    通过js控制图片的显示,图片懒加载(当图片在可见区域或即将可见才会加载图片),点击加载图片等

    抓包的原理

    要实现对App的网络数据抓包,需要监控App与服务器交互之间的网络节点,监控其中任意一个网络节点(网卡),获取所有经过网卡中的数据,对这些数据按照网络协议进行解析,这就是抓包的基本原理。

    但是中间网络节点,不受我们控制,所以基本无法实现抓包的,只能在客户端和服务端进行抓包。

    本地网络指的是WIFI的路由,如果直接抓路由器的包还是比较麻烦的,因此我们会在手机和本地路由之间加一层代理服务,这个代理服务由抓包工具去做,手机通过代理服务器的本地Ip地址和端口连上,手机将请求发送给代理服务器,代理服务器去请求手机发出的请求,然后返回给手机客户端。如果代理服务器退出,手机仍然是代理状态,找不到代理服务器,那么就请求不了数据,此时就得先退出代理状态了。

    相关文章

      网友评论

        本文标题:Android面试题知识点积累(五)

        本文链接:https://www.haomeiwen.com/subject/zwiocltx.html