1. 程式人生 > >Android Service的兩種啟動方式

Android Service的兩種啟動方式

Android中有一個經常使用到的元件,叫Service,它有這麼幾個特點:

  1. 它無法與使用者直接進行互動;
  2. 它必須由使用者或者其他程式顯式的啟動;
  3. 它的優先順序比較高,它比處於前臺的應用優先順序低,但是比後臺的其他應用優先順序高,這就決定了當系統因為缺少記憶體而銷燬某些沒被利用的資源時,它被銷燬的概率很小。

那麼接下來,我們就寫一個比較簡單的跟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);

專案執行以後,就可以點選相應按鈕進行播放音樂了。

下載原始碼可以去這裡: