Android學習筆記(五二):服務Service(中)- 繼承Service類

來源:互聯網
上載者:User

通過IntentService的繼承類實現命令觸發的服務,也可以直接通過Service的繼承類來實現。在IntentService中的例子,我們增加了StopService( )的方式,用於實驗。在實際應用中,IntentService常用於一次性運行,自動結束的情況,不需要人工停止幹預。對於需要人工幹預的停止的,長時間(或無限制)啟動並執行情況,可直接繼承Service的方式,例如音樂播放。IntentService也是Service的一個繼承類。

繼承Service類

在本例中,我們中我們類比音樂播放,提供了兩個參數,一個是音樂列表,一個是隨機播放標識。

和上一例子不同,Service不會自動結束,必須要使用者幹預。例如播放音樂或者audiobook,當使用者離開Appcliation時,音樂還能繼續播放,service會持續下去,不停止,直至使用者主動停止服務,即使音樂播放完畢,模式也非迴圈播放,當播放完所有音樂時,service仍然存在,直至使用者主導stopService()或者服務本身stopSelf()。例子是個類比例子,不涉及真正的音樂播放。

用戶端代碼

public class ServiceTest2 extends Activity{ 
    ... ... 
    //對於用戶端,和上次例子相似,通過Intent作為命令,本例傳遞的參數為兩個,通過startService()來啟動服務。 
    private void startPlayer(){
        Intent i = new Intent(this,ServicePlayer.class);
        i.putExtra(ServicePlayer.EXTRA_PLAYLIST, "playlist");
        i.putExtra(ServicePlayer.EXTRA_SHUFFLE, true);
        startService(i);
    }
    //有使用者幹預的停止服務。在例子中,我們並不使用建立服務的intent,因為Activity的生命週期可能已經結束,intent已被記憶體回收,我們重新開啟Activity,在新的Activity中,不需開啟服務就可直接停止。 
    private void stopPlayer(){
       stopService(new Intent(this,ServicePlayer.class));
    }
}

Service端代碼

  public class ServicePlayer extends Service{
   public static final String EXTRA_PLAYLIST = "com.wei.android.learning.EXTRA_PLAYLIST";
    public static final String EXTRA_SHUFFLE = "com.wei.android.learning.EXTRA_SHUFFLE";
    private boolean isPlaying = false; 
    //將在以後學習Bind Service的模式
    public IBinder onBind(Intent arg0)
        return null;
    }
    //收到用戶端觸發,如果服務尚未啟動,則先執行onCreate(),再此進行服務初始化處理。 
    public void onCreate() {
        super.onCreate();
    } 
    //在收到stopService()時觸發,我們將在此處理停止Service的相關事宜,例如停止後台線程的運行等等。 
    public void onDestroy()
        playStop();
        super.onDestroy();
    } 
    //當系統記憶體少時,將要求終止服務,我們在此進行關閉服務的處理,例如保持相關的狀態等,如服務部需保持特定狀態,則無需重寫此方法。  
    public void onLowMemory()

        super.onLowMemory();
    }  
    //收到用戶端請求時觸發,由於onStartCommand()運行在主線程,將進行本次服務的初始化,並開啟後台線程運行相關的處理,具體參加線程的學習筆記,本例只考察Service相關內容。傳回值將告訴系統如果service的進程被殺掉,將會如何:START_STICKY表示服務將回到開始狀態,如同onStartCommand()被called,但是Intent不會重發;START_REDELIVER_INTENT表示要求系統重新發送一次Intent,即服務將重新觸發執行onStartCommand();START_NOT_STICKY表示無需幹預,服務停止,等待有新的命令觸發。
    public int onStartCommand(Intent intent, int flags, int startId)

        showInfo("onStartCommand");
        String playlist = intent.getStringExtra(EXTRA_PLAYLIST);
        boolean suffle = intent.getBooleanExtra(EXTRA_SHUFFLE, false);
        playStart(playlist,suffle);
        return START_NOT_STICKY;
    } 
    private void playStart(String playlist, boolean suffle){
        if(! isPlaying){ 
            isPlaying = true;
        }
    } 
    private void  playStop(){
        if( isPlaying){
            showInfo("Go to Stop!");
            isPlaying = false;
        }
    }
}

如果有三個用戶端都通過startService(),也只會啟動一個服務。只有第一個發出命令時,系統探索服務沒有啟動,將啟動服務,其餘的直接觸發onStartCommand()。通過startService()並不僅僅是發送命令,而是告訴系統服務維持運行,直至通知它服務停止。

相關連結:
我的Android開發相關文章

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.