Android面试(1)

面试比较常问的和平常经常遇到的一些问题,整理了下在加上自己的理解。欢迎拍砖.
原创文章,转载需注明出处,非常感谢。http://blog.csdn.net/guiping_ding/article/details/52296153

基础问题:
  1. 什么是ANR?,如何避免?
    ANR 全拼是 Application Not Responding 顾名思义就是应用程序无响应。什么会导致应用程序无响应呢,就是在主线程中做一些耗时的操作,阻塞了主线程,导致应用程序无响应。
    解决办法:耗时操作不好放在主线程中去操作,最好是异步去处理阻塞主线程的操作,完了再更新主线程。

  2. ANR三种类型(activity timeout, service timeout 和 receiver timeout)

  3. 更新UI线程的方法有哪些?
    方法一:主线程中定义Handle 子线程中发送消息。在主线程在更新UI线程。
    方法二:直接在子线程在通过调用Activity的runOnUiThread方法更新UI线程。
    方法三:调用View的post的方法刷新UI线程。

  4. Activity 的加载模式有哪些[Activity的任务栈]?他们有什么区别?
    指定Activity的任务栈方法:

    android:launchMode=”standard|singleInstance|singleTask|singleTop”

    • standard: 标准模式,也是默认模式。每次启动Activity无论任务栈内有没有该Activity实例都会重新创建一个新的Activity实例,并且将其压入任务栈顶部,Activity启动的onCreate() –> onStart() –> onResume() 都会被调用。
    • singleTop: 栈顶模式,这种模式下,如果Activity已经位于当前任务栈的顶部,再次启动Activity则不会重新创建新的Activity实例,也不会调用onCreate() onStart() onResume() 等方法,而是直接调用onNewIntent()方法。如果当前Activity不在当前任务栈的栈顶,那么会重新创建新的实例并且压入栈顶。和standard任务模式一样。
    • singleTask: 栈内复用模式。当Activity指定任务模式是该模式的时候,启动Activity的时候,系统会去检查当前任务栈中是不是存在该Activity实例,如果不存在则创建新的Activity实例,并且压入栈顶。会调用onCreate() onStart() onResume() 方法。如果系统检查时栈内已有该Activity实例,则这个实例会被调到栈的最顶部,并且会调用onNewIntent()方法,当然任务栈中位于该Activity实例顶部的所有实例都会被清理。
    • singleInstance: 加强版的singleTask模式,当Activity制定为该模式的时候,系统会单独为该Activity创建一个任务栈,并且装入该栈内,并且该栈内惊且只有一个该Activity的实例,后续请求都会不在创建新的实例,除非这个任务栈被系统销毁。
  5. Service 的两种启动方式,并阐述他们区别?
    • startService(Intent service)
    • bindService(Intent service,ServiceConnection conn,int flags)
      区别:
    • 通过startService()启动的服务,其Service的生命周期和Context没有半点关系,除非调用stopService()方法停止该服务,或者被系统干掉。这种启动Service方法的生命周期是: onCreate()->onStartCommand()->onDestory().如果该Service已启动并没有调用stopService()或者被系统干掉,再起startService()则不会重复执行onCreate()方法,而是会调用onStart() 和 onStartCommand()方法。服务停止时候会调用onDestory(),并且只能被停止一次。
    • 通过bindService()启动的服务,其Service 的生命周期和启动这息息相关,调用者挂了该Service也跟着挂。这种启动Service的生命周期是:onCreate() -> onBind() -> onUnBind() -> onDestory()

      切记在在Manifest.xml文件中配置该Service

  6. 简述下IntentService的使用场景和特点?并且说说他与Service的不同?

    IntentService 是Service的子类 ,是异步的,执行完onHandleIntent(Intent intent)方法中的内容会自动停止服务。很好的简化了在Service中做耗时操作流程,并且解决了在Service中做完耗时操作忘记停止并且销毁Service的问题。

    优点

    • 不需要自己去new Thread
    • 不需要考虑在什么时候关闭该Service

    通过 IntentService源码发现,里面实现很简单,就是IntentService继承Service,然后定义了一个Handler,在onCreate()中创建实例,在onStartCommand()中调用onStart(),在onStart()中通过onCreate()中创建的handler.sendMessage(msg)。在handler的handleMessage()中调用onHandlerIntent()抽象方法[它的子类必须实现]。在onHandleIntent()后边紧跟着调用stopSelf(msg.arg1);停止服务。一个异步的服务完成了。

  7. 如何保证Service不被杀死?

    1. Service 设置成START_STICKY
      • kill 后会被重启,重传Intent,保持和重启前一样
    2. 提升Service进程优先级。
      • Android中进程是托管的,当系统进程空间紧张的时候,会依照优先级自动进行进程回收
      • 当Service运行在低内存的环境时,将会kill掉一些存在的进程。因此设置进程优先级很重要,可以在startForegroud()使用startForeGroud()将Service放到前台状态。这样低内存状态被kill的几率会低一些。
      • 说到底还是会被kill掉的,好好优化程序吧,别做这些么用的操作了。
    3. 在Service的onDestory()方法里重启该Service
      • 可以在onDestory()中直接 startService
      • 可以service+broadcast的方式,当调用Service的onDestory()方法的时候发送一个自定义广播,在广播中startService。
      • 这种还是会被kill了的。
    4. 监听系统的广播判断Service状态
      • 这种有点流氓,有这么费尽心思的搞不如好好优化代码。不过好像Google在慢慢的取消一些广播,无法检测的到,不是长久之计。
    5. 在JNI层,用C代码fork一个进程出来。
      • 5.0以后可能不持支。
    6. root之后放到system/app 目录下作为系统应用
    7. 放一个像素在前台(手机QQ)

    前边这7中方法中用过前四个 5,6,7网上看的没有自己实现过。

  • 广播(Boardcast Receiver)有那几种注册方式?他们区别是什么?
    1.静态注册:在AndroidManifest.xml 文件中进行注册,当App退出后,Receiver任然可以接收到广播并且进行相应的处理。
    2.动态注册:在代码中动态注册,当App退出后,不能再接受到广播。
  • Android动画有几类?区别是什么?
    1.tween 补间动画,通过制定View的初末状态和变化时间,方式,对View的内容完成一系列的图形变化来实现动画的效果。
    2.frame 帧动画 AnimationDrawable控制animation-list xml布局
    3.PropertyAnimation 属性动画。

    1,2也就是传统的动画,他们只改变view的显示效果,却不会更改View的位置,而属性动画不仅改变View的显示还会更改View的坐标位置。这就是最大的区别吧。^_^

  • 自定义View的过程有哪些?
    重写如下方法:
    1. onMeasure(): 负责测量View试图
    2. onLayout(): 负责计算布局
    3. onDraw(): 负责绘制View,展现出来。
      自定义View最重要的三个部分
  • 如何自定义控件,大概的流程是什么?
    1. 自定义属性的声明和获取:
      • 分析需要自定义控件的属性。
      • 在res/values/attrs.xml中定义声明。
      • 在layout文件中引用使用。
      • 在View的构造方法中进行属性数据获取。
    2. 重写onMeasure()方法,进行控件的测量。
    3. 重写onLayout(ViewGroup)方法,进行控件大小的计算。
    4. 重写onDraw()方法,绘制View 展现给用户你想要的效果。
    5. 重写onTouchEvent(MotionEvent event)方法,用来处理用户点击事件。
    6. 重写onInterceptTouchEvent(MotionEvent event)方法,用来判断是否拦截某个事件。
    7. 状态的恢复和保存。
  • Application的Context和Activity、Service的Context 的区别是什么?简要描述。

    1. 相同点
      • 他们都间接的继承了Context
    2. 不同点

    • Application和Service都是继承ContextWrapper在继承了Context。
    • Activity是继承了ContextThemeWrapper在继承了ContextWrapper最后继承了Context。

    为什么在结构关系上Activity多了一层ContextThemeWrapper,因为Activity有界面,给用户展示的东西,而Service是一个没有界面的服务,后台处理的东东,Application 更加是一个抽象的东西,他们都是通过Activity类呈现的。

  • 每一个Activity和Service以及Application的Context都是一个新的ContextImpl对象

  • getApplication()用来获取Application实例的,但是这个方法只又在Activity和Service中调用的到。绝大多数情况下我们都在Activity和Service中使用Application,但是如果在其他的场景下:比如在BroadcastReceiver中也想获取Application的实例,就可以使用getApplicationContext()方法。getApplicationContext()方法比getApplication()方法的作用域会广泛一些,任何一个实例只要调用getApplicationContext()方法都会拿到Application对象。
  • Activity在创建的时候会new一个ContextImpl对象并在attch方法中关联它,Application和Service也差不多。
  • 创建对话框传入Application的Context是会报错的。 哈哈
  • 尽管Application、Activity、Service都有自己的ContextImpl,并且每个ContextImpl都有自己的mResources成员,但是由于他们的吗Resources成员都来自唯一的ResourcesManager实例,所以他们的mResources都是指向同一块内存。

    补充一点工作中的经验吧,尽量在BaseActivity中创建一个public Context mContext对象 然后再onCreate()中赋值,所有的子类都公用这个mContext。这样保证了唯一性。尤其在使用Fragment的时候超级重要。最坑的一点是 项目中继承BaseFragment 过多,导致getActivity 为空。


  • 2016.08.24/02.24
    未完待续

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值