我有一项服务和3项活动。该服务在第一个活动中启动。 现在,当我转到第二个活动并按下某个按钮时,我想要 将数据发送到服务。
所以在第二个活动中,在点击监听器中我执行了以下操作:
Intent service = new Intent(MyService.class.getName());
service.putExtra("dataToSend",data.toString());
startService(service);
但是服务中的方法 onStartCommand ,并没有被调用..
另外,我想创建此服务以处理多个活动。 我的意思是每个活动都能够将数据发送到此服务并获取数据 从中。
答案 0 :(得分:3)
您好,您需要将正在运行的服务绑定到您需要再次访问它的活动。以下代码段可用作参考
NaN
答案 1 :(得分:1)
问题
我想创建此服务以处理多个活动。我的意思是每个活动都能够向该服务发送数据并从中获取数据。
您无需对Service
执行任何操作。如果服务未被销毁,服务将保持不变,这意味着所有Activities
将能够访问其数据。
<强>问题强>
但是服务中的onStartCommand方法没有被调用..
<强> WHY 强>
只要您的服务已启动,每次都不会调用onStartCommand
:
每次客户端通过调用 startService (Intent)显式启动服务时,由系统调用,提供它提供的参数和表示启动请求的唯一整数标记。
请求启动给定的应用程序服务。
解决方案
在onRebind
方法中调用您需要的活动:
在新客户端连接到服务之后调用,之前已通知其所有已在其onUnbind(Intent)中断开连接。只有在重写onUnbind(Intent)的实现以返回true时才会调用此方法。
答案 2 :(得分:0)
嘿,用以下意图打电话给你的服务
Intent mIntent = new Intent(this, MyService.class);
service.putExtra("dataToSend",data.toString());
startService(mIntent);
在您的情况下,您正在传递服务类名称,这将成为您的意图的行动。所以服务不会开始。
onstartCommand将在每次调用startService时调用,并且您可以从intent获取数据,该数据作为额外传递。
从服务中接收活动数据。您可以在服务中广播数据并在活动中注册广播
或
你可以使用绑定机制
答案 3 :(得分:0)
这是我做的不同活动,以便从服务中发送和接收数据
public class SensorsActivity extends AppCompatActivity {
BluetoothService mService;
boolean mBound = false;
String valueReceived;
protected void onStart() {
super.onStart();
Log.v("STATE", "onStart() is called");
// Bind to BluetoothService
if (!mBound) {
Intent intent = new Intent(this, BluetoothService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sensors);
LocalBroadcastManager.getInstance(SensorsActivity.this).registerReceiver(mMessageReceiver,
new IntentFilter("in.purelogic.simsonite.REQUEST_PROCESSED"));
}
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
BluetoothService.LocalBinder binder = (BluetoothService.LocalBinder) service;
mService = binder.getService();
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
mBound = false;
}
};
//BroadCastReceiver to let the MainActivity know that there's message has been recevied
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
try {
handleMessage(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
};
//The Message that comes from the service
private void handleMessage(Intent msg) throws Exception {
Bundle data = msg.getExtras();
valueReceived = data.getString("DATA");
Log.e("recv2", valueReceived);
}
}
答案 4 :(得分:-1)
一种可能的解决方案,但不是最好的解决方案是使用共享偏好。 您可以将它用作从您的活动到服务的按摩发射器。