Android下启动服务:

startService()

android下第一次启动服务,首先执行onCreate()方法,然后执行onStartCommand()方法,当你再启动服务的时候,就直接执行onStartCommand()方法


关闭服务:

stopService:执行OnDestory方法

应用程序退出,服务不会关闭,一直在后台运行


服务可以调高当前应用程序进程的优先级!


进程优先级
1.Foreground process 前台进程  优先级最高,最不容易被系统回收掉.
2.Visible process    可视进程  如果一个应用程序的界面用户仍然可见.
3.Service process    服务进程  应用程序进程里面有一个服务正在运行  并且服务是通过startService() 方法开启的.
4.Background process  后台进程  应用程序被最小化了 activity的onstop方法被调用.
5.Empty process        空进程




服务有两种开启方式:


startservice() 方式开启的服务 和调用者没有任何的关系,调用者activity退出了,服务继续后台长期的运行.


bindService() 绑定的方式开启服务, 调用者和服务就建立密切的关系. 如果调用者activity退出了,服务也会跟着挂了.
              不求同时生,但求同时死


开启服务  oncreate() - > startcommand() ->onstart() ->ondestroy();   
服务只会被创建一次  多次开启服务 只会执行 startcommand() ->onstart() ;
服务只可以被停止一次  执行 ondestroy() 多次的停止服务 没有反应.


绑定服务  oncreate()->    onbind() -->onunbind() ---> ondestroy();


服务只会被成功的绑定一次,多次调用绑定服务的方法 不会重复执行 onbind();
注意: 在绑定的服务的时候 不要多次的重复绑定服务, 否则会导致服务不能被解绑.
      服务只可以被显示的解除绑定一次,多次的解除绑定服务 应用程序会报错.


广播类的代码:

/** 接收手机启动广播 */
public class PhoneReceiver extends BroadcastReceiver {


@Override
public void onReceive(Context context, Intent intent) {
// 跳转到电话监听服务
Intent intent2 = new Intent(context, PhoneReceiver.class);
context.startService(intent2);


}


}


服务类的代码:

/** 监听电话的状态,进行录音 */
public class PhoneService extends Service {
private TelephonyManager telephonyManager;
private PhoneListener listener;


@Override
public IBinder onBind(Intent intent) {
return null;
}


@Override
public void onCreate() {
System.out.println("第一次创建服务事,调用oncreate方法");
telephonyManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
// 注册一个监听器 获取电话的状态
listener = new PhoneListener();
telephonyManager.listen(new PhoneListener(), PhoneStateListener.LISTEN_CALL_STATE);
super.onCreate();
}


/** 电话状态的监听器 */
private class PhoneListener extends PhoneStateListener {
private MediaRecorder mediaRecorder;


// 电话状态改变的方法 state为电话的状态 incomingNumber为打进来的手机号码
@Override
public void onCallStateChanged(int state, String incomingNumber) {


super.onCallStateChanged(state, incomingNumber);
switch (state) {
// 没电话打进来的时候
case TelephonyManager.CALL_STATE_IDLE:
if (mediaRecorder != null) {
// 关闭录音
mediaRecorder.stop();
// 释放内存
mediaRecorder.release();
mediaRecorder = null;
}


break;
// 铃声响的时候
case TelephonyManager.CALL_STATE_RINGING:
mediaRecorder = new MediaRecorder();
// 设置音频为麦克风
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 设置音频文件是3gp格式
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
// 保存文件的路径
mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath()
+ SystemClock.currentThreadTimeMillis() + ".3gp");
// 设置音频的编码格式
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
// 准备录制
try {
mediaRecorder.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
break;
// 电话接通状态
case TelephonyManager.CALL_STATE_OFFHOOK:
// 开始录制音频
mediaRecorder.start();
break;
}
}


}


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("接着调用OnStartCommand方法");


return super.onStartCommand(intent, flags, startId);
}


@Override
public void onDestroy() {
System.out.println("服务关闭时,调用oncreate方法");
// 服务停止时,取消电话状态的监听
telephonyManager.listen(listener, PhoneStateListener.LISTEN_NONE);
super.onDestroy();
}


}

配置文件的代码:


       

       
           
               
           

       


 
   
   
   
   
   
   
   

更多相关文章

  1. 最新下载 android 源码方法
  2. Android恶意样本批量获取方法
  3. Android数据绑定Data Binding初体验
  4. Android Studio部署apk到手机后手机显示中文乱码解决方法
  5. android TextView多行文本(超过3行)使用ellipsize属性无效问题的
  6. Android 绑定数据到界面控件
  7. sencha touch 调用android主函数里的方法(可用与phoneGap开发第三

随机推荐

  1. 在阿里,我们如何管理代码分支?
  2. GitHub的九种提速方式
  3. 如果你真的想投资
  4. 王坚博士,那个行走于现在与未来之间的大顽
  5. 刚刚,中国量子计算机截获一段来自宇宙的神
  6. Python Flask 数据可视化
  7. Oracle索引的监控
  8. 0406作业-dom元素的增删改查
  9. 第117天:机器学习算法之 K 近邻
  10. 第122天:Flask 单元测试