Android Service的兩種啟動方式
阿新 • • 發佈:2019-02-06
Android中有一個經常使用到的元件,叫Service,它有這麼幾個特點:
- 它無法與使用者直接進行互動;
- 它必須由使用者或者其他程式顯式的啟動;
- 它的優先順序比較高,它比處於前臺的應用優先順序低,但是比後臺的其他應用優先順序高,這就決定了當系統因為缺少記憶體而銷燬某些沒被利用的資源時,它被銷燬的概率很小。
那麼接下來,我們就寫一個比較簡單的跟activity介面繫結的service,用於音樂播放,activity銷燬時,服務service也銷燬,音樂就停止播放。
看TestService.java:
/**
* @author xpd3581
* @date 2017-3-27
* @version 1.0
*/
package com.xingpd.test;
import java.io.IOException;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
/**
* TestService 2017-3-27
*/
public class TestService extends Service {
@Override
public IBinder onBind(Intent intent) {
Log.e("onBind:", "服務啟動!");
new Thread() {
public void run() {
for (int i = 0; i < 100; i++) {
Log.e("i:", "====>" + i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
return null;
}
private MediaPlayer mp;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("TestService:", "onStartCommand()!");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onStart(Intent intent, int startId) {
Log.e("TestService:", "onStart()!");
// 開始播放音樂
mp.start();
// 音樂播放完畢的事件處理
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
// 迴圈播放
try {
mp.start();
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
});
// 播放音樂時發生錯誤的事件處理
mp.setOnErrorListener(new MediaPlayer.OnErrorListener() {
public boolean onError(MediaPlayer mp, int what, int extra) {
// 釋放資源
try {
mp.release();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
});
super.onStart(intent, startId);
}
@Override
public void onCreate() {
Log.e("TestService:", "onCreate()!");
// 初始化音樂資源
try {
// 建立MediaPlayer物件
mp = new MediaPlayer();
// 將音樂儲存在res/raw/era_themass.mp3,R.java中自動生成{public static final int
// era_themass=0x7f040000;}
mp = MediaPlayer.create(this, R.raw.era_themass);
// 在MediaPlayer取得播放資源與stop()之後要準備PlayBack的狀態前一定要使用MediaPlayer.prepeare()
mp.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
super.onCreate();
}
@Override
public void onDestroy() {
Log.e("TestService:", "onDestroy()!");
// 服務停止時停止播放音樂並釋放資源
mp.stop();
mp.release();
super.onDestroy();
}
@Override
public boolean onUnbind(Intent intent) {
Log.e("TestService:", "onUnbind()!");
return super.onUnbind(intent);
}
}
相關的資源配置:
服務寫完以後,需要在AndroidManifest.xml檔案裡邊註冊:
<service
android:name=".TestService">
</service>
然後啟動服務和停止服務需要activity來實現:
MainActivity.java:
package com.xingpd.test;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener {
Button startService, stopService;
ServiceConnection sc = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e("ServiceConnection:", "onServiceDisconnected!");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e("ServiceConnection:", "onServiceConnected!");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService = (Button) this.findViewById(R.id.startService);
stopService = (Button) this.findViewById(R.id.stopService);
startService.setOnClickListener(this);
stopService.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.startService:
Intent startIntent = new Intent(this, TestService.class);
startService(startIntent);
break;
case R.id.stopService:
Intent stopIntent = new Intent(this, TestService.class);
stopService(stopIntent);
break;
default:
break;
}
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
Intent intent = new Intent(this, TestService.class);
stopService(intent);
super.onStop();
}
}
其中用的是startService方法,如果換成bindService方法就得需要下面的程式碼:
ServiceConnection sc = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e("ServiceConnection:", "onServiceDisconnected!");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e("ServiceConnection:", "onServiceConnected!");
}
};
而呼叫的話就是這樣:
Intent startIntent = new Intent(this, TestService.class);
bindService(startIntent, sc, BIND_AUTO_CREATE);
同理,unbindService也是如此:
unbindService(sc);
專案執行以後,就可以點選相應按鈕進行播放音樂了。
下載原始碼可以去這裡: