什麼是service
Service是Android系統中的四大組件之一,主要有兩個應用場景:後臺運行和跨進程訪問。Service可以在後臺執行長時間運行操作而不提供用戶界面,除非系統必須回收內存資源,否則系統不會停止或銷燬服務。服務可由其他應用組件啓動,而且即使用戶切換到其他應用,服務仍將在後臺繼續運行。
startService方式啓動Service怎麼做
啓動服務由組件通過調用 startService() 啓動,服務啓動之後,其生命週期即獨立於啓動它的組件,並且可以在後臺無限期地運行,即使啓動服務的組件已被銷燬也不受影響。因此,服務應通過調用 stopSelf() 來自行停止運行,或者由另一個組件調用 stopService() 來停止。
- onCreate()
1.如果service沒被創建過,調用startService()後會執行onCreate()回調;
2.如果service已處於運行中,調用startService()不會執行onCreate()方法。 也就是說,onCreate()只會在第一次創建service時候調用,多次執行startService()不會重複調用onCreate(),此方法適合完成一些初始化工作。 - onStartCommand()
如果多次執行了Context的startService()方法,那麼Service的onStartCommand()方法也會相應的多次調用。onStartCommand()方法很重要,我們在該方法中根據傳入的Intent參數進行實際的操作,比如會在此處創建一個線程用於下載數據或播放音樂等。 - onBind()
Service中的onBind()方法是抽象方法,Service類本身就是抽象類,所以onBind()方法是必須重寫的,即使我們用不到。 - onDestory() 在銷燬的時候會執行Service該方法。
bindService方式啓動Service怎麼做
package com.jndf.Sexmouth;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import java.io.IOException;
public class MusicService extends Service {
private MediaPlayer mediaPlayer;
//2、實例化IBinder接口對象
private IBinder binder = new MyBinder();
/**
* 1、定義內部類繼承Binder
*/
public class MyBinder extends Binder {
public MusicService getService() {
return MusicService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
//3、返回binder
return binder;
}
@Override
public void onDestroy() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
}
}
/**
* 播放
*/
public void play() {
if (mediaPlayer == null) {
mediaPlayer = MediaPlayer.create(this, R.raw.zoutianyan);
}
if (mediaPlayer != null) {
mediaPlayer.start();
}
}
/**
* 暫停
*/
public void pause() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
}
/**
* 停止
*/
public void stop() {
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
try {
//準備下次播放
mediaPlayer.prepare();
//設置播放位置
mediaPlayer.seekTo(0);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button bt_play, bt_pause, bt_stop, bt_exit, bt_exit_stop;
private MusicService musicService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
listener();
//綁定:
Intent intent = new Intent();
intent.setAction("com.zdsoft.bindservice.MUSIC_SERVICE");
intent.setPackage("com.zdsoft.bindservice1227");
bindService(intent, connection, Service.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
super.onDestroy();
//解綁
unbindService(connection);
}
/**
* 定義ServiceConnection接口對象並實現接口
*/
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
if (musicService == null) {
musicService = ((MusicService.MyBinder) service).getService();
musicService.play();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
musicService = null;
}
};
private void initView() {
bt_play = (Button) findViewById(R.id.bt_play);
bt_pause = (Button) findViewById(R.id.bt_pause);
bt_stop = (Button) findViewById(R.id.bt_stop);
bt_exit = (Button) findViewById(R.id.bt_exit);
bt_exit_stop = (Button) findViewById(R.id.bt_exit_stop);
}
private void listener() {
bt_play.setOnClickListener(this);
bt_pause.setOnClickListener(this);
bt_stop.setOnClickListener(this);
bt_exit.setOnClickListener(this);
bt_exit_stop.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_play:
musicService.play();
break;
case R.id.bt_pause:
musicService.pause();
break;
case R.id.bt_stop:
musicService.stop();
break;
case R.id.bt_exit:
finish();
break;
case R.id.bt_exit_stop:
musicService.stop();
finish();
break;
}
}
}
AndroidManifest.xml中註冊service並配置intent-filter
<service
android:name=".MusicService"
android:enabled="true"
android:exported="true">
<intent-filter >
<action android:name="com.zdsoft.bindservice.MUSIC_SERVICE"></action>
</intent-filter>
</service>
IntentService怎麼用呢
IntentService 是繼承自 Service 並處理異步請求的一個類,在 IntentService 內有一個工作線程來處理耗時操作,當任務執行完後,IntentService 會自動停止,不需要我們去手動結束。如果在短時間內(Service沒有自動調用stopService)啓動 IntentService 多次,那麼每一個耗時操作會以工作隊列的方式在 IntentService 的 onHandleIntent 回調方法中執行,依次去執行,執行完自動結束。
創建一個類,繼承IntentService,注意的是這裏需要寫一個無參的構造方法,不然會報錯(IntentService的構造函數一定是參數爲空的構造函數,然後再在其中調用super(“classname”)這種形式的構造函數。因爲Service的實例化是系統來完成的,而且系統是用參數爲空的構造函數來實例化Service的)。
重寫最關鍵的onHandleIntent處理方法
IntentService繼承自Service,所以同樣需要到AndroidManifest.xml中去註冊
啓動服務