2017-04-06 66 views
0

所以我需要將一個Activity中定義的btDevice發送到params中的服務,以便我可以得到它。下面是該服務的代碼:如何將活動設置爲服務?

public class Servicio extends JobService implements ServiceConnection { 

private static BluetoothDevice btDevice; 
public TemperaturaFragment temperaturaFragment; 
private MetaWearBoard mwBoard; 

@Override 
public boolean onStartJob(JobParameters params) { 
    mJobHandler.sendMessage(Message.obtain(mJobHandler, 1, params)); 
    params.getExtras(btDevice = getParcelableExtra(EXTRA_BT_DEVICE)); 
    getApplicationContext().bindService(new Intent(this, BtleService.class), (ServiceConnection) this, BIND_AUTO_CREATE); 
    return true; 
} 



@Override 
public boolean onStopJob(JobParameters params) { 

    return false; 
} 
private Handler mJobHandler = new Handler(new Handler.Callback() { 

    @Override 
    public boolean handleMessage(Message msg) { 

     Toast.makeText(getApplicationContext(), 
       "JobService task running", Toast.LENGTH_SHORT) 
       .show(); 
     jobFinished((JobParameters) msg.obj, false); 
     return true; 
    } 

}); 

,這裏是我要發送的是,在活動中定義的對象:

btDevice= getIntent().getParcelableExtra(EXTRA_BT_DEVICE); 

我想用builder.setExtras(the object here),然後在服務getExtras(get the object)但設置的額外說這是一個BluetoothDevice,並需要一個捆綁。任何想法?謝謝您的幫助。

我把這個並不起作用,因爲數據是剛讀,不發送

Intent serviceIntent = new Intent(Servicio.class.getName()) 
        serviceIntent.putExtra(1, getIntent().getParcelableExtra(EXTRA_BT_DEVICE)); 
        getApplicationContext().startService(serviceIntent); 
+0

您嘗試通過設備ID?怎麼樣使用共享首選項。 –

+0

我沒有試圖通過de id,我試圖傳遞它獲取的數據,現在我看到序列化方法,任何想法? :( –

回答

1

由於IntentsetExtras()方法需要輸入值Bundle對象和BluetoothDevice對象不是Bundle類對象。

您可以通過Bundle和Intent傳遞原始數據類型,序列化,ParcelableArrayList

綁定服務

一個綁定的服務是在客戶機 - 服務器接口的服務器。它允許組件(如活動)綁定到服務,發送請求,接收響應以及執行進程間通信(IPC)。綁定服務通常只在服務於另一個應用程序組件時才存在,並且不會無限期地在後臺運行。

Bound Service Example In Android

而且你會發現如何從活動調用服務類的方法

Define an interface your Service will use to communicate events:

編輯

您可以在Service通過Intent像下面的代碼發送數據:

Intent serviceIntent = new Intent(YourService.class.getName()) 
serviceIntent.putExtra("UserID", "123456"); 
context.startService(serviceIntent); 

而且你可以在Servicecallback方法稱爲檢索Intent對象:

Service啓動其onStartCommand()方法將被調用,所以在這種方法,你可以從意向對象檢索值(UserID)例如

public int onStartCommand (Intent intent, int flags, int startId) { 
    String userID = intent.getStringExtra("UserID"); 
    return START_STICKY; 
} 

EDIT

您也可以將BluetoothDevice對象直接發送到類似以下代碼的Intent,因爲它的BluetoothDevice類實現Parcelable接口。

Intent serviceIntent = new Intent(YourService.class.getName()) 
Bundle bundle = new Bundle(); 
bundle.putParcelable("btDevice",bluetoothDevice); 
serviceIntent.putExtras(bundle); 
context.startService(serviceIntent); 

而且你可以在服務類檢索其象下面這樣:在onStartCommand方法

BluetoothDevice btDevice = (BluetoothDevice) bundle.getParcelable("btDevice"); 
+0

和我怎麼能做到這一點?是否有任何其他方法將設備傳遞給服務?或者一種方法將設備轉換爲Bundle? –

+0

我不知道如何使用Parcelabe和ArrayList與設備,任何來源或解釋? –

+0

爲此,您需要創建綁定服務並使用綁定器對象在服務和活動之間傳遞任何類型的數據。 –