1.在同一线程中android:Handler和android:MessageQueue的数量对应关系是怎样的?
- 1(Handler):1(MessageQueue)
- N(Handler):1(MessageQueue)
- 1(Handler):N(MessageQueue)
- N(Handler):N(MessageQueue)
解析:
- Handler必须在Looper.prepare()之后才能创建。
- Looper与当前线程关联,并且管理着一个MessageQueue。
- Message是实现Parcelable接口的类
- 以一个线程为基准,它们的数量关系是Handler(N):Looper(1):MessageQueue(1):Thread(1)
简单说:在同一个线程中肯定会调用一个Looper.prepare(),其中生成一个MessageQueue。而代码中可以New出多个Handler发送各自的Message到这个MessageQueue中,最后会调用msg.target.dispatch中这个target来捕获自己发送的message,所以是:N(Handler)对应1(Message Queue)
2.以下适合在客户端做数据持久化存储的数据有
- redis
- localStorage
- sessionStorage
- userData
解析:
redis是一个数据库,干扰项
LocalStorage和SessionStorage一样都是用来存储客户端临时信息的对象
不同的是:localStorage生命周期是永久,这意味着除非用户显示在浏览器提供的UI上清除localStorage信息,否则这些信息将永远存在。sessionStorage生命周期为当前窗口或者标签页,一旦窗口或标签页被永久关闭了,那么所有通过sessionStorage存储的数据也就会被清空。
3.下面不可以退出Activtiy的是?
- finish()
- 抛出异常强制退出
- System.exit(0)
- onStop()
解析:
A:finish()方法就是退出activity
B:activity中出现异常,会弹出对话框,强制退出当前activity的
C:System.exit(0),这是退出所有activity使用的
D:onStop()只是activity一个周期方法,此时还没有退出,只有走到onDestory()才退出。只是生命周期中的一个,不会退出。
4.下面哪种进程最重要,最后被销毁?
- 服务进程
- 后台进程
- 前台进程
- 可见进程
解析:
重要性依次是:前台进程,可见进程,服务进程,后台进程,空进程,所以销毁的顺序为逆方向。
也可以理解成,前台是指与用户交互,执行完onResume的;可见是指onStart的
5.下列哪些情况,系统可能会弹出ANR对话框
- 在Activity中,Main线程消息队列中的消息在5s内没得到响应
- 在Service中,onStartCommand()方法执行超过5s
- 在BroadcastReceiver中,onReceiver()方法执行时间超过10s
在启动的新线程中,run()方法执行时间超过5s
解析:
在Android中,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框成作应用程序无响应(ANR)对话框,用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”
Activity——5秒
Broadcast——10秒
Service——20秒
会报出ANR,都是在主线程中运行的
6.如果在Activity中对一些资源以及状态进行保存操作,最好是在生命周期的哪个函数中进行?
- onPause()
- onCreate()
- onResume()
- onStart()
onPause()中对资源进行保存
也可以说是暂停的时候保存,才能保存用户最终的使用状态。
7.Android DVM的进程和Linux的进程,以下说法是错误的是?
- 它们都是进程的一种
- DVM是Android的虚拟机
- Linux的进程是程序的具体实现,是执行程序的过程
- DVM中可以创建多个进程来处理应用间的同步问题
解析:
每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例,每一个DVM都是在Linux中的一个进程(即每个Android应用存储对应一条Dalvik进程)
8.有关Activity生命周期描述正确的是?
- 设置Activity的android:screenOrientation=”portrait”属性时,切换屏幕横纵方向时不会重新调用各个生命周期,只会执行onConfigurationChanged方法
- 未设置Activity的android:configChanges属性,切换屏幕横纵方向时会重新调用onCreate()方法
- 当再次启动某个launchMode设置为singletask的Activity,它的onNewIntent(0方法会被触发
- 用户正在操作某个Activity,这是如果其它应用程序需要内存,系统会将用户当前操作的Activity强制关闭
解析:
A:设置Activity的android:screenOrientation=”portrait”属性时,无法切换横竖屏,因此不但不会重新调用各个生命周期方法,而且onConfigurationChanged方法也不会执行
B:未设置Activity的android:configChanges属性,API上这样说:“the activity will be restarted if any of these configuration changes happen in the system”
C:launchMode设置为singletask的时候,通过Intent启动一个Activity,如果系统已经存在一个实例,系统就会将请求发送到这个实例上,但这个时候,系统就不会在调用通常情况下我们处理数据的onCreate方法,而是调用onNewIntent方法。
D:用户正在操作某个Activity,这是如果其它应用程序需要内存,此时的Activity是Foreground process,应该按照Empty process,Background process,Service process,Visible process顺序kill,最后才是前台进程。
9.下列关于数据持久化的描述正确的事?
- 在内存中缓存多个Bitmap对象是一种数据持久化方法
- SQLite数据库文件可以保存在SD卡中
- ContentProvider的主要目的是为了将Android应用的数据持久化
- 数据持久化就是将内存的数据保存到外存
来自官方文档
Android数据持久化有五种方法
- SharedPreferences
- 内部存储(例如通过openDileOutput()打开一个文件输入输出流)
- SQLite
- 网络
- 外部存储