- 服务可以理解为没有界面的Activity,用法也很像
- 试用适合在后台运行的代码,比如下载和播放音乐等
- 之前的下载代码放在Activity其实也是可以的,因为无论按返回键还是HOME键(区别是Activity会不会调用destroy方法),进程还是在的;但内存不足的时候,Activity进程会被杀死,导致后台下载任务无法执行,这也是服务的价值所在
- 进程优先级:Empty process(没有Activity,比如APP启动后按了返回键onDestroy) < background process(有Activity但不可见,比如APP启动后按了HOME键 onStop) < Service process(startService启动服务,一旦内存又有空闲还会重启)
<application>
<service
android:name="packageName.MyService"> -- 显式配置
<service>
</application>
public class MyService extends Service{
....
}
public void click(View v){
Intent intent = new Intent(this, MyService.class);
startService(intent);
stopService(intent);
}
- 服务生命周期方法
- onStartCommand,老版本叫onStart,但已经废弃了,事实上内部还是调用onStart方法,在onCreate之后调用,每次尝试启动服务(startService方法调用)都会调用
- onCreate创建服务的时候调用,只会调用一次,服务启动会就不会调用,因此系统内部服务同一个服务只会创建一次
- onDestroy服务销毁的时候调用
电话录音机
- 电话状态机:空闲状态、响铃状态、摘机状态
- 注意权限
- 模拟器可能会有bug,前面录不到,真机没这个问题不用管
public class RecorderService extends Service{
public void onCreate(){
super.onCreate();
TelephonyManager tm = getSystemService(TELEPHONY_SERVICE);
tm.listen(newMyListener(),
PhoneStateListener.LISTEN_CALL_STATE);
}
}
public MyListener extends PhoneStateListener{
public void onCallStateChanged(int state, String incoming){
super.onCallStateChanged(state, incoming);
switch(state){
case TelephonyManager.CALL_STATE_IDLE:
case TelephonyManager.CALL_STATE_RING:
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
}
}
}