Android四大組件之Service

來源:互聯網
上載者:User

Android四大組件之Service

在Android四大組件中,Service和Activity兩個比較相似,區別是Activity用於前台,Service用於後台。

當你的程式不需要用組件呈現介面時,這時候用Service。典型範例就是播放音樂,介面退出後仍需播放音樂,這時需要的就是Service後台運行了。

 

Service建立1、定義一個繼承Service的子類 2、在AndroidMainifest.xml檔案中配置該Service。 這個過程是不是跟建立Activity有點相似呢。是吧。
Service啟動和停止1、調用Context裡面定義的startService()、stopService()兩個方法即可。 但是,這種方式啟動的Service和訪問者之間無法進行通訊和資料交換。 2、使用bindService(Intent service,ServiceConnection conn,int flags)和unbindService()啟動和關閉,可以實現通訊和資料交換。
實現通訊和資料交換的原理是什麼呢? 先來看bindService(Intent service,ServiceConnection conn,int flags)三個參數的含義: > service:毫無疑問這是準備啟動的service > conn :這是一個ServiceConnection對象,他的作用就是判斷串連的情況, 當串連成功的時候會回調ServiceConnection對象的onServiceConnected()方法, 當串連出現問題,或產生異常情況,而這種情況不是調用者主動中斷連線時,會回調ServiceConnection的onServiceDisconnected()方法; > flags :在綁定時是否自動建立Service(在還未建立的情況下),可以設定為 0 - 不自動建立; BIND_AUTO_CREATE - 自動建立;
串連成功的關鍵就在第二個參數,這個參數對象的onServiceConnected方法中有一個IBinder對象,IBinder對象就像通訊的使者一樣,用來傳遞資料。 下面附上Android瘋狂講義上面的例子源碼: Service子類中onBind()是必須實現的方法,這個方法返回一個IBinder對象,向調用者通訊。而返回的這個IBinder對象通常用繼承Binder實現自己的IBinder對象。
public class BindService extends Service{private int count;private boolean quit;// 定義onBinder方法所返回的對象private MyBinder binder = new MyBinder();// 通過繼承Binder來實現IBinder類public class MyBinder extends Binder //①{public int getCount(){// 擷取Service的運行狀態:countreturn count;}}// 必須實現的方法,綁定該Service時回調該方法@Overridepublic IBinder onBind(Intent intent){System.out.println("Service is Binded");// 返回IBinder對象return binder;}// Service被建立時回調該方法。@Overridepublic void onCreate(){super.onCreate();System.out.println("Service is Created");// 啟動一條線程、動態地修改count狀態值new Thread(){@Overridepublic void run(){while (!quit){try{Thread.sleep(1000);}catch (InterruptedException e){}count++;}}}.start();}// Service被中斷連線時回調該方法@Overridepublic boolean onUnbind(Intent intent){System.out.println("Service is Unbinded");return true;}// Service被關閉之前回調該方法。@Overridepublic void onDestroy(){super.onDestroy();this.quit = true;System.out.println("Service is Destroyed");}}


下面是一個Activity來綁定該Service,在Activity中定義一個Service中的MyBinder類來訪問Service內部狀態。
public class BindServiceTest extends Activity{Button bind, unbind, getServiceStatus;// 保持所啟動的Service的IBinder對象BindService.MyBinder binder;// 定義一個ServiceConnection對象private ServiceConnection conn = new ServiceConnection(){// 當該Activity與Service串連成功時回調該方法@Overridepublic void onServiceConnected(ComponentName name, IBinder service){System.out.println("--Service Connected--");// 擷取Service的onBind方法所返回的MyBinder對象binder = (BindService.MyBinder) service; //①}// 當該Activity與Service中斷連線時回調該方法@Overridepublic void onServiceDisconnected(ComponentName name){System.out.println("--Service Disconnected--");}};@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);// 擷取程式介面中的start、stop、getServiceStatus按鈕bind = (Button) findViewById(R.id.bind);unbind = (Button) findViewById(R.id.unbind);getServiceStatus = (Button) findViewById(R.id.getServiceStatus);// 建立啟動Service的Intentfinal Intent intent = new Intent();// 為Intent設定Action屬性intent.setAction("org.crazyit.service.BIND_SERVICE");bind.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View source){// 綁定指定SerivcebindService(intent, conn, Service.BIND_AUTO_CREATE);}});unbind.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View source){// 解除綁定SerivceunbindService(conn);}});getServiceStatus.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View source){// 擷取、並顯示Service的count值Toast.makeText(BindServiceTest.this,"Serivce的count值為:" + binder.getCount(),Toast.LENGTH_SHORT).show(); //②}});}}

Service的生命週期兩種不同的啟動Service的方式有不同的生命週期
非綁定式Service生命週期: onCreate()->onStartCommand()->onDestroy() 綁定式Service生命週期: onCreate()->onBind()->onUnbind()->onDestroy()

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.