android service 样例(电话录音和获取系统当前时间)

关于android service 的具体解释请參考: android四大组件--android service具体解释。以下将用两个实例具体呈现Android Service的两种实现。

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

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

实例一(电话录音):

/CallRecorderService/res/layout/main.xml

<?

xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/tvTemp" android:layout_width="fill_parent" android:layout_height="100dip" android:gravity="center" android:text="@string/hello" android:textSize="30dip" /> <Button android:id="@+id/startrecordservice" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="开启电话录音的功能" /> </LinearLayout>

/CallRecorderService/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?

> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.zymic.callrecord" android:versionCode="1" android:versionName="1.0" > <application android:icon="@drawable/icon" android:label="@string/app_name" > <activity android:name=".CallRecord01" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="CallRecordService" android:enabled="true" > </service> </application> <uses-sdk android:minSdkVersion="7" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" > </uses-permission> <uses-permission android:name="android.permission.RECORD_AUDIO" > </uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" > </uses-permission> </manifest>


以下将是三个核心的实现

/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);
			
		}
    	
    }
}

最后效果图例如以下:



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

界面代码实现:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"    
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tvTemp"
        android:layout_width="fill_parent"
        android:layout_height="100dip"
        android:gravity="center"
        android:textSize="30dip"        
        android:text="@string/hello" />
    
    <Button        
        android:id="@+id/btnStart"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/btnBind_name" />
    
    <Button
        android:id="@+id/btnStop"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/btnUnbind_name" />
    
    <TextView
        android:id="@+id/tvInfo"
        android:layout_width="fill_parent"
        android:layout_height="100dip" />

</LinearLayout>

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

<?

xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.gel.service" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".MainActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".MyService" android:exported="true"></service> </application> </manifest>

加入一个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;
		}
	}

}

最后的效果例如以下:





posted @ 2019-05-17 08:05  ldxsuanfa  阅读(528)  评论(0编辑  收藏  举报