关于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; 
		} 
	} 
 
} 

最后的效果例如以下:






评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

【足迹C++primer】47、Moving Objects2