关闭

Android面试中经常遇到的问题

标签: android面试
336人阅读 评论(0) 收藏 举报
分类:

Android的四大组件

四大组件的共同点是,要想使用,都要在AndroidManifest.xml里面进行注册。

1. Activity

Activity的生命周期

首先,Activity有七个表示不同阶段的回调函数。
onCreate onStart onResume onPause onStop onDestroy onRestart
下面这张图表示的是Activty完整的生命周期。
这里写图片描述
在pause和stop状态下Activity都有可能被回收
可以分为三个不同的生命周期。分别是:

  • entire lifetime
    onCreate->onStart->onResume->onPause->onStop->onDestroy
  • visible lifetime
    此时Activity是可见的
    onStart->onResume->onPause
  • foreground lifetime
    此时可以Acticity是可见的,并且可以接受用户的交互
    onResume->onPause

Activity的启动模式

通过在AndroidManifest.xml文件里面配置< activity >标签的android:LaunchMode属性来决定Activity的启动模式

standard

默认的启动模式。
每次要启动这个Activity的时候,不管当前的返回栈中是否已经有了这个Activity的实例,都会生成一个把这个Activity的一个新的实例入栈。

singleTop

当要启动的Activity有位于返回栈栈顶的实例的时候,不创建新的实例入栈;否则,创建一个新的实例并入栈。

singleTask

放要启动一个Activity的时候,首先查看整个返回栈中有没有这个Activity的实例,如果有的话(不管在不在栈顶),就把这个实例之前的其他实例出栈,使得这个实例移到栈顶,变成当前Activity;如果没有发现已有的实例,还是创建一个新的实例并入栈。

singleInstance

每个进程维护一个返回栈,表示这个进程启动过的Activity。当Activity是这个启动模式的时候,第一次启动这个Activity的时候这个Activity的实例不会入当前的返回栈,而是创建一个新的返回栈并入栈。

2. Service

Local Service —————-运行在主进程中
Remote Service————– 运行在单独的进程中

service的生命周期

这里写图片描述

Service的两种状态

started

A service is “started” when an application component (such as an activity) starts it by calling startService().

bound

A service is “bound” when an application component binds to it by calling bindService().

既被start又被绑定的service生命周期
这里写图片描述

只有Service, ContentProvider, Activity才能和Service进行bind,Broadcast Receiver不行。
要想实现和Service的交互,可以通过serviceConnection接口。
用一个类实现serviceConnection接口,重写onServiceConnected()方法和onServiceDisconnected方法。然后把这个类的实例作为参数传给bindService()方法;在Service那边要重写onBind()方法,返回一个继承自Binder类MyBinder的类的实例,这个实例会被传递给上面的onServiceConnected方法(如果onBind()返回null,则不会有回调),如果我们在这个MyBinder类中写了可以获得Service实例的public方法(MyBinder可以作为Service的内部类),现在就可以通过这个方法来获得Service实例,然后就可以和Service进行交互了。需要注意的是,调用unbind()是不会回调serviceConnection接口中的onDisConnected()函数的。只有在未预期的情况下(比如service突然被kill)才会调用

当Service被调用startService或者bindService的时候,如果服务是没有在内存中的,那么就会执行onCreate和onStartCommand,如果Service此时是活跃的,只会执行onStartCmmand。started和bound并不冲突。当一个Service既started又bound的时候,当所有绑定的组件都unbindService调用了stopSelf()或者stopService两个条件都满足的时候才会被销毁。

Service的意义以及和Thread的区别

比如音乐播放,或者消息推送等,会用到Service。
Service和Thread是两个完全不同的概念。
除非特别指定,否则Service运行在当前进程的主线程里。Service是说想运行某些长时间的,不需要和用户交互的任务的时候用到。有服务的线程不容易被系统杀死。为了防止ANR,可以在服务中启动新的线程来执行任务。

3. Broadcast Receiver

4. Content Provider

ContentProvider和ContentResolver之间自动管理跨进程通信IPC
特定的查询方式避免了sql注入,



ListView的优化方法

getView方法
因为ListView每一个要绘制的item是用过与之绑定的adapt的getView方法返回的,所以中心思想是要尽量减少在getView方法中所做的事情。
复用getView(int position, view covertView, viewGroup parent)中的covertView,就可以避免每次都要inflate,很费时。省去从xml布局文件映射到内存中各个view的时间。
viewholder
使用一个viewHolder类,里面的属性是listView中的每个item中包含的view。当inflate的时候,使用setTag把赋好值的viewHolder给和item关联起来,当covertView不为null的时候,直接用getTag得到之前的viewHolder,省去findViewByView()的时间
异步加载图片

滑动的时候不去加载item

图片缓存

recycleView(android L)
ListView的替代类,性能更好。


数据持久化存储的几种方法

1. Shared Preference

2. SQLite

3. Content Provider

4. 文件系统


Android的布局有哪几种,分别有什么特点


多线程,以及Handler、Message、Looper的作用和原理

java中的多线程


view的重写

view.post()方法

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:27947次
    • 积分:465
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:3篇
    • 译文:1篇
    • 评论:4条
    文章分类
    最新评论