2017-04-06 67 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

为此,您需要创建绑定服务并使用绑定器对象在服务和活动之间传递任何类型的数据。 –