服务和进程优先级
什么是服务?
windows下的服务:没有界面、长期运行在后台的应用程序;
android下的服务:应用程序的一个组件,没有界面activity,长期运行在后台;
进程:是应用程序运行的载体。
进程与应用程序之间的关系: linux操作系统创建一个进程,这个进程负责运行dalvik虚拟机,Android的应用程序都是运行在dalvik虚拟机上的。
进程的生命周期:
1、应用程序一启动的时候就创建了进程;
2、当应用程序退出的时候进程并没有退出;
3、只有手工停止这个进程,进程才会结束;
操作系统尽量长时间的运行应用程序的进程,为了保证内从空间不被大量占用,它会按照进程的优先级,从低到高一级一级的杀死进程,直到内存空间被清理的差不多。
进程的等级:
Foreground process(前台进程)
应用程序,用户正在操作,activity的onresume方法被执行了,可以相应点击事件。
Visible process (可视进程)
应用程序的ui界面,用户还可以看到,但是不能操作了。
Service process (服务进程)
应用程序没有界面,但是有一个后台的服务还处于运行状态
Background process(后台进程)
应用程序没有服务处于运行状态,应用程序被最小化了,activity执行了onstop方法
Empty process(空进程)
没有任何组件运行,所有的activity都关闭了,任务栈清空了 服务的特点
服务的特点:
服务被创建时调用onCreate、onStartCommand; 服务只能被创建一次,可以开启多次onStartCommand; 服务只能被停止一次; 没有onPause、onStop、onResume、onRestart方法,因为service没有界面,长期运行在后台。
生命周期的方法:
onCreate:服务被创建的时候调用这个方法; onStartCommand :开启服务 onDestroy:销毁服务 电话监听器的模板代码(重点)
步骤:
1、在工程中添加一个服务Service,重写onCreate方法; 2、在清单文件中配置服务; 3、在activity中开启服务; 4、在onCreate方法中使用TelephonyManager监听电话的状态; 5、在清单配置文件中添加权限
示例代码:
1、在工程中添加一个服务Service,重新onCreate方法:
public class DHQTService extends Service { /** * 当服务被创建的时候调用这个方法 */ @Override public void onCreate() { System.out.println("=========onCreate========="); super.onCreate(); TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE); } }2、在清单文件中配置服务:
<service android:name="com.itheima.dhqtq.DHQTService"></service>3、在activity中开启服务:
service = new Intent(this,DHQTService.class); //开启服务 startService(service);4、在onCreate方法中使用TelephonyManager监听电话的状态:
/** * 当服务被创建的时候调用这个方法 */ @Override public void onCreate() { System.out.println("=========onCreate========="); super.onCreate(); TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE); } /** *自定义一个电话状态监听,监听电话 */ private class mylistener extends phonestatelistener { private MediaRecorder r; @Override public void onCallStateChanged(int state, String incomingNumber) { try { // super.onCallStateChanged(state, incomingNumber); System.out.println("====state===============" + state); switch (state) { case TelephonyManager.CALL_STATE_IDLE:// 闲置状态 System.out.println("关闭录音机,上传音频文件.................."); if(r != null){ r.stop(); r.release(); r = null; //上传文件 } break; case TelephonyManager.CALL_STATE_RINGING:// 闲置状态 System.out.println("准备好录音机,准备录音.................."); r = new MediaRecorder(); r.setAudioSource(MediaRecorder.AudioSource.MIC); r.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //r.setOutputFile("/mnt/sdcard/info.3gp"); r.setOutputFile(Environment.getExternalStorageDirectory()+"/info.3gp"); r.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); r.prepare(); break; case TelephonyManager.CALL_STATE_OFFHOOK:// 闲置状态 System.out.println("开始录音.................."); r.start(); break; } } catch (Exception e) { e.printStackTrace(); } } }5、在清单配置文件中添加权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> start开启服务的生命周期(重点)
服务的特点:
服务被创建时调用onCreate、onStartCommand;
服务只能被创建一次,可以开启多次onStartCommand;
服务只能被停止一次;
没有onPause、onStop、onResume、onRestart方法,因为service没有界面,长期运行在后台。