Android面试题(二)

来源:互联网 发布:linux 删除u盘分区 编辑:程序博客网 时间:2024/06/11 18:51

1.service的生命周期
这里写图片描述

2service是否是在mainThread中运行的,service能进行耗时操作吗?
没有明确的指明service的运行线程,service实在mainthread中运行的。
service里面不能执行耗时的操作(网络请求,拷贝数据库,大文件)

3.Service有哪些启动方法,有什么区别,怎样停用Service?
(1)通过startService
Service会经历onCreate(),onStart(),然后处于运行状态,stopService()时候调用 onDestroy方法
如果是调用者自己直接退出而没有调用stopService的haunted,Service会一直在后台 运行
(2)通过bindService
Service会运行onCreate,然后调用onBind(),这时候调用者和Service绑定在一起。调用者退出了,Service就会调
用onUnbind->onDestroy方法
4Android service保活
(参考http://blog.csdn.net/u011200604/article/details/52217423#t8)
①利用activity提升权限
②3.2. 利用 Notification 提升权限

5自定义view的相关方法
1、自定义View的属性
2、在View的构造方法中获得我们自定义的属性
[ 3、重写onMesure ]
4、重写onDraw

6:Serializable和Parcelable的区别
相同点:都能实现序列化且可用于Intent间的数据传递
Serializable是Java中的序列化接口,使用简单但开销大,序列化和反序列化过程需要大量I/O操作。
Parcelable更适合Android平台,使用麻烦但效率高,主要用在内存序列化上。

7Android 65k(65536 2的16次方)限制。
由于Android方法太多,导致打包的时候dex文件的方法数量超过65536。
解决办法:
Android Studio 允许用户通过 Gradle 的设置来使用多个 DEX 文件,这样每个文件中 的方法数就会减少,也就可以绕过这个限制。
具体操作办法:
修改 build.gradle 文件

修改项目的 build.gradle 文件启用 MultiDex 并包含 MultiDex 库:

android {    compileSdkVersion 21    buildToolsVersion "21.1.0"    defaultConfig {        ...        minSdkVersion 14        targetSdkVersion 21        ...        // Enabling multidex support.        multiDexEnabled true    }    ...}dependencies {  compile 'com.android.support:multidex:1.0.0'}

修改 manifest 文件

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.android.multidex.myapplication">    <application        ...        android:name="android.support.multidex.MultiDexApplication">        ...    </application></manifest>

如果用户不想在 manifest 文件中将 MultiDexApplication 指定为全局 Application,而是想继续使用原先指定的 Application, 则可以在全局 Application 中重写

attachBaseContext() 方法,并加上 MultiDex.install(this),如下: @Override protected void attachBaseContext(Context base) {     super.attachBaseContext(base);     MultiDex.install(this);}

8Android 四大组件?
Activity,Service,ContentProvider,BroadcastReceiver

9Android 中的context有哪几种?
Activity,Service,BroadcastReceiver,Application

10Android中的dialog为什么不能用的context是那种,为什么?
用的是activity.this, 不是用的appliation级别的,原因是:dialog是依附于activity的,他的生命周期和activity的生命周期是一样的。application的生命周期和activity的生命周期是不同的。

11andriod中的数据存储有哪些?
1.SharedPreferences共享偏好
2 文件存储:
1.Internal Storage内部存储空间
2.External Storage外部存储空间
3.SQLite Database数据库
4.contentprovider存储数据
5.网络存储。

12文件存储和数据库存储那个效率更高一些?
数据量大时使用数据库效率高
数据量小时使用文件效率高
文件适用于存储一些简单的文本数据或者二进制数据,SharedPreferences适用于存储一些键值对,而数据库则适用于那些复杂的关系型数据。
数据库存储的数据可以跨程序应用,存储复杂的关系型数据。
13请介绍下Android中常用的五种布局
FrameLayout(帧布局)
LinearLayout(线性布局)
AbsuLayout(绝对布局)
RelativeLayout(相对布局)

14notifyDataSetChanged和notifyDataSetInvalidated的区别
notifyDataSetInvalidated(),会重绘整个控件(还原到初始状态)
notifyDataSetChanged(),重绘当前可见区域

15postInvalidate与invalidate有什么区别?
都用于刷新界面
postInvalidate()用在子线程
invalidate()用在主线程

16Handler机制
andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。
Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。
Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。
Message Queue(消息队列):用来存放线程放入的消息。
线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。

0 0
原创粉丝点击