Java 服务如何通过发送对象并使用发送的对象从该活动调用方法来通知活动类?

Java 服务如何通过发送对象并使用发送的对象从该活动调用方法来通知活动类?,java,android,Java,Android,我知道BroadCastReceiver,但如何使用它在活动中调用方法。因此,如果我从服务收到通知,UI中的一个按钮将变为红色,红色是从服务发送的对象,红色是活动调用的方法。 抱歉,英语不好:)在您的活动中注册一个BroadcastReceiver private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() { @Override public void onReceive(Context contex

我知道BroadCastReceiver,但如何使用它在活动中调用方法。因此,如果我从服务收到通知,UI中的一个按钮将变为红色,红色是从服务发送的对象,红色是活动调用的方法。
抱歉,英语不好:)

在您的活动中注册一个BroadcastReceiver

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver()
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        String message = intent.getStringExtra("message");
        Log.d("receiver", "Got message: " + message);

        if (message.equals("eventOne"))
        {
            //do something
        }
        else if (message.equals("eventTwo"))
        {
            //do something else
        }
    }
};
@Override
protected void onResume()
{
    super.onResume();

    LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
            new IntentFilter("my-event"));
}

@Override
protected void onDestroy()
{
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);

    super.onDestroy();
}
private static boolean isServiceRunning(String serviceName, Context context)
{
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE))
    {
        if (serviceName.equals(service.service.getClassName()))
        {
            return true;
        }
    }
    return false;
}
覆盖活动的onResume和OnEstory

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver()
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        String message = intent.getStringExtra("message");
        Log.d("receiver", "Got message: " + message);

        if (message.equals("eventOne"))
        {
            //do something
        }
        else if (message.equals("eventTwo"))
        {
            //do something else
        }
    }
};
@Override
protected void onResume()
{
    super.onResume();

    LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
            new IntentFilter("my-event"));
}

@Override
protected void onDestroy()
{
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);

    super.onDestroy();
}
private static boolean isServiceRunning(String serviceName, Context context)
{
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE))
    {
        if (serviceName.equals(service.service.getClassName()))
        {
            return true;
        }
    }
    return false;
}
要检查您的服务是否正在运行,请在活动中添加以下内容

private BroadcastReceiver mMessageReceiver = new BroadcastReceiver()
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        String message = intent.getStringExtra("message");
        Log.d("receiver", "Got message: " + message);

        if (message.equals("eventOne"))
        {
            //do something
        }
        else if (message.equals("eventTwo"))
        {
            //do something else
        }
    }
};
@Override
protected void onResume()
{
    super.onResume();

    LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
            new IntentFilter("my-event"));
}

@Override
protected void onDestroy()
{
    LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);

    super.onDestroy();
}
private static boolean isServiceRunning(String serviceName, Context context)
{
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE))
    {
        if (serviceName.equals(service.service.getClassName()))
        {
            return true;
        }
    }
    return false;
}
这样说吧

boolean isServiceRunning = isServiceRunning(MyService.class.getName(), this.getApplicationContext());

if (!isServiceRunning)
{
    Intent startMyServiceIntent = new Intent(this.getApplicationContext(), MyService.class);

    startService(startMyServiceIntent);
}
最后,在您的服务上添加这样一个方法,并随时调用它

private void sendMessage(String event)
{
    Intent intent = new Intent("my-event");

    intent.putExtra("message", event);
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
    sendMessage("eventOne");

    return START_STICKY;
}
别忘了将您的服务添加到清单中

<application
    ...
    ...
    <service android:name=".MyService"/>
</application>

您可以使用广播接收器、事件总线或可观察的。在您的活动中,侦听事件并调用一个方法来更新您的UI


我为GCM意图服务做了类似的事情。我使用一个rxBus,当服务被触发时发布。我的活动订阅总线并在看到帖子时作出反应。

我的活动中需要一个线程并接收广播接收器的对象,还是可以启动一个设计为从该对象开始的方法?请使用事件总线。请参阅。感谢您的回复,但我认为这不是我想要的。那么,也许您应该用计算机编程术语解释为什么事件总线不是您想要的。因此,我必须在im服务中实现事件总线,因为我的服务与例如服务器进行通信。好的,但是我可以用BoradcastReceiver传递一个对象吗?是的,你传递一个意图并用你的对象填充它。看看谷歌的例子,我测试过了,它不会发送字符串。我已经测试过了,它正在工作。我猜你的服务没有运行。再次检查我的答案。我已对其进行了编辑,以便您可以检查并启动服务。