Service的介紹與應用

什麼是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中去註冊
啓動服務

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章