Android基础面试题自答整理

1、Activity、Service和BroadCast Receiver的生命周期

Activity:
Activity有四种活动状态,运行、暂停、停止、销毁。
void onCreate(Bundle savedInstanceState)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()

Service:
void onCreate()
void onStartCommand()
void onBind()
void onDestroy()

Broadcast Receiver:
Broadcast Receiver生命周期中仅有一个回调方法:void onReceive(Context curContext, Intent broadcastMsg)
当接收器接收到一条broadcast消息,Android就会调用onReceiver(),并传递给它一个Intent对象,这个对象携带着那条broadcast消息。我们认为仅当执行这个方式时,Broadcast receiver是活动的;这个方法返回时,它就终止了。这就是Broadcast receiver的生命周期。

2、写出几种service和Activity的交互方式

通过Binder对象,使用bindService实现。
通过broadcast(广播)的形式,使用intent在service和activity之间不停地传递信息。

3、UI线程和非UI线程的交互方式

1、Handler
2、Activity.runOnUIThread(Runnable)
3、View.Post(Runnable)
4、View.PostDelayed(Runnabe,long)
5、AsyncTask

4、requestLayout, invalidate和postInvalidate的异同

requestLayout:当view确定自身已经不再适合现有的区域时,该view本身调用这个方法要求parent view重新调用他的onMeasure onLayout来对重新设置自己位置。特别的当view的layoutparameter发生改变,并且它的值还没能应用到view上,这时候适合调用这个方法。
invalidate:View本身调用迫使view重画。在UI线程自身使用。
postInvalidate:在非UI线程使用。

5、写出三种常用layout布局并进行解释

LinearLayout(线性布局):所包含的控件在线性方向上依次排列。

RelativeLayout(相对布局):通过相对定位的方式让控件出现在布局的任何位置。

FrameLayout(框架布局):是一个存放控件的空间容器,放进的每一个控件都会摆放在左上角位置,多个控件会重叠在一起。

6、http怎么加入超时和代理

Http连接的超时机制能够防止连接线程的无限期等待,一般可分为connect timeout(连接超时)和socket timeout(通信超时),在Android中可以使用HttpClient和HttpURLConnection建立Http连接,因此存在两种设置超时的方式,首先Socket等待建立连接的超时时间和Socket输入流等待数据到达的超时时间设置如下:

private static final int HTTP_CONNECT_TIMEOUT = 20 * 1000;
private static final int HTTP_SOCKET_TIMEOUT = 20 * 1000;

1)HttpClient方式

HttpClient httpClient = new DefaultHttpClient();
HttpParams params = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, HTTP_CONNECT_TIMEOUT);
HttpConnectionParams.setSoTimeout(params, HTTP_SOCKET_TIMEOUT);

2)HttpURLConnection方式

try
{
URL url = new URL(“http://www.baidu.com”);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(HTTP_CONNECT_TIMEOUT);
conn.setReadTimeout(HTTP_SOCKET_TIMEOUT);
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}

7、什么是px,pt,dp,sp,dpi?

px是像素的意思,用于图像。
pt是磅数的意思,用于文字。不过两者并不适配屏幕。
dp是密度无关像素的意思,也被称作dip,在不同密度的屏幕中显示比例一致。
sp是可伸缩像素的意思,和dp同样设计理念,解决文字大小适配问题。
dpi是密度的单位。Android中的密度就是屏幕每英寸所包含的像素数。

8、Handler机制的原理,内部是如何实现的,消息队列的实现机制?

首先在主线程中创建一个Handler对象,并重写handlerMessage()方法。然后当子线程中需要进行UI操作时,
就创建一个Message对象,并通过Handler将这条消息发送出去。之后这条消息会被添加到MessageQueen中等待被处理,
而Looper则会一直尝试从MessageQueen中取出待处理消息,最后分发回Handler的handlerMessage()方法中。

9、什么是ANR,如何定位和避免?

在android上,如果应用程序有一段时间响应不够灵敏,系统会向用户提示“应用程序无响应”(ANR:application Not Responding)对话框。

定位:查看log,从trace.txt文件查看调用stack,看代码,仔细查看ANR原因。

避免:运行在主线程里的任何访问都尽可能少做事情。主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。

10、APK之间互相传递数据

1).Share Preference / Content Provider
APK可以指定接口和数据给任何其他APK读取. 需要自己实现接口和Share的数据。

2).Shared User id
通过Shared User id,拥有同一个User id的多个APK可以配置运行在同一个进程中,所以默认就是可以互相访问任意数据。 也可以配置运行成不同的进程,同时可以访问其他APK的数据目录下的数据库和文件,就像访问本程序的数据一样。比如某个公司开发了多个Android 程序,那么可以把数据、图片等资源集中放到APK A中去, 然后这个公司的所有APK都使用同一个User ID, 那么所有的资源都可以从APK A中读取。

11、简述Android的启动过程

具体见http://www.cnblogs.com/manuosex/p/3653326.html

12、如何解决Andorid的内存溢出问题

出现oom,无非主要是以下几个方面:

1).加载对象过大

2).相应资源过多,没有来不及释放。

解决这样的问题,也有一下几个方面:

1).在内存引用上做些处理,常用的有软引用、强化引用、弱引用

2).在内存中加载图片时直接在内存中做处理,如:边界压缩.

3).动态回收内存

4).优化Dalvik虚拟机的堆内存分配

5).自定义堆内存大小

13、Intent用途了解多少?IntentService知道么?

显式Intent,隐式Intent,传递数据,传递自定义对象Serializable和Parcelable。

IntentService是Service类的子类,用来处理异步请求。客户端可以通过startService(Intent)方法传递请求给IntentService。执行完所一个Intent请求对象所对应的工作之后,如果没有新的Intent请求达到,则自动停止Service;否则执行下一个Intent请求所对应的任务。

14、广播创建方式有几种?有什么区别?

动态注册和静态注册。

动态注册可以自由控制注册与注销,比较灵活,但是要在程序启动之后才能接收到广播。

静态注册可以在程序未启动的情况下接收到广播。

15、Intent Flag常用的

FLAG_ACTIVITY_SINGLE_TOP(相当于加载模式中的singletop)

FLAG_ACTIVITY_CLEAR_TOP(相当于加载模式中的SingleTask)

FLAG_ACTIVITY_NEW_TASK

16、Android基本框架结构

四层架构,五块区域。

Linux内核层、系统运行库层(包含Android运行库)、应用框架层、应用层。

17、改变android手机中返回键的功能

拦截activity的后退键处理

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){
return true;
}
return super.onKeyDown(keyCode, event);
}

屏蔽了Android手机上的返回键。只要把这段代码写在有返回功能按钮所在的页面就可以。

18、Activity如何启动一个service

一种就是start一个service,另外一种就是bind一个service。

19、android 有哪些安全机制

1).Android基于Linux,Linux的安全机制适用于Android,通过用户id,组id等实现

2).Android的权限机制:在AndroidManifest.xml中会配置相应的权限

3).Android的独立进程机制:每个应用都运行在独立的进程中,互相不干扰,当然他们共享资源和内存等,还有注意share id如果相同会运行在一个进程中

4).签名机制:Android打包的时候有自己独立的keystore文件,所以这个文件是唯一的,保证应用的安全性

20、android 哪些操作会导致内存泄露

1).查询数据库而没有关闭Cursor

2).调用registerReceiver后未调用unregisterReceiver().

3).未关闭InputStream/OutputStream

4).Bitmap使用后未调用recycle()

5).Context泄露

21、通过Intent传递一些二进制数据的方法有哪些?

1). 使用Serializable接口实现序列化,这是Java常用的方法。

2). 实现Parcelable接口,这里Android的部分类比如Bitmap类就已经实现了,同时Parcelable在Android AIDL中交换数据也很常见的。

22、Android 的数据存储方式

1).SharedPreferences 方式

2).文件存储方式

3).SQLite 数据库方式

4).内容提供器(Content provider)方式

5).网络存储方式

23、介绍下 Content Provider 是如何实现数据共享的

创建一个属于你自己的 Content Provider 或者将你的数据添加到一个已经存在的 Content Provider 中,前提是有相同数据类型并且有写入 Content Provider 的权限

24、ListView如何优化

1).分页加载

2).convertView缓存

3).viewHolder

4).scrollListener,记住滑动的状态

已有3条评论 发表评论

  1. 吴言以对这个世界 /

    是厉害

  2. 胡飞亚 /

    看完了,很受用。

  3. Westion /

    还不更新博客

发表评论