您的位置:首页 > 职场人生

android面试题目2

2016-02-15 16:39 453 查看
1、 Activity的生命周期,两个Activity之间跳转时必然会执行的是那几个方法?

startActivity(Intent intent) ;

startActivityForResult (Intent intent, int requestCode) ;

onActivityResult (int requestCode, int resultCode, Intent data);

setResult(int resultCode);

2、 不用service,B页面为音乐播放,从A跳转到B,再返回,如何使音乐继续播放?

默认不做任何处理,B里面的音乐都能播放的。

应该是考察,A开启B的时候,用startActivityForResult()方法, B返回的时候把播放的状态信息返回给A ,A继续 播放音乐.

3、 Service有哪些启动方法?有什么区别?

需要通过某一个Activity或者其他Context对象来调用, Context.startService() 和 Context.bindService()。

如果在Service的onCreate或者onStart做一些很耗时间的事情,最好在 Service里启动一个线程来完成,因为Service是跑在主线程中,会影响到UI操作或者阻塞主线程中的其他事情。

有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。

1 通过startService

  Service会经历 onCreate -> onStart

 stopService的时候直接onDestroy

  如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。下次调用者再起来可以stopService。

2 通过bindService

  Service只会运行onCreate, 这个时候服务的调用者和服务绑定在一起

  调用者退出了,Srevice就会调用onUnbind -> onDestroyed所谓绑定在一起就共存亡了。并且这种方式还可以使得调用方(例如)调用服务上的其他的方法。

Service的调用

Context.startService():Service会经历onCreate -> onStart(如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次
);stopService的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。 注意,多次调用Context.startservice()不会嵌套(即使会有相应的onStart()方法被调用),所以无论同一个服务被启动了多少次,一旦调用Context.stopService()或者stopSelf(),他都会被停止。补充说明:传递给startService()的Intent对象会传递给onStart()方法。调用顺序为:onCreate
--> onStart(可多次调用) --> onDestroy。

Context.bindService():Service会经历onCreate() -> onBind(),onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind -> onDestroyed相应退出,所谓绑定在一起就共存亡了


补充说明:传递给bindService()的Intent对象会传递给onBind(),传递给unbindService()的Intent对象会传递给onUnbind()方法。 调用顺序为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。

注意事项:在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。还有一点,目前我没有遇到过需要startService和bindService交互使用的情况(我认为不会有这种需求),所以不必去考虑交互的问题,待遇到时再考虑不迟。



Service的生命周期 :

Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy我们有两种方式启动一个Service,他们对Service

生命周期的影响是不一样的。

1 通过startService

Service会经历 onCreate -> onStart, stopService的时候直接onDestroy

如果是调用者(TestServiceHolder)自己直接退出而没有调用stopService的话,Service会一直在后台运行。

下次TestServiceHolder再起来可以stopService。

2 通过bindService

Service只会运行onCreate, 这个时候 TestServiceHolder 和TestService绑定在一起

TestServiceHolder 退出了,Srevice就会调用onUnbind->onDestroyed所谓绑定在一起就共存亡了。

其实还有第三种,就是跨进程通信:AIDL。这也可以启动服务。

4、 (音乐播放器)如何加载的音乐信息,如何改善其效率。

Android系统提供了MediaScanner,MediaProvider,MediaStore等接口,并且提供了一套数据库表格,通过Content Provider的方式提供给用户。当手机开机或者有SD卡插拔等事件发生时,系统将会自动扫描SD卡和手机内存上的媒体文件,如audio,video,图片等,将相应的信息放到定义好的数据库表格中。在这个程序中,我们不需要关心如何去扫描手机中的文件,只要了解如何查询和使用这些信息就可以了。

MediaStore中定义了一系列的数据表格,通过ContentResolver提供的查询接口,我们可以得到各种需要的信息。下面我们重点介绍查询SD卡上的音乐文件信息。

先来了解一下ContentResolver的查询接口:

Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder);

Uri:指明要查询的数据库名称加上表的名称,从MediaStore中我们可以找到相应信息的参数,具体请参考开发文档。

Projection: 指定查询数据库表中的哪几列,返回的游标中将包括相应的信息。Null则返回所有信息。

selection: 指定查询条件

selectionArgs:参数selection里有 ?这个符号是,这里可以以实际值代替这个问号。如果selection这个没有?的话,那么这个String数组可以为null。

SortOrder:指定查询结果的排列顺序

下面的命令将返回所有在外部存储卡上的音乐文件的信息:

Cursor cursor = query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER);

得到cursor后,我们可以调用Cursor的相关方法具体的音乐信息:

歌曲ID:MediaStore.Audio.Media._ID

Int id = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));



歌曲的名称 :MediaStore.Audio.Media.TITLE

String tilte = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));



歌曲的专辑名:MediaStore.Audio.Media.ALBUM

String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));

歌曲的歌手名: MediaStore.Audio.Media.ARTIST

String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));

歌曲文件的路径 :MediaStore.Audio.Media.DATA

String url = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));

歌曲的总播放时长 :MediaStore.Audio.Media.DURATION

Int duration = cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));

歌曲文件的大小 :MediaStore.Audio.Media.SIZE

Int size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));

5、 电话状态的监听,改变打电话界面(听说我改动的Phone源码就不再问了)。

6、 ListView如何提高其效率?

当每条数据进入可见区域时,adapter的getview()会被调用,返回代表具体数据的视图。触摸滚动时,频繁调用。支持成百上千条数据。



下面为显示每条数据的xml文件:



<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="horizontal">

<ImageView android:id="@+id/icon"

android:layout_width="48dip"

android:layout_height="48dip" />

<TextView android:id="@+id/text"

android:layout_gravity="center_vertical"

android:layout_width="0dip"

android:layout_weight="1.0"

android:layout_height="wrap_content" />

</LinearLayout>



1。最简单的方法,最慢且最不实用



public View getView(int pos, View convertView,

ViewGroup parent){

View item = mInflater.inflate(R.layout.list_item, null);

((TextView) item.findViewById(R.id.text)).

setText(DATA[pos]);

((ImageView) item.findViewButId(R.id.icon)).

setImageBitmap((pos & 1) == 1 ? mIcon1 : mIcon2);

return item;

}



2。利用convertview回收视图,效率提高200%。



public View getView(int pos, View convertView,

ViewGroup parent){

if (convertView == null) {

convertView = mInflater.inflate(

R.layout.list_item, null);

}

((TextView) convertView.findViewById(R.id.text)).

setText(DATA[pos]);

((ImageView) convertView.findViewButId(R.id.icon)).

setImageBitmap((pos & 1) == 1 ? mIcon1 : mIcon2);

return convertView;

}



3。利用viewholder模式,效率在提高50%



static class ViewHolder {

TextView text;

ImageView icon;

}







public View getView(int pos, View convertView, ViewGroup parent){

ViewHolder holder;

if (convertView == null) {

convertView = mInflater.inflate(R.layout.list_item, null);

holder = new ViewHolder();

holder.text = (TextView) convertView.findViewById(

R.id.text));

holder.icon = (ImageView) convertView.findViewButId(

R.id.icon));

convertView.setTag(holder);

} else {

holder = (ViewHolder) convertView.getTag();

}

holder.text.setText(DATA[pos]);

holder.icon.setImageBitmap((pos & 1) == 1 ? mIcon1 : mIcon2);

return convertView;

}



adapter更新效率比较:



1的更新不到10 frames/second



2的更新接近30 frames/second



3的更新接近40 frames/second



背景和图像



视图背景图像总会填充整个视图区域



1。图像尺寸不合适会导致自动缩放



2。避免实时缩放



3。最好预先缩放到视图大小



originalImage = Bitmap.createScaledBitmap(

originalImage, //
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: