Android 常见面试题

这些面试是我之前总结的 。觉得还不错,就贴出来与大家分享一下。当中有不少问题。也是我以前被面试官问过的问题,另一些基础问题总结(既然是基础知识 ,必定是成为一名的 Android 开发者 所必须掌握的 )。

有多个问题,我都替你试过了,这样回答面试官。还能够啊,嘿嘿

1、 Android中四大组件及其作用?
1、Activity:activity是用户和应用程序交互的窗体,一个activity相当于我们实际中的一个网页。当打开一个屏幕时,之前的那一个屏幕会被置为暂停状态。而且压入历史堆栈中,用户能够通过回退操作返回到以前打开过的屏幕。activity的生命周期:即“产生、运行、销毁”。可是这当中会调用很多方法onCreate(创建) 、onStart(激活)、onResume(恢复)、onPause(暂停)、onStop(停止)、onDestroy(销毁)、onRestart(重新启动)。
2、Service:Service是一种程序,它能够运行非常长的时间,相当于后台的一个服务。通过startService(Intent service)能够启动一个Service,通过Context.bindService()能够绑定一个Service。


3、BroadCastRecevicer:接受一种或者多种Intent作触发事件。接受相关消息,做一些简单处理,转换成一条Notification,统一了Android的事件广播模型。能够使用BroadcastReceiver来让应用对外一个外部的事件作出响应。Broadcast Receiver通过NotificationManager来通知用户这些事情发生了,BroadcastReceiver注冊的有两种方式,一种是能够在AndroidManifest.xml中注冊,另一种能够在运行时的代码中使用Context.registerReceiver()进行注冊。

用户还能够通过Context.sendBroadcast()将他们自己的intent broadcasts广播给其它的应用程序。


4、Content provider:内容提供者,可通过它来共享自己的数据给外部调用,给第三方应用提供数据訪问的接口。

2、ListView的优化方案?

1、假设自己定义适配器,那么在getView方法中要考虑方法传进来的參数contentView是否为null。假设为null就创建contentView并返回。假设不为null则直接使用。

在这种方法中尽可能少创建view。
2、给contentView设置tag(setTag()),传入一个viewHolder对象, 用于缓存要显示的数据,能够达到图像数据异步载入的效果。
3、假设listview须要显示的item非常多,就要考虑分页载入。比方一共要 显示100条或者很多其它的时候,我们能够考虑先载入20条。等用户拉到列表 底部的时候再去载入接下来的20条。分页载入还没学习。

3、Android中五种数据存储方式各自是什么?他们的特点?

Android提供了五种存取数据的方式

(1)SharedPreference。存放较少的五种类型的数据,仅仅能在同一个包内使
用。生成XML的格式存放在设备中
(2) SQLite数据库,存放各种数据,是一个轻量级的嵌入式数据库
(3) File文件。通过读取写入方式生成文件存放数据
(4) ContentProvider。主要用于让其它应用程序使用保存的数据

(5)通过网络获取数据和写入数据到网络存储空间

4、列举Android中的主要五种经常使用布局?

最经常使用的布局有下面这几种:
第一种:帧布局(框架布局)FrameLayout
另外一种:线性布局LinearLayout
第三种:绝对布局AbsoluteLayout
第四种:相对布局RelativeLayout

第五种:表格布局TableLayout

5、叙述学过的系统提供的Adapter?说明自己定义Adapter与系统Adapter的差别?

採用ArrayAdapter、SimpleAdapter和SimpleCursorAdapter这些系统自带的适配器,对于事件的响应仅仅能局限在一个行单位。

假设一行里面有一个button控件,它们之间的响应操作是不一样的。若採用系统自带的适配器。就不能精确到每一个控件的响应事件。这时,我们一般採取自己定义适配器来实现这个比較精确地请求。

6、Android中asset文件夹和raw文件夹差别?

res/raw和assets的同样点:
两者文件夹下的文件在打包后会原封不动的保存在apk包中。不会被编译成二进制。
res/raw和assets的不同点:
(1)res/raw中的文件会被映射到R.java文件里,訪问的时候直接使用资源ID即 R.raw.filename;assets文件夹下的文件不会被映射到R.java中,訪问的时候须要AssetManager类。


(2)res/raw不能够有文件夹结构,而assets则能够有文件夹结构,也就是assets文件夹下能够再建立文件夹
(3)读取文件资源举例:
读取res/raw下的文件资源,通过下面方式获取输入流来进行写操作
InputStream is = getResources().openRawResource(R.raw.filename);
读取assets下的文件资源,通过下面方式获取输入流来进行写操作
AssetManager am = null;
am = getAssets();

InputStream is = am.open(“filename”);

7、显式Intent和隐式Intent差别?

Intent是一种在不同组件之间传递的请求消息。是应用程序发出的请求和意图。对于明白指出了目标组件名称的Intent,我们称之为显式Intent。对于没有明白指出目标组件名称的Intent,则称之为隐式Intent。Android系统使用IntentFilter 来寻找与隐式Intent相关的对象。

显式Intent直接用组件的名称定义目标组件。这样的方式非常直接。可是因为开发者往往并不清楚别的应用程序的组件名称,因此,显式Intent很多其它用于在应用程序内部传递消息。比方在某应用程序内。一个Activity启动一个Service。
隐式Intent恰恰相反。它不会用组件名称定义须要激活的目标组件,它更广泛地用于在不同应用程序之间传递消息。

8、简要描写叙述AIDL的实现步骤?

server端:
1:server端写AIDL
2:server端继承Service。重写3个方法
3:server端实例化一个AIDL定义接口的Stub对象,并实现接口的抽象方法;
4:配置文件
client:
1:拷贝AIDL文件
2:绑定与Service端的服务
3:实现ServiceConnection,在实现的过程中通过Service端传递过来的IBinder得到Stub对象;比如:接口名.Stub.asInterface(service);
4:通过Stub对象调用相应方法

9、 谈谈Service的生命周期,以及两种方式的差别?

*Service的生命周期由使用Service两种方式决定,启动方式不同生命周期不同。

(1)Start方式启动Service的生命周期:
onCreate()—onStartCommond()—onDestroy()
调用者和服务之间没有不论什么的联系,即使调用者退出,那么服务也仍然进行。


(2)Bind方式启动Service的生命周期:onCreate()->onBind()->–>onUnbind() -> onDestroy()
调用者和服务绑定在一起。调用者退出。服务即便退出。

10、 叙述学过的系统提供的Adapter(说明自己定义Adapter与系统Adapter的差别)?

採用ArrayAdapter、SimpleAdapter和SimpleCursorAdapter这些系统自带的适配器,对于事件的响应仅仅能局限在一个行单位。假设一行里面有一个button控件,它们之间的响应操作是不一样的。若採用系统自带的适配器,就不能精确到每一个控件的响应事件。

这时。我们一般採取自己定义适配器来实现这个比較精确地请求。

11、写出ListView优化的代码。已知自己定义ListView中自己定义布局文件为list_item.xml里面有ImageView和TextView两个组件,其id为item_image、item_text。

public View getView(int position, View convertView, ViewGroup parent) {  
// TODO Auto-generated method stub  
    ViewHolder viewHolder;  
    if(convertView==null){  
        viewHolder=new ViewHolder();  
        convertView=LayoutInflater.from(c).inflate(R.layout.list_item, null);  
        viewHolder.text=(TextView) convertView.findViewById(R.id.item_text);  
        viewHolder.image=(ImageView) convertView.findViewById(R.id.item_image);  
        convertView.setTag(viewHolder);  
    }  
    viewHolder=(ViewHolder) convertView.getTag();  
    viewHolder.text.setText(list.get(position).getText());  
    viewHolder.image.setImageResource(list.get(position).getImage());  
    return convertView;  
}  
static class ViewHolder{  
    TextView text;  
    ImageView image;  
}  

12、 描写叙述通过contentResolver获取ContentProvider内容的基本步骤 ?

第一:得到ContentResolver类对象
ContentResolver cr=getContentResolver();
第二:定义要查询的字段String数组
第三:使用cr.query();返回一个Cursor对象
第四:使用while循环得到Cursor里面的内容

13、 描写叙述一下自己定义ContentProvider的步骤。

自己定义contentprovider步骤
1)继承Android的ContentProvider基类实现自己的ContentProvider类。


2)实现 ContentProvider里的onCreate方法,创建provider的数据,一般为数据库sqlite,那么我们在onCreate里实例化一个SqliteOpenHelper。
3)在ContentProvider 里面重写insert/delete/update/query增删改查这些方法。在每一个方法里面实现相应的功能。
4)在AndroidManifest.xml文件里注冊该ContentProvider类。为ContentProvider指定Uri。

14、 怎样实现一个帧动画?

在布局文件里加入ImageView组件。设置background为res/anim/fram.xml动画效果
通过ImageView对象的getBackground()方法得到AnimationDrawable对象
通过AnimationDrawable对象的start()来启动帧动画。stop()来停止动画

15、 res/raw与assets文件夹的差别?

同样点:

两者都会原封不动的保存在apk包中。不会被编译成二进制码。
不同点:
1、raw文件夹下仅仅能存放文件,不能存放下一级的文件夹,而assets能够存放下一级的文件夹。
2、raw文件夹下的资源会映射到R.java中生成资源id。

而assets不会。
3、获得资源的方法不同。代码例如以下:
this.getAssets().open(“xml/channels.xml”)
this.getResources().openRawResource(R.raw.students)
this.getClassLoader().getResourceAsStream(“student.xml”)

16、 简述Handler机制原理?

*Andriod提供了 Handler 和 Looper 来满足线程间的通信。

    Android不同意UI线程之外的线程改变UI组件的值。所以要想在其它线程里面改变UI组件的值。必须使用Handler来实现。
    Looper: 一个线程能够产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。
    Handler: 你能够构造Handler对象来与Looper沟通,以便push(上传)新消息到Message Queue里;或者接收Looper从Message Queue取出的消息。

Message Queue(消息队列,特点:先进先出):用来存放线程放入的消息。 线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。 Handler、Looper、MessageQueue的初始化流程例如以下所看到的。

Hander持有对UI主线程消息队列UI_MQ和消息循环Looper的引用,子线程能够通过Handler将消息发送到UI线程的消息队列UI_MQ中。 Handler处理消息 UI主线程通过Looper循环查询消息队列UI_MQ。当发现有消息存在时会将消息从消息队列中取出。首先分析消息,通过消息的參数推断该消息相应的Handler,然后将消息分发到指定的Handler进行处理。

17、在android中怎样使用SqliteOpenHelper?

1、建立一个类继承SqliteOpenHelper。声明一个构造方法,參数包括(Context,name,CursorFactory,version);创建数据库
2、实现其oncreate() 创建表
3:通过onupgrade() 版本更新时运行;
4、实例化所建类对象,对其进行读写操作。运行sql语句创建数据库(当对其使用读写时会推断数据库是否存在,假设存在,则不运行oncreate,不存在则运行)。

18、使用SqliteOpenHelper和SqliteDatabase进行增删改查详细的方法和參数?

1、通过SqliteOpenHelper得到SqliteDataBase的实例化对象(分为读写两种);
2、调用execSQL()运行增删改的SQL语句,传入SQL语句及须要填充的參数。
调用Cursor cursor = rawQuery()运行查询的语句
3、对运行SQL语句返回的游标。进行遍历;
4、及时关闭SqliteDataBase。

19、Sqlite和sharedPreference的差别

(1)Sqlite是嵌入式SQL数据库引擎SQLite(SQLite Embeddable SQL Database Engine)的一个扩展。

SQLite是一个实现嵌入式SQL数据库引擎的 C语言库(C library)。

用SQLite连接的程序能够使用SQL数据库。但不须要运行一个单独的关系型数据库管理系统进程(separate RDBMS process)。

SQLite直接读写(reads and writes directly)在硬盘上的数据库文件。
(2)SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通经常使用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs文件夹下。SharedPreferences对象本身仅仅能获取数据而不支持存储和改动,存储改动是通过Editor对象实现。

20、为什么要用ContentProvider?它与sql在实现上有何差别

Sql仅仅能在该project的内部共享数据,ContentProvider能在project之间实现数据共享。

21、描写叙述ContentProvider URI有哪几部分组成

URI由是部分组成:

content://com.example.transportation/trains/122

A,标准的前缀: ContentProvider(内容提供者)的scheme已经由Android所规定。 scheme为:content://
B,唯一标识整个Content Provider: 主机名(或叫Authority)用于唯一标识这个ContentProvider。外部调用者能够依据这个标识来找到它。
C,描写叙述了数据的路径。确定返回哪类数据: 路径(path)能够用来表示我们要操作的数据。路径的构建应依据业务而定
D。ID唯一标注请求的数据: 我们要请求数据的ID

22、怎样通过contentResolver扫描sdcard全部多媒体文件?

1) 通过ContentResolver訪问系统多媒体提供的ContentProvider,得到多媒体音乐的cursor
2) 解析cursor。通过cursor得到相应文件列表
3) 设置listView,依据格式不同展示不同图片,进行使用

23、.描写叙述一下开发ContentProvider的步骤

自己定义contentprovider步骤

    继承Android的ContentProvider基类实现自己的ContentProvider类。

实现 ContentProvider里的onCreate方法,创建provider的数据,一般为数据库sqlite。那么我们在onCreate里实例化一个SqliteOpenHelper。 在ContentProvider 里面重写insert/delete/update/query增删改查这些方法。

在每一个方法里面实现相应的功能。 在AndroidManifest.xml文件里注冊该ContentProvider类,为ContentProvider指定Uri。

24、.Android中怎样訪问自己定义ContentProvider?

1:得到ContentResolver类对象:ContentResolver cr = getContentResolver();
2:定义要查询的字段String数组。
3:使用cr.query(URI,字段数组。null。 null,null);,返回一个Cursor对象。


4:使用while循环得到Cursor里面的内容。

25、 Android中五种数据存储方式各自是什么?他们的特点?

Android提供了五种存取数据的方式

(1)SharedPreference。存放较少的五种类型的数据,仅仅能在同一个包内使用,生成XML的格式存放在设备中
(2) SQLite数据库,存放各种数据,是一个轻量级的嵌入式数据库
(3) File文件。通过读取写入方式生成文件存放数据
(4) ContentProvider,主要用于让其它应用程序使用保存的数据
(5)通过网络获取数据和写入数据到网络存储空间

26、 android中的动画有哪几类。它们的特点和差别是什么?

Android中动画能够分为两大类:帧动画、补间动画
1)补间动画:(你定义一个開始和结束。中间的部分由程序运算得到。就是对场景里的对象不断的进行图像变化来产生动画效果(旋转、平移、放缩和渐变))AlphaAnimation(渐变型动画)、scaleAnimation(缩放型动画)、 TranslateAnimation(平移型动画)、 RotateAnimation(旋转型动画)、
2)逐帧动画:Frame(把一连串的图片进行系列化连续播放,如同放电影的效果)。它是通过播放一张一张图片来达到动画的效果。

27、、 补间动画的两种实现方式(四种可选择一种来举例)

1、XML配置:

1)在res/anim文件夹下配置动画相应标签,配置相应參数,包括初始值,动画结束值。以及动画时间
2)通过AnimationUtils.loadAnimation载入XML动画文件
3)调用startAnimation方法开启动画
2、代码实现:

1)直接New出须要的补间动画的对象,传递相应的參数
2)调用startAnimation方法开启动画

28、 怎样用MediaPlayer实现音频播放功能。音乐播放器的开发需注意什么?

*用MediaPlayer实现音频播放功能主要有两种方法。

(方法一):在res下建立一个raw包,把文件放入包中。

在activity中声明
一个MediaPlayer对象,然后onCreate()方法中用
MediaPlayer.create(context,R.raw.资源名)方法实例化该对象。然后调用
MediaPlayer的start()、pause()和stop()方法进行開始、暂停和停止的
操作。

最后在activity的onDestroy()中调用MediaPlayer的release()
方法进行资源的释放。此方法的缺点是每次运行程序时都要载入raw里的资
源文件,使安装过程速度减慢。
(方法二):资源放在sdcard中。在activity中声明一个MediaPlayer对象。
实例化 MediaPlayer()。使用Environment.getExternalStorageDirectory().getAbsolutePath()方法获得path。然后path+=File.separator+资源名或”包名/资源名”。

然后调用MediaPlayer的setDataSource(path)进行资源设置。然后先调用prepare()方法。在后再调用start()方法播放,调用pause()方法和stop()方法进行暂停和停止的操作。最后在activity的onDestroy()中用release()方法进行资源的释放。

注意事项,用法二时,设置完资源路径后要先调用prepare()方法,调
用start()、pause()、stop()方法前腰先进行一些推断,不然一次性调用
多次同样的方法easy出错。调用stop()后在调用start()方法时要先调用prepare()方法。

29、 Android中播放小的音乐文件soundpool怎样使用?

SoundPlayer 播放音频的实现步骤:

1) new出一个实例 ; new SoundPool(4, AudioManager.STREAM_MUSIC, 100);第一个參数是同意有多少个声音流同一时候播放,第2个參数是声音类型,第三个參数是声音的品质;
2) loadId = soundPool.load(context, R.raw.himi_ogg, 1);
3) 使用实例调用play方法传入相应的音频文件id就可以

30、 Android中视频播放的三种方式?

1、系统自带android视频播放(最简单的视频播放器)
1) new Intent。配置隐式意图
2) 通过Uri.parse获取指定文件Uri
3) 给Intent加入Uri及type
4) 启动Intent

2、VideoView android提供给我们的一个供我们进行视频播放的组件
VideoView 是android 系统提供的一个媒体播放显示和控制的控件。
若须要控制栏,须要加上MediaController

3、surfaceView+MediaPlayer
1) 构建surfaceView
2) 获取surfaceHolder,设置分辨率
3) 对surfaceHolder加入回调接口(SurfaceHolder.Callback ) surfaceHolder.addCallback(this);
4) 实现接口内部三个方法
(surfaceCreated ,surfaceChanged,surfaceDestroyed等),对Mediaplayer加入Display(控制管理器)
5) 对button加入点击事件

31、 Timer及AlertManager

Timer是在一个应用运行期间进行的定时操作,当应用退出则定时操作也同一时候被取消。

AlarmManager是系统级的定时器,主要用来对Activity,Service,BroadCastReciver三大组件进行定时的操作,当应用退出后这个定时操作仍然能够按时进行,而且通过使用可唤醒的參数能够达到在系统休眠状态下仍能够完毕定时操作。

32、Android中拍照功能怎样实现?

有两种方法实现拍照功能:
1、通过camera打开照相机进行拍照调用系统camera运行拍照:
1)、首先创建surfaceView
2)、得到surfaceView相应控制器,并加入surfaceView的回调事件(surfaceView创建以及销毁分别运行的操作,当surfaceView创建时,初始化camera,当surfaceView销毁时。释放camera的资源)
3)、设置分辨率
4)、设置不维护缓存
5) 点击调用camera的takePicture传入回调拍照的实例化PictureCallback对象
2、系统拍照:通过Intent启动,设置ACTION_IMAGE_CAPTURE,startActivity开启

33、ListView的优化方案?

1:推断contentView是否为null
2:使用viewHolder缓存数据,实现一步载入
3:分页载入:
1)假设自己定义适配器。那么在getView方法中要考虑方法传进来的參数contentView是否为null。假设为null就创建contentView并返回。假设不为null则直接使用。

在这种方法中尽可能少创建view。
2)给contentView设置tag(setTag()),传入一个viewHolder对象。用于缓存要显示的数据。能够达到数据异步载入的效果。
3)假设listview须要显示的item非常多。就要考虑分页载入。

比方一共要显示100条或者很多其它的时候。我们能够考虑先载入20条,等用户拉到列表底部的时候再去载入接下来的20条。分页载入还没学习。

34、 MVC设计模式在Android中的应用?

1.模型层(model):对数据库操作,对网络等操作都应在model中处理,对业务的计算等操作都应在该层。

能够简单的理解为Android中的Java源文件
2.视图层(view):一般採用XML进行描写叙述,使用的时候能够方便的引入,能够简单的理解为Android中Layout文件。

Android中也能够用JavaScript+HTML 等方式作为view 层。
3.控制层(controller):控制model和view的协调工作。简单的理解为Android中manifest文件。

原文地址:https://www.cnblogs.com/jhcelue/p/7350998.html