2010-05-11 91 views
2

這是我的代碼:服務綁定到活動

public class MainActivity extends Activity { 
    private ComponentName mService; 
    private Servicio serviceBinder; 

    private ServiceConnection mConnection = new ServiceConnection() { 
      public void onServiceConnected(ComponentName className, IBinder service) { 
      serviceBinder = ((Servicio.MyBinder)service).getService(); 
      } 

      public void onServiceDisconnected(ComponentName className) { 
      serviceBinder = null; 
      } 
     }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Intent bindIntent = new Intent(this, Servicio.class); 
     bindService(bindIntent, mConnection, Context.BIND_AUTO_CREATE); 
    } 

    @Override 
    protected void onStart() { 
     serviceBinder.somethingThatTakesTooMuch(); 
     super.onStart(); 
    } 



public class Servicio extends Service { 
    private final IBinder binder = new MyBinder(); 

    @Override 
      public IBinder onBind(Intent intent) { 
    return binder; 
    } 

    public int somethingThatTakesTooMuch() { 
     return 1; 
    } 

    public class MyBinder extends Binder { 
      Servicio getService() { 
      return Servicio.this; 
      } 
    } 

當我運行它, 它獲得了這一行業的NullPointerException異常:

serviceBinder.somethingThatTakesTooMuch(); 

回答

5

onStart被連接到之前調用該服務已完成。這不是瞬間的。

您只能保證在您的onServiceConnected被調用後服務已連接。只有這樣你才能在serviceBinder上調用方法。

嘗試上線調用serviceBinder.somethingThatTakesTooMuch()serviceBinder = ((Servicio.MyBinder)service).getService();

+1

synic:哦,你是怎麼想我應該處理,我不能顯示我的活動,直到我得到的連接? – Macarse 2010-05-11 21:08:34

+0

好問題。我不知道。您可以通過預先創建它(可能在另一個活動中)來儘可能縮短所需的時間 – synic 2010-05-11 21:10:47

+1

連接應該非常快速,但不會立即阻止。因此,我不會擔心時間 - 只需編寫需要該服務的代碼,以便通過onServiceConnected()來觸發。 – CommonsWare 2010-05-11 21:56:40