Android中BindService方式使用的理解

來源:互聯網
上載者:User

轉載自:http://www.cnblogs.com/onlylittlegod/archive/2011/05/15/2046652.html

最近學習了一下Android裡面的Service的應用,在BindService部分小卡了一下,主要是開始沒有徹底理解為什麼要這麼實現。

BindService和Started Service都是Service,有什麼地方不一樣呢:

1. Started Service中使用StartService()方法來進行方法的調用,調用者和服務之間沒有聯絡,即使調用者退出了,服務依然在進行【onCreate()-  >onStartCommand()->startService()->onDestroy()】,注意其中沒有onStart(),主要是被onStartCommand()方法給取代了,onStart方法不推薦使用了。

2. BindService中使用bindService()方法來綁定服務,調用者和綁定者綁在一起,調用者一旦退出服務也就終止了【onCreate()->onBind()->onUnbind()->onDestroy()】。

調用者Activity:

MainActivity

 1 MainAcitvity 2  3 package com.zys.service; 4  5 import com.zys.service.BindService.MyBinder; 6  7 import android.R.bool; 8 import android.app.Activity; 9 import android.content.ComponentName;10 import android.content.Context;11 import android.content.Intent;12 import android.content.ServiceConnection;13 import android.os.Bundle;14 import android.os.IBinder;15 import android.view.View;16 import android.view.View.OnClickListener;17 import android.widget.Button;18 19 public class MainActivity extends Activity {20     private Button startBtn;21     private Button stopBtn;22     private boolean flag;23     /** Called when the activity is first created. */24     @Override25     public void onCreate(Bundle savedInstanceState) {26         super.onCreate(savedInstanceState);27         setContentView(R.layout.main);28         flag = false;29         //設定30         startBtn = (Button)this.findViewById(R.id.startBtn);31         stopBtn = (Button)this.findViewById(R.id.stopBtn);32         startBtn.setOnClickListener(listener);33         stopBtn.setOnClickListener(listener);34     }35     36     private OnClickListener listener = new OnClickListener() {37         38         @Override39         public void onClick(View v) {40             // TODO Auto-generated method stub41             switch (v.getId()) {42             case R.id.startBtn:43                 bindService();44                 break;45             case R.id.stopBtn:46                 unBind();47                 break;48             default:49                 break;50             }51         }52         53         54     };55     56     private void bindService(){57         Intent intent = new Intent(MainActivity.this,BindService.class);58         bindService(intent, conn, Context.BIND_AUTO_CREATE);59     }60     61     private void unBind(){62         if(flag == true){63             unbindService(conn);64             flag = false;65         }66     }67     68     private ServiceConnection conn = new ServiceConnection() {69         70         @Override71         public void onServiceDisconnected(ComponentName name) {72             // TODO Auto-generated method stub73             74         }75         76         @Override77         public void onServiceConnected(ComponentName name, IBinder service) {78             // TODO Auto-generated method stub79             MyBinder binder = (MyBinder)service;80             BindService bindService = binder.getService();81             bindService.MyMethod();82             flag = true;83         }84     };85     86 }

服務BindService:

BindService

BindServicepackage com.zys.service;import java.io.FileDescriptor;import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.IBinder;import android.os.IInterface;import android.os.Parcel;import android.os.RemoteException;import android.util.Log;public class BindService extends Service {    private static final String TAG = "BindService";    public void MyMethod(){        Log.i(TAG, "BindService-->MyMethod()");    }        @Override    public IBinder onBind(Intent intent) {        // TODO Auto-generated method stub        return myBinder;    }        public class MyBinder extends Binder{                public BindService getService(){            return BindService.this;        }    }        private MyBinder myBinder = new MyBinder();}

  由於Android 中的Service使用了onBind 的方法去綁定服務,返回一個Ibinder對象進行操作,而我們要擷取具體的Service方法的內容的時候,我們需要Ibinder對象返回具體的Service對象才能操作,所以說具體的Service對象必須首先實現Binder對象,這個樣子的話我們才能利用bindService的方法對Service進行綁定,擷取Binder對象之後擷取具體的Service對象,然後才擷取Service中的方法等等。所以我們需要注意的是bindService的方式去綁定服務擷取的必定是實現了Binder的對象,所以這是我們必須使用Binder的方式去擷取Service的方式而不是直接使用Service的類,這個是Android內部實現所約束的。

方法過程如下:

Intent intent = new Intent(MainActivity.this,BindService.class)->建立了BindService對象->建立了MyBinder對象

->bindService(intent, conn, Context.BIND_AUTO_CREATE);->onBind()函數  -----傳遞MyBinder對象------->onServiceConnected()--> 通過傳遞的Binder對象擷取剛剛和Binder對象對應的BindService 對象  -->調用Service中定義的方法。

  這個其中必須通過Binder對象,因為是通過Binder對象來傳遞的,通過Binder對象擷取Service對象,然後擷取所需的服務,所以Service必須實現Binder,以便傳遞和使用。

相關文章

聯繫我們

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