2013-01-04 46 views
0

我有服務,其中包括連接到bluetooth設備。我從第一次活動中調用此服務。並且服務成功創建並開始。但是當我在第一個活動中使用綁定來調用服務中的方法時,它不會執行。我提到LocalService example未從活動調用的Android服務方法

我的服務代碼:

// Binder given to clients 
private final IBinder mBinder = new LocalBinder(); 

@Override 
public IBinder onBind(Intent intent) { 
    // A client is binding to the service with bindService() 
    return mBinder; 
} 

public class LocalBinder extends Binder { 
    public BluetoothServices getService() { 
     // Return this instance of LocalService so clients can call public methods 
     return BluetoothServices.this; 
    } 

} 

public void SendData(){ 
    Log.d("msg", "Send msg"); 
} 

我用下面的代碼在我第一個活動:

BluetoothServices mService; 
boolean mBound = false; 

@Override 
public void onStart(){ 
    super.onStart(); 
    Intent btservices = new Intent(getApplication(),BluetoothServices.class); 
    startService(btservices); 

    bindService(btservices, mConnection, Context.BIND_AUTO_CREATE); 

} 

private ServiceConnection mConnection = new ServiceConnection() { 

    @Override 
    public void onServiceConnected(ComponentName className, 
      IBinder service) { 
     // We've bound to LocalService, cast the IBinder and get LocalService instance 
     LocalBinder binder = (LocalBinder) service; 
     mService = binder.getService(); 
     mBound = true; 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName arg0) { 
     mBound = false; 
    } 
}; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if(mBound){ 
     mService.SendData(); 
    } 
} 

什麼是在上面的代碼中的問題,爲什麼呢?它不是綁定和調用方法?

我的清單:

<uses-sdk android:minSdkVersion="10" /> 

<uses-permission android:name="android.permission.INTERNET" /> 

<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 

<application 
    android:debuggable="true" 
    android:icon="@drawable/logo_50" 
    android:theme="@style/app_theme" > 

    <service android:name="com.example.utilities.BluetoothServices"></service> 
    <activity 
     android:name="com.example.pkg.Thisisit" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

</application> 

+0

你看過logcat嗎?任何錯誤或其他有用的日誌? –

+0

@DavidWasser實際上,當我調用if(mBound)內部沒有任何錯誤的方法。但是我在外面調用,得到NullPointer異常。那是因爲沒有綁定。 –

+0

請張貼您的清單。 –

回答

1

什麼是在上面的代碼中的問題,爲什麼它不具有約束力,並調用方法?

操作順序。生命週期回調的活動開始時的順序是

  1. 的onCreate()
  2. 在onStart()
  3. 的onResume()

在你的代碼,你檢查Service綁定和調用在onCreate()中的發送數據方法,但不要綁定到Service,直到onStart(),因此您的第一個代碼塊將永遠不會觸發,因爲您從未在此點綁定過。

幾個其他需要注意的幾點:

  • 服務綁定是異步的。即使你重新排列你的電話,SendData()onResume()Service仍然不會準備好;在致電bindService()後,Service不會立即綁定。這就是ServiceConnection的作用,它告訴你服務何時可用onServiceConnected()回調。訪問任何內容之前,您必須等待。
  • 綁定到服務時,您不必也啓動它。綁定服務在綁定時啓動,如果它尚未運行。在上面的代碼中,撥打startService()是多餘的。
+0

謝謝,我改變了操作順序。我在OnServiceConnected()中調用sendData()方法。它工作正常,太棒了。但在我的情況下,我需要從不同的活動中綁定,而不僅僅是來自First活動。在其他活動中,如果我有一些按鈕,當我點擊該按鈕時,我需要調用sendData()方法。如何才能做到這一點? –

+0

只需從按鈕的點擊處理程序中調用'sendData()'即可。時間敏感性僅適用於在活動啓動時嘗試訪問服務。綁定不需要很長時間,它不會與代碼內聯。 – Devunwired

+0

非常感謝。我的問題解決了。 –

相關問題