Android小项目之--服务【Service】
有段時間沒有寫博客了,最近一段時間跳到了深圳,新的公司新的環境要去適應,人挺累的,所以近段時間沒有寫博客。這幾天QQ群上有位朋友在問要Service的例子,當時沒有跟他應答,現在抽空把例子整理了一下,發表上博客園,希望他能看得到。
?
Service 簡介
何謂“Service”?“Service” 意思即“服務”的意思, 像 Windows 上面的服務一樣,有些服務是在后臺上運行,干著靜悄悄的勾當不讓人知道 。與 Activity 不同,Service 是并不直接與用戶交互的運行于后臺的一類組件。
?
Google對Service的解釋
- 一個服務不是一個單獨的進程。服務對象本身并不意味著它是在自己的進程中運行,除非另有規定,否則它與運行程序是同在一個進程中。
- 一個服務不是一個單獨的線程。它是一種手段,本身做著主線的工作 (以避免應用程序沒有響應的錯誤)。
Service 與 Activity 的相同點與不同點
- 不同點:Activity是與用戶交互的組件,即我們用眼睛可以看到的界面,而Service是在后臺運行,執行隱藏的動作。
- 相同點:使用Activity 時我們需要在配置文件中聲明<activity>標簽,同樣的使用Service 也需要在配置文件中聲明<service>標簽
使用Service
創建Service需要繼承自 android.app.Service 的類,然后重新實現在Service各個狀態要回調的方法,Service的回調方法有三個,分別是:
- onCreate()
創建 - onStart()
開始 - onDestry()
釋放
注意:Service是不能自己啟動的,只有通過 Context 對象 調用startService和bindService方法來啟動。但兩種方法的Service生命周期是不同的,下面我們通過一個小例子來區別各自的生命周期。
例子效果圖如下:
代碼如下:
package?com.terry;import?android.app.Service;
import?android.content.Intent;
import?android.os.IBinder;
import?android.util.Log;
public?class?ServiceSample?extends?Service?{
????final?String?TAG="Service";
????@Override
????public?IBinder?onBind(Intent?intent)?{
????????//?TODO?Auto-generated?method?stub
????????Log.i(TAG,"onBind");
????????return?null;
????}
????
????@Override
????public?boolean?onUnbind(Intent?intent)?{
????????//?TODO?Auto-generated?method?stub
????????Log.i(TAG,?"onUnbind");
????????return?super.onUnbind(intent);
????}
????@Override
????public?void?onRebind(Intent?intent)?{
????????//?TODO?Auto-generated?method?stub?
????????super.onRebind(intent);
????????Log.i(TAG,?"onRebind");
????}
????@Override
????public?void?onCreate()?{
????????//?TODO?Auto-generated?method?stub
????????super.onCreate();
????????Log.i(TAG,?"onCreate");
????}
????@Override
????public?void?onDestroy()?{
????????//?TODO?Auto-generated?method?stub
????????super.onDestroy();
????????Log.i(TAG,?"onDestroy");
????}
????
????@Override
????public?void?onStart(Intent?intent,?int?startId)?{
????????//?TODO?Auto-generated?method?stub
????????super.onStart(intent,?startId);
????????Log.i(TAG,?"onStart");
????}
????
}
?
當調用startService方法時:
- 1、若Servcie沒有啟動,則首先會調用該Service的onCreate方法,然后再調用onStart方法。
- 2、若Service己經啟動則首先會直接調用onStart方法,
- 3、關閉時使用stopservice來關閉。
當調用bindService方法時:
- 1、若Service沒有啟動,則首先調用onCreate方法,來初始化啟動Service,然后調用Service的onBind。
- 2、通過onUnbind和onDestry方法停止Service運行。
下面通過一組圖來更詳細的說明Service的生命周期
開始服務
停止服務
綁定服務
銷毀服務
?
音樂服務DEMO
通過上面的小例子可能有些園友還是很模糊,下面通過一個播放音樂的小例子加深大家對Service 的理解,該例子通過播放一首mp3 ,當用戶點擊開始“按鈕”,音樂開始播放,即時你退出程序音樂也會播放,點擊“停止”按鈕,停止播放音樂 。
該例子繼承service 然后重寫onStart播放音樂 重寫onDestry停止音樂 ,代碼如下:
?
package?com.terry;import?android.app.Service;
import?android.content.Intent;
import?android.media.MediaPlayer;
import?android.os.IBinder;
public?class?musicServer?extends??Service?{
????private?MediaPlayer?player;
????@Override
????public?IBinder?onBind(Intent?intent)?{
????????//?TODO?Auto-generated?method?stub
????????return?null;
????}
????
????@Override
????public?void?onStart(Intent?intent,?int?startId)?{
????????//?TODO?Auto-generated?method?stub
????????super.onStart(intent,?startId);
????if(player==null)
????{
????????player=MediaPlayer.create(this,?R.raw.start);
????????player.start();
????}
????}
????
????@Override
????public?void?onDestroy()?{
????????//?TODO?Auto-generated?method?stub
????????super.onDestroy();
????????player.stop();
????}
}
?
完成了service類,我們只要在對應的Activity的事件中調用服務即可實現,代碼如下:
? package?com.terry;import?android.app.Activity;
import?android.content.Intent;
import?android.os.Bundle;
import?android.view.View;
import?android.view.View.OnClickListener;
import?android.widget.Button;
public?class?musicActivity??extends?Activity{
????private?Intent?intent=new?Intent("com.terry.Android.MUSIC");?
????
????@Override
????protected?void?onCreate(Bundle?savedInstanceState)?{
????????//?TODO?Auto-generated?method?stub
????????super.onCreate(savedInstanceState);
????????setContentView(R.layout.music);
????????findView();
????????viewHolder.myButton.setOnClickListener(new?OnClickListener()?{
????????????
????????????@Override
????????????public?void?onClick(View?v)?{
????????????????//?TODO?Auto-generated?method?stub
????????????????startService(intent);
????????????}
????????});
????????
????????viewHolder.myButton2.setOnClickListener(new?OnClickListener()?{
????????????
????????????@Override
????????????public?void?onClick(View?v)?{
????????????????//?TODO?Auto-generated?method?stub
????????????????stopService(intent);
????????????}
????????});
????}
????
????
????void?findView(){
????????viewHolder.myButton=(Button)findViewById(R.id.play);
????????viewHolder.myButton2=(Button)findViewById(R.id.stop);
????}
}
?
?
運行效果圖:
差不多就到這里吧,有點晚了,把源碼提供給大家:/Files/TerryBlog/ServiceTestDemo.rar
總結
以上是生活随笔為你收集整理的Android小项目之--服务【Service】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魅族 20 / Pro 系列无界手机预热
- 下一篇: Android之列表对话框