Android中的一项服务多项活动

时间:2015-08-05 10:33:23

标签: android android-activity service

我有一项服务和3项活动。该服务在第一个活动中启动。 现在,当我转到第二个活动并按下某个按钮时,我想要 将数据发送到服务。

所以在第二个活动中,在点击监听器中我执行了以下操作:

 Intent service = new Intent(MyService.class.getName()); 
 service.putExtra("dataToSend",data.toString());
 startService(service);

但是服务中的方法 onStartCommand ,并没有被调用..

另外,我想创建此服务以处理多个活动。 我的意思是每个活动都能够将数据发送到此服务并获取数据 从中。

5 个答案:

答案 0 :(得分:3)

您好,您需要将正在运行的服务绑定到您需要再次访问它的活动。以下代码段可用作参考

NaN

答案 1 :(得分:1)

问题
我想创建此服务以处理多个活动。我的意思是每个活动都能够向该服务发送数据并从中获取数据。

您无需对Service执行任何操作。如果服务未被销毁,服务将保持不变,这意味着所有Activities将能够访问其数据

<强>问题

  

但是服务中的onStartCommand方法没有被调用..

<强> WHY
只要您的服务已启动,每次都不会调用onStartCommand

onStartCommand

  

每次客户端通过调用 startService (Intent)显式启动服务时,由系统调用,提供它提供的参数和表示启动请求的唯一整数标记。

startService

  

请求启动给定的应用程序服务。

解决方案
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)

一种可能的解决方案,但不是最好的解决方案是使用共享偏好。 您可以将它用作从您的活动到服务的按摩发射器。