【问题标题】:Communicate to a service from an activity in android从android中的活动与服务通信
【发布时间】:2014-12-28 13:34:59
【问题描述】:

我需要在活动和服务之间进行通信。我有一个在后台运行的服务。

  • 当活动启动时,它将检查服务是否正在运行。
  • 如果未运行,则活动将启动服务。
  • 如果活动已经在运行,那么活动将请求一些数据的服务。

我需要像轮询方法一样从服务获取更新数据。实际上,经过一段时间后,我需要服务中的数据。

如何从服务中获取数据?

据我所知,它可以通过绑定服务来完成。但我不想绑定服务,因为我需要在活动不集中时运行服务。

【问题讨论】:

  • 我读过这个。我还阅读了有关活动和服务间通信的教程。这些教程通过发送广播显示了从服务到活动的通信,但我需要从活动到服务的反向通信。

标签: android android-service


【解决方案1】:

使用广播接收器。 在活动中声明广播接收者:

public static final String ACTION_MY_ACTION = "com.example.test.MY_ACTION";

private BroadcastReceiver my_broadcast_receiver = new BroadcastReceiver()
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        //extract the data from intent here
        String data = intent.getStringExtra("my_key");
    }
}


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

    IntentFilter filter = new IntentFilter(ACTION_MY_ACTION);

    //we register the receiver
    registerReceiver(my_broadcast_receiver, filter);
}

@Override
protected void onDestroy()
{
    super.onDestroy();
    unregisterReceiver(my_broadcast_receiver);
}

在服务中每当您想向活动发送数据时:

Intent i = new Intent(MyActivity.ACTION_MY_ACTION);
i.putExtra("my_key", "data");
sendBroadcast(i);

编辑:

如果担心其他应用可以拦截广播然后使用LocalBroadcastManager,并发送本地广播,这样你正在广播的数据不会离开你的应用,所以不必担心泄露私人数据。

【讨论】:

    【解决方案2】:

    我会努力引导你走向正确的方向。我的建议是从服务更新您的应用程序后台数据(如数据库、设置等)。我注意到的另一件事是您可能正在尝试更新视图以供您执行此操作。 This 问题应该有助于您从Service 开始您的活动。我不建议这样做。相反,请检查您的 Activity 是否正在运行,然后进行更新。找出如何做到这一点是一个简单的谷歌搜索。

    【讨论】:

    • 我不需要从服务开始活动。我只需要来自服务的数据。如果有任何流程,该活动可以调用函数或请求为数据提供服务,那就没问题了。谢谢你的回答
    • 在这种情况下,您可以访问活动中的大部分数据入口点。例如,您可以打开与 SQLite 数据库助手等的连接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多