2013-01-04 2 views
0

bluetooth 장치에 연결하는 서비스가 있습니다. 첫 서비스에서이 서비스를 호출합니다. 그리고 서비스가 성공적으로 생성되고 시작되었습니다. 하지만 첫 번째 활동에서 bind를 사용하여 서비스중인 메소드를 호출하면 실행되지 않습니다. 나는안드로이드 서비스 메소드가 액티비티에서 호출하지 않습니다.

LocalService example라고 내 서비스 코드 :

// 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 실제로 (mBound) 내에서 해당 메서드를 호출하면 오류가 발생하지 않습니다.하지만 NullPointer 예외를 얻는 측면에서 호출합니다. 바인딩되지 않기 때문에 내 것입니다. –

+0

매니페스트를 게시하십시오. –

답변

1

이 왜 바인딩 및 방법을 호출되지 않는 이유는 무엇입니까?

순서. 활동이 시작 라이프 사이클 콜백의 순서는

  1. 에서 onCreate()
  2. ONSTART()
  3. onResume() 코드에서

Service가 결합되어 있는지 확인하고 전화입니다 onCreate()에 데이터 전송 방법을 사용하지만 onStart()까지 Service에 바인딩하지 않으므로 그 시점에서 결코 바인딩되지 않으므로 첫 번째 코드 블록이 실행되지 않습니다.

몇 가지 다른 점은주의해야 :

  • 서비스 바인딩은 비동기입니다. 전화를 다시 주문해도 SendData()onResume()에 있었으므로 Service은 여전히 ​​준비가되지 않았을 것입니다. bindService()을 호출 한 후에 Service이 바로 바인딩되지 않습니다. 그게 ServiceConnection을위한 것이고, onServiceConnected() 콜백으로 서비스를 사용할 수있는시기를 알려줍니다. 아무것도 액세스하지 않으려면 기다려야합니다.
  • 서비스에 바인딩 할 때 서비스를 시작할 필요도 없습니다. 바운드 서비스가 아직 실행 중이 아닌 경우 바인딩에서 시작됩니다. 위의 코드에서 startService()에 대한 호출은 불필요합니다.
+0

고맙습니다. 작동 순서가 바뀝니다. 그리고 나는 OnServiceConnected()에서 sendData() 메소드를 호출한다.훌륭하게 작동합니다. 그러나 제 경우에는 첫 번째 활동뿐만 아니라 다른 활동에서 구속해야합니다. 다른 활동에서, 내가 어떤 버튼을 가지고 있다면, 그 버튼을 클릭하면 sendData() 메소드를 호출 할 필요가있다. 어떻게 할 수 있는가? –

+0

버튼의 클릭 핸들러에서'sendData()'를 호출하기 만하면됩니다. 활동이 시작되는 동안 서비스에 도달하려고하는 경우에만 타이밍 감도가 적용됩니다. 바인딩은 오랜 시간이 걸리지 않으며, 코드와 인라인되지 않습니다. – Devunwired

+0

고맙습니다. 내 문제가 해결되었습니다. –

관련 문제