2012-08-03 68 views
0

我有這樣的服務類:無法調用藍牙廣播接收器方法的服務

public class BluetoothService extends Service { 

    private static Activity mActivity; 

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

    @Override 
    public void onCreate() { 
     IntentFilter intentFilter = new IntentFilter(); 
     intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); 
     this.registerReceiver(bluetoothReceiver, intentFilter);  
    } 

    @Override 
    public void onDestroy() { 
     if (bluetoothReceiver != null) { 
      this.unregisterReceiver(bluetoothReceiver); 
     }  
    } 

    @Override 
    public void onStart(Intent intent, int startid) { 
      // 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) {   
     return START_STICKY; 
    } 

    public static BroadcastReceiver bluetoothReceiver = new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { 
       final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); 
       TextView tvStatus = (TextView) mActivity.findViewById(R.id.tvtatus); 
       Messaging.appendMessage(tvStatus, Bluetooth.getDeviceState(state)); 
       if (Bluetooth.isBluetoothEnabled()) { 
        Messaging.appendMessage(tvStatus, Bluetooth.showMessage()); 
       }    
      } 
     } 
    }; 
} 

而且在我的活動課,我有這樣的:

public class MainActivity extends Activity { 

    private TextView tvStatus; 
    private Intent intentBluetooth; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     tvStatus = (TextView)findViewById(R.id.tvtatus); 

     intentBluetooth = new Intent(this, BluetoothService.class); 
     startService(intentBluetooth); 
    } 
} 

的廣播接收器方法(bluetoothReceiver)在Service類中永遠不會被調用。我不知道爲什麼。如果我在活動中首先有IntentFilter和BroadcastReceiver代碼,那麼它可以工作 - 但不是[單獨的]服務。我很難過。

我的AndroidManifest.xml是:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.onegoal.androidexample" 
     android:versionCode="1" 
     android:versionName="1.0.0" 
     android:installLocation="auto" 
     android:hardwareAccelerated="true"> 

     <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" /> 

     <uses-permission android:name="android.permission.BLUETOOTH" /> 
     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 
     <uses-feature android:name="android.hardware.bluetooth" android:required="false" /> 

     <application 
      android:icon="@drawable/ic_launcher" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme" 
      android:debuggable="true" > 
      <activity 
       android:name=".MainActivity" 
       android:label="@string/app_name" 
       android:theme="@android:style/Theme.NoTitleBar" > 
       <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 
        <category android:name="android.intent.category.LAUNCHER" /> 
       </intent-filter> 
      </activity> 
      <service android:name=".BluetoothService"> 
      </service> 
     </application> 
    </manifest> 

我是新來的Android所以我在做什麼可能不是最好的。希望可以有人幫幫我。

+0

你在AndroidManifest.xml中給出藍牙權限? – Lucifer 2012-08-03 05:56:34

+0

是的,我在AndroidManifest.xml中擁有這些權限: ChuongPham 2012-08-03 05:59:21

+0

有你的註冊收貨人在清單和@Lucifer說你有權利?即使我不認爲你可以做TextView tvStatus =(TextView)mActivity.findViewById(R.id.tvtatus); 在你的接收器..? – AAnkit 2012-08-03 06:00:11

回答

4

也許你的接收器是這個事實是造成這個問題的靜態

BroadcastReceiver不應該是靜態的。它會導致很多問題。

其他真正糟糕的設計問題與你的代碼 - 參考服務內部的活動,並使用它來修改視圖是真的錯誤的事情要做。它可以很容易地導致記憶韭菜。 ServiceActivity之間通信的權利是通過實現android的Messanger,或通過BroadcastReceiver在它們之間發送廣播。

如果你會聽我的建議 - 你不必讓你的接收器變成靜態的(我猜你只是因爲你在使用內部的mActivity靜態實例才使它成爲靜態的) 我很漂亮相信這將解決您的問題

你可以讀到這裏Messangerhttp://developer.android.com/reference/android/os/Messenger.html

相信你會發現很多的在網使用的例子。廣播更新,從服務活動的

例如:

public class MyService extends Service { 

@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

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

    IntentFilter intentFilter = new IntentFilter(); 
    intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); 
    this.registerReceiver(bluetoothReceiver, intentFilter); 
} 

@Override 
public void onDestroy() { 
    if (bluetoothReceiver != null) { 
     this.unregisterReceiver(bluetoothReceiver); 
    } 
    super.onDestroy(); 
} 

public BroadcastReceiver bluetoothReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { 
      final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR); 
      updateUIWithNewState(state); 
     } 
    } 
}; 

protected void updateUIWithNewState(int state) { 
    Intent intent = new Intent("serviceUpdateReceivedAction"); 
    intent.putExtra("state", state); 
    sendBroadcast(intent); 
} 

} 

,這就是活動:

public class MyActivity extends Activity { 

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

    Intent intent = new Intent(this, MyService.class); 
    startService(intent); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 

    registerReceiver(mServiceUpdatesReceiver, new IntentFilter("serviceUpdateReceivedAction")); 
} 

@Override 
protected void onPause() { 
    unregisterReceiver(mServiceUpdatesReceiver); 
    super.onPause(); 
} 

private BroadcastReceiver mServiceUpdatesReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     int state = intent.getIntExtra("state", -1); 
     // do what ever you want in the UI according to the state 
    } 
}; 
} 
+0

使接收器非靜態無差別。我以前見過Messenger類,但無法找到一種方法,該類可以發送從BroadcastReceiver收到的漸進更新消息,以實現像BluetoothAdapter.EXTRA_STATE這樣的意圖。 – ChuongPham 2012-08-03 06:35:57

+0

@Chuong:我不想開始爭論是否有可能。如果你的接收器所做的一切都是將文本設置爲textView,爲什麼你需要該服務?這是在活動中實現接收器的經典原因 – 2012-08-03 06:45:50

+0

我不是在和你爭論。我只是說我找不到使用Messenger類的方法(因爲我不知道如何)。就這樣。希望它清除任何誤解 – ChuongPham 2012-08-03 06:48:08