2011-10-19 113 views
0

雖然我遵循Android Developers網站上的教程,但無法將我的活動綁定到我的服務。無法綁定到服務

package com.dieselboris.motioncapture; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.content.ServiceConnection; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.dieselboris.motioncapture.LocalService.LocalBinder; 

public class HelloMotionCaptureActivity extends Activity implements OnClickListener { 
    private TextView textBox; 
    LocalService mService; 
    boolean mBound = false; 


    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     textBox = (TextView) findViewById(R.id.textView1); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     // Bind to LocalService NEVER RETURNS TRUE!!!! 
     Intent intent = new Intent(this, LocalService.class); 
     boolean isBound = bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 
     String text = Boolean.toString(isBound); 
     textBox.setText(text); 

    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     // Unbind from the service 
     if (mBound) { 
      unbindService(mConnection); 
      mBound = false; 
     } 
    } 

    //start the service when clicked 
    public void onClick(View v) { 

     if (v == startButton) 
     { 
      //NEVER IN HERE 
      if (mBound) { 
       int num = mService.getRandomNumber(); 
       Toast.makeText(this, "incoming number: " + num, Toast.LENGTH_LONG).show(); 
      } 
      Toast.makeText(this, "the service should run now", Toast.LENGTH_LONG).show(); 

     } 
    } 

    /** Defines callbacks for service binding, passed to bindService() */ 
    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; 
      if (mBound) { 
       // Call a method from the LocalService. 
       // However, if this call were something that might hang, then this request should 
       // occur in a separate thread to avoid slowing down the activity performance. 
       int num = mService.getRandomNumber(); 
       String text = Integer.toString(num); 
       textBox.setText(text); 
      } 
     } 

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

我嘗試連接到服務:

package com.dieselboris.motioncapture; 

import java.util.Random; 

import android.app.Service; 
import android.content.Intent; 
import android.os.Binder; 
import android.os.IBinder; 

public class LocalService extends Service { 
    // Binder given to clients 
    private final IBinder mBinder = new LocalBinder(); 
    // Random number generator 
    private final Random mGenerator = new Random(); 

    /** 
    * Class used for the client Binder. Because we know this service always 
    * runs in the same process as its clients, we don't need to deal with IPC. 
    */ 
    public class LocalBinder extends Binder { 
     LocalService getService() { 
      // Return this instance of LocalService so clients can call public methods 
      return LocalService.this; 
     } 
    } 

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

    /** method for clients */ 
    public int getRandomNumber() { 
     return mGenerator.nextInt(100); 
    } 
} 

我從仿真器輸出如下:

ERROR/AndroidRuntime(10878):致命異常:主要
ERROR/AndroidRuntime(10878):java.lang.NullPointerException
ERROR/AndroidRuntime(10878):at com.dieselboris.motioncapture.HelloMotionCaptur eActivity.onClick(HelloMotionCaptureActivity.java:66)
ERROR/AndroidRuntime(10878):at android.view.View.performClick(View.java:2408)
ERROR/AndroidRuntime(10878):at android.view.View $ PerformClick.run(View.java:8817)
ERROR/AndroidRuntime(10878):在android.os.Handler.handleCallback(Handler.java:587)
ERROR/AndroidRuntime(10878):在android.os.Handler。 dispatchMessage(Handler.java:92)
ERROR/AndroidRuntime(10878):at android.os.Looper.loop(Looper.java:144)
ERROR/AndroidRuntime(10878):at android.app.ActivityThread.main( ActivityThread.java:4937)
錯誤/ AndroidRuntime( 10878):at java.lang.reflect.Method.invokeNative(Native Method)
ERROR/AndroidRuntime(10878):at java.lang.reflect.Method.invoke(Method.java:521)
ERROR/AndroidRuntime(10878) ):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)
ERROR/AndroidRuntime(10878):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626 )
ERROR/AndroidRuntime(10878):在dalvik.system.NativeStart.main(本機方法)

看來,我稱之爲從服務公衆方法之前,它的初始化或連接尚未建立。

我仔細地在開發者網站上跟蹤了這個例子,並且無法弄清楚我做錯了什麼。

回答

0

我的權限werent設置正確。

我不得不爲整個應用程序插入一個權限,並在應用程序清單中插入一個「uses-permission」。

沒有權限,意圖永遠不會傳遞到服務。