博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android service 例子(电话录音和获取系统当前时间)
阅读量:4287 次
发布时间:2019-05-27

本文共 7641 字,大约阅读时间需要 25 分钟。

关于android service 的详解请参考: ,下面将用两个实例具体呈现Android Service的两种实现。

一个是startService()方法来启动一个服务,这里用电话录音的例子;

另一个是bindService()方法来绑定一个服务,这里用获取系统当前时间的例子;

实例一(电话录音):

/CallRecorderService/res/layout/main.xml

/CallRecorderService/AndroidManifest.xml

下面将是三个核心的实现

/CallRecorderService/src/com/bing/callrecord/CallRecordService.java

package com.bing.callrecord;import java.io.File;import java.io.IOException;import android.app.Service;import android.content.Context;import android.content.Intent;import android.media.MediaRecorder;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;import android.widget.Toast;public class CallRecordService extends Service {		@Override	public IBinder onBind(Intent intent) {		// TODO Auto-generated method stub		return null;	}	@Override	public void onCreate() {		super.onCreate();		Toast.makeText(getApplicationContext(), "录音服务已经创建!", Toast.LENGTH_LONG).show();	}	@Override	public void onDestroy() {		super.onDestroy();		Toast.makeText(getApplicationContext(), "录音服务已经销毁!", Toast.LENGTH_LONG).show();	}	@Override	public void onStart(Intent intent, int startId) {		super.onStart(intent, startId);		Toast.makeText(getApplicationContext(), "录音服务已经启动!", Toast.LENGTH_LONG).show();		//		TelephonyManager telephonymanager=(TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);		telephonymanager.listen(new PhoneListener(getApplicationContext()), PhoneStateListener.LISTEN_CALL_STATE);			}}
/CallRecorderService/src/com/bing/callrecord/PhoneListener.java

package com.bing.callrecord;import java.io.File;import java.io.IOException;import android.content.Context;import android.media.MediaRecorder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;import android.widget.Toast;public class PhoneListener extends PhoneStateListener {	File audioFile;	MediaRecorder mediaRecorder; //= new MediaRecorder();	Context c;	//	boolean iscall=false;	//	public PhoneListener(Context context){		c=context;		iscall=false;	}	@Override	public void onCallStateChanged(int state, String incomingNumber) {		super.onCallStateChanged(state, incomingNumber);		mediaRecorder = new MediaRecorder();		switch(state){		case TelephonyManager.CALL_STATE_OFFHOOK:			iscall=true;			try {				recordCallComment();							} catch (IOException e) {				// TODO Auto-generated catch block				e.printStackTrace();				mediaRecorder.stop();			}			Toast.makeText(c, "正在录音", Toast.LENGTH_SHORT).show();			break;		case TelephonyManager.CALL_STATE_IDLE:			//if(mediaRecorder!=null){				//mediaRecorder.stop();				//mediaRecorder=null;			//}			if(iscall){				mediaRecorder.stop();				iscall=false;			}			break;		}	}	//	public void recordCallComment() throws IOException{		System.out.println(mediaRecorder);		mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);		mediaRecorder				.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);		mediaRecorder				.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);		audioFile = File.createTempFile("record_", ".amr");		mediaRecorder.setOutputFile(audioFile.getAbsolutePath());		mediaRecorder.prepare();		mediaRecorder.start();	}	}
/CallRecorderService/src/com/bing/callrecord/CallRecorder.java

package com.bing.callrecord;import com.zymic.callrecord.R;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class CallRecorder extends Activity {    private Button beginrecordservice;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        //        beginrecordservice=(Button)findViewById(R.id.startrecordservice);        beginrecordservice.setOnClickListener(new BeginRecord());    }    //    private class BeginRecord implements OnClickListener{		@Override		public void onClick(View v) {			Intent serviceIntent=new Intent(getApplicationContext(),CallRecordService.class);			getApplicationContext().startService(serviceIntent);					}    	    }}
最后效果图如下:

实例二(获取当前时间):

界面代码实现:

在Manifest里面声明服务,添加MyService声明.

添加一个MyService类.代码如下:

package com.gel.service;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class MainActivity extends Activity implements OnClickListener {	private MyService mMyService;	private TextView mTextView;	private Button bindServiceButton;	private Button unbindServiceButton;	private Context mContext;	@Override	public void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.main);		setupViews();	}	private ServiceConnection mServiceConnection = new ServiceConnection() {		// 当我bindService时,让TextView显示MyService里getSystemTime()方法的返回值		public void onServiceConnected(ComponentName name, IBinder service) {			// TODO Auto-generated method stub			mMyService = ((MyService.MyBinder) service).getService();			mTextView.setText("来自MyService的系统时间:"					+ mMyService.getSystemTime());		}		public void onServiceDisconnected(ComponentName name) {			// TODO Auto-generated method stub		}	};	public void setupViews() {		mContext = MainActivity.this;		mTextView = (TextView)findViewById(R.id.tvInfo);		bindServiceButton = (Button) findViewById(R.id.btnStart);		unbindServiceButton = (Button) findViewById(R.id.btnStop);		bindServiceButton.setOnClickListener(this);		unbindServiceButton.setOnClickListener(this);	}	public void onClick(View v) {		// TODO Auto-generated method stub		if (v == bindServiceButton) {			Intent i = new Intent();			i.setClass(MainActivity.this, MyService.class);			mContext.bindService(i, mServiceConnection, BIND_AUTO_CREATE);		} else {			mContext.unbindService(mServiceConnection);		}	}}
创建Bound Service,MyService代码:

 

package com.gel.service;import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.IBinder;import android.text.format.Time;import android.util.Log;public class MyService extends Service {	// 定义个一个Tag标签	private static final String TAG = "MyService";	// 这里定义一个Binder类,用在onBind()有方法里,这样Activity那边可以获取到	private MyBinder mBinder = new MyBinder();	@Override	public IBinder onBind(Intent intent) {		Log.e(TAG, "Start IBinder!");		return mBinder;	}	@Override	public void onCreate() {		Log.e(TAG, "Start onCreate!");		super.onCreate();	}	@Override	public void onStart(Intent intent, int startId) {		Log.e(TAG, "Start onStart!");		super.onStart(intent, startId);	}	@Override	public void onDestroy() {		Log.e(TAG, "Start onDestroy!");		super.onDestroy();	}	@Override	public boolean onUnbind(Intent intent) {		Log.e(TAG, "Start onUnbind!");		return super.onUnbind(intent);	}	// 这里我写了一个获取当前时间的函数,	public String getSystemTime() {		Time t = new Time();		t.setToNow();		return t.toString();	}	public class MyBinder extends Binder {		MyService getService() {			return MyService.this;		}	}}
最后的效果如下:

你可能感兴趣的文章
AngularJS路由之ui-router(三)大小写处理
查看>>
AngularJs checkbox绑定
查看>>
C# 扩展方法整理
查看>>
微信小程序开源项目库整理
查看>>
Ionic Grid栅格布局居中实例
查看>>
Cordova 配置WebView可以打开外部链接
查看>>
Ionic Tab选项卡使用整理(一)
查看>>
Ionic Tab选项卡使用整理(二)
查看>>
Ionic Tab选项卡使用整理(三)
查看>>
AngularJs控制器说明(一)
查看>>
Teleport Ultra网站静态资源下载工具
查看>>
C# 调用微信公众号接口生成带参数二维码、下载、合并
查看>>
C# 调用微信公众号接口发送客服消息示例
查看>>
C# 调用微信公众号接口获取会员信息示例
查看>>
mysql-5.7.xx-winx64服务无法启动解决方案
查看>>
Bootstrap 4重大更新,亮点解读
查看>>
Angular CLI ng常用命令整理
查看>>
Angular 路由使用整理(一)
查看>>
git回到指定版本命令
查看>>
cordova-plugin-splashscreen设置启动页面和图标
查看>>