本文共 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; } }}最后的效果如下: