• android fragment和activity的区别
  • 可以理解Fragment是一种特殊的View,负责一个模块或者一个特殊部分的展示。
  • 大部分Fragment是依托于Activity存在的,由Activity的FragmentManager来管理
  • Fragment可以解决多Activity的问题,即将3.0之前的频繁Activity跳转改成一个Activity内Fragment的切换。
  • Fragment可以解决碎片化的问题。

最重要的区别Activity是一个Context是打通系统交互的一个壳,Fragment是一个实现ComponentCallbacks和 OnCreateContextMenuListener的Object。必须attach到一个Activity上。

  • 谈谈你对Bitmap的理解, 什么时候应该手动调用bitmap.recycle()

Bitmap是android中经常使用的一个类,它代表了一个图片资源。 Bitmap消耗内存很严重,如果不注意优化代码,经常会出现OOM问题,优化方式通常有这么几种: 1. 使用缓存; 2. 压缩图片; 3. 及时回收;

至于什么时候需要手动调用recycle,这就看具体场景了,原则是当我们不再使用Bitmao时,需要回收之。另外,我们需要注意,2.3之前Bitmap对象与像素数据是分开存放的,Bitmap对象存在java Heap中而像素数据存放在Native Memory中,这时很有必要调用recycle回收内存。但是2.3之后,Bitmap对象和像素数据都是存在Heap中,GC可以回收其内存。


  • ViewPager中加载Fragment的优化问题?如何做到微信那样切换界面时的延时加载

除了重写Fragment的setUserVisibleHint()方法,还可以手动设置mViewPager.setOffscreenPageLimit();

private boolean hasLoadedOnce = false; // your boolean field

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if (this.isVisible()) {
        // we check that the fragment is becoming visible
        if (isVisibleToUser && !hasLoadedOnce) {
                //do something
            }
        }
    }
}






  • android清单文件application节点增加tools:replace=""有什么用

这个是android studio用的,对于Eclipse没有任何用。 android studio的Gradle插件默认会启用Manifest Merger Tool,若Library项目中也定义了与主项目相同的属性(例如默认生成的android:icon和android:theme),则此时会合并失败,并报错。 解决方法: 方法1: 在Manifest.xml的application标签下添加tools:replace="android:icon, android:theme"(多个属性用,隔开,并且记住在manifest根标签上加入xmlns:tools="http://schemas.android.com/tools",否则会找不到namespace哦)

方法2: 在build.gradle根标签上加上useOldManifestMerger true (懒人方法)

  • mipmap文件夹和drawable文件夹的区别
它只是用来放启动图标的
它的好处就是,你只用放一个mipmap图标,它就会给你各种版本(比如平板,手机)的apk自动生成相应分辨率的图标,以节约空间。
  • 当ListView一直向下滑动时加载了很多图片,这时候如果再向上滑动,怎么处理之前已经加载好的图片?另外,不对加载好的图片处理的话一直向下滑会不会造成OOM

如果你用框架的话,比如Picasso,Glide,就不用管它了......

这些框架会自动回收不可见的View,所以不用担心OOM,我极端的测试过1000张 400x272 的图片,都没有卡。

加载过的图片可以缓存在有缓存容量限制的内存中,如使用LruCache,同时也可以缓存在设置有缓存容量限制sdcard中。取图片时统一先向内存缓存中获取,内存缓存中获取不到则向sdcard缓存中获取,还是获取不到再进行下载或读取,获取成功后放入缓存。以上过程均在线程中进行。 这样在图片不断加载的过程中,始终能占用的内存只有缓存上限大小,超过缓存上限的图片将被释放。

线程的话可以设置线程池,并设置线程池大小和执行策略(如FILO)

  • ?android:attr 和 ?attr/ 分别代表什么意思 有何区别

?attr表示引用的是当前主题中的资源。 ?android:attr/表示引用的是android系统中的一些资源。

  • 当一个全屏Activity A进入到带有ActionBar(或ToolBar)的非全屏Activity B时,怎么解决Status Bar闪动的问题?
  1. 给Activity在清单文件里设置全屏;
  2. 在该Activity执行Finish之前,执行下面语句:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN, WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);




  • 简述MVC模式以及在你项目中的应用

a.模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。 b.视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。 c.控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分

  • View:自定义View或ViewGroup,负责将用户的请求通知Controller,并根据model更新界面;
  • Controller:Activity或者Fragment,接收用户请求并更新model;
  • Model:数据模型,负责数据处理相关的逻辑,封装应用程序状态,响应状态查询,通知View改变,对应Android中的datebase、SharePreference等。
  • Android有什么便捷的方式实现activity变暗的效果


/**
     * 调整窗口的透明度
     * @param from>=0&&from<=1.0f
     * @param to>=0&&to<=1.0f
     * 
     * */
    private void dimBackground(final float from, final float to) {
        final Window window = getWindow();
        ValueAnimator valueAnimator = ValueAnimator.ofFloat(from, to);
        valueAnimator.setDuration(500);
        valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                WindowManager.LayoutParams params = window.getAttributes();
                params.alpha = (Float) animation.getAnimatedValue();
                window.setAttributes(params);
            }
        });

        valueAnimator.start();
    }





  • 定位项目中,如何选取定位方案,如何平衡耗电与实时位置的精度?

方案1: 考虑到应用中有多处地方需要使用位置请求,在Application类中开始定位,Application持有一个全局的公共位置对象,然后隔一定时间自动刷新位置,每次刷新成功都把新的位置信息赋值到全局的位置对象,然后每个需要使用位置请求的地方都使用全局的位置信息进行请求。 该方案好处:请求的时候无需再反复定位,每次请求都使用全局的位置对象,节省时间。 该方案弊端:耗电,每隔一定时间自动刷新位置,对电量的消耗比较大。

方案2:按需定位,每次请求前都进行定位。这样做的好处是比较省电,而且节省资源,但是请求时间会变得相对较长。




这个系列很多都是总结归纳与互联网,如有冒犯及时通知然后下线。目的只是为了更好地方便面试。谢谢!