面试总结

一、service使用

1.  Service的启动方式

A. start方式:

(1)start方式启动的Service的生命周期如下:

  • onCreate()--->onStartCommand()(onStart()方法已过时) ---> onDestory()

(2) 使用Service的步骤:

1.定义一个类继承Service
2.在Manifest.xml文件中配置该Service
3.使用Context的startService(Intent)方法启动该Service
4.不再使用时,调用stopService(Intent)方法停止该服务

(3)说明:如果服务已经开启,不会重复的执行onCreate(), 而是会调用onStart()和onStartCommand()。服务停止的时候调用 onDestory()。服务只会被停止一次。

(4)特点:一旦服务开启跟调用者(开启者)就没有任何关系了。
开启者退出了,开启者挂了,服务还在后台长期的运行。
开启者不能调用服务里面的方法。

B. bind方式

(1)bind方式启动的Service的生命周期如下:

  • onCreate() --->onBind()--->onunbind()--->onDestory()

(2)使用Service的步骤:

1.定义一个类继承Service
2.在Manifest.xml文件中配置该Service
3.使用Context的bindService(Intent, ServiceConnection, int)方法启动该Service
4.不再使用时,调用unbindService(ServiceConnection)方法停止该服务

(3)注意:绑定服务不会调用onstart()或者onstartcommand()方法

(4)特点:bind的方式开启服务,绑定服务,调用者挂了,服务也会跟着挂掉。

绑定者可以调用服务里面的方法。

参考链接:http://www.jianshu.com/p/2fb6eb14fdec

二、aidl使用

对于绑定服务传递数据,Service只局限于本地服务,无法使用服务进行跨进程间的交互。如果需要用到跨进程交互的话,需要用到一个新的技术-AIDL

1、  aidl介绍

AIDL是 Android Interface definition language的缩写,它是一种进程通信接口的描述,通过sdk解释器对器进行编译,会把它编译成java代码在gen目录下,类路径与aidl文件的类路径相同。

2、  aidl跨进程传递基本数据类型

AIDL默认情况下只能传递基本类型、String、List、Map、CharSequence。

   参考链接:

1.http://www.cnblogs.com/plokmju/archive/2013/11/11/android_Service_aidl_NormalType.html

三、AudioManager

(1)AudioManager获取媒体焦点相关步骤:

  1. 获取AudioManager对象
  2. 注册OnAudioFocusChangeListener监听
  3. 就是在我们播放音乐的时候为AudioManager添加获取焦点的监听
  4. 在我们不用的时候将焦点释放掉一般我们是在ondestroy()方法中释放

(2)AudioManager的几个常量:

AUDIOFOCUS_REQUEST_GRANTED   永久获取媒体焦点(播放音乐)

AUDIOFOCUS_GAIN_TRANSIENT  暂时获取焦点 适用于短暂的音频

AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK Duck我们应用跟其他应用共用焦点 我们播放的时候其他音频会降低音量

(3)声音类型,可取为STREAM_VOICE_CALL(通话)、STREAM_SYSTEM(系统声音)、STREAM_RING(铃声)、STREAM_MUSIC(音乐)、STREAM_ALARM(闹铃声)

(4)AudioManager 主要方法介绍

由于 AudioManager 该类方法过多,这里只讲述几个比较常用到的方法:

方法:adjustVolume(int direction, int flags) 

解释:这个方法用来控制手机音量大小,当传入的第一个参数为 AudioManager.ADJUST_LOWER 时,可将音量调小一个单位,传入 AudioManager.ADJUST_RAISE 时,则可以将音量调大一个单位。

方法:getMode() 

解释:返回当前音频模式。

方法:getRingerMode() 

解释:返回当前的铃声模式。

方法:getStreamVolume(int streamType) 

解释:取得当前手机的音量,最大值为7,最小值为0,当为0时,手机自动将模式调整为“震动模式”。

方法:setRingerMode(int ringerMode) 

解释:改变铃声模式

四、contentPrivider内容提供者

   内容提供者是Android系统中专门为应用程序之间的数据通讯开发的,正常来说应用程序之间是不允许数据通信的,但是内容提供者的作用就是让别的应用程序访问我们的数据库。想要学习内容提供者需要两个应用程序,一个作为内容提供者,一个作为内容访问者。

1.创建一个数据库帮助类,用于数据的存储和访问,

   2.自定义一个内容提供者---创建一个类继承自contentProvider

   3.在清单文件中进行注册,表明本APP开启了一个内容提供者

甲方:1.创建数据库  2.创建一个内容提供者,并实现对应的增删改查方法

   乙方:1.创建一个内容接收者  2.通过内容接收者,调用指定的APP的增删改查方法

参考链接:http://xiechengfa.iteye.com/blog/1415829

五、BroadcastReceiver

Android广播分为两个方面:广播发送者和广播接收者

(1)广播作为Android组件间的通信方式,可以使用的场景如下:
1.同一app内部的同一组件内的消息通信(单个或多个线程之间);

2.同一app内部的不同组件之间的消息通信(单个进程);

3.同一app具有多个进程的不同组件之间的消息通信;

4.不同app之间的组件之间消息通信;

5.Android系统在特定情况下与App之间的消息通信。

(2) BroadcastReceiver总体上可以分为两种注册类型:静态注册和动态注册。

       1).静态注册:
直接在AndroidManifest.xml文件中进行注册。规则如下:

 

<receiver android:enabled=["true" | "false"]

android:exported=["true" | "false"]

android:icon="drawable resource"

android:label="string resource"

android:name="string"

android:permission="string"

android:process="string" >

. . .

</receiver>

2).动态注册:
动态注册时,无须在AndroidManifest中注册<receiver/>组件。直接在代码中通过调用Context的registerReceiver函数,可以在程序中动态注册BroadcastReceiver。registerReceiver的定义形式如下:

1 registerReceiver(BroadcastReceiver receiver, IntentFilter filter)
2 registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)

参考链接:http://www.cnblogs.com/lwbqqyumidi/p/4168017.html

六、Anr原因和解决

参考链接:http://blog.csdn.net/lonlylove/article/details/42006285

七、音频编解码流程介绍

八、Framework层相关

原文地址:https://www.cnblogs.com/fuyunmomo/p/7680258.html