在服务和活动之间进行沟通

时间:2018-01-30 10:38:01

标签: java android

我在服务中有一个班级

MyClass m = new MyClass();

在课堂上我检查是否有权覆盖视图;如果是的话,没关系,否则我必须开始一项活动

if (Settings.canDrawOverlays(mContext)) {
    // draw over app
} else {
    // start the activity
    Intent i  = new Intent(context,Calls.class);
    context.startActivity(i);
}

当我开始活动时,我在课堂和活动之间进行沟通时遇到问题。我知道如何使用界面,但我如何在活动中注册它。

有些时候我想将一个对象或数据从类传递给活动,或者从活动传递给类......我该怎么做?

我在Stack Overflow中看到了很多关于如何在服务和活动之间进行通信的例子;他们建议从活动开始上课,但在我的应用中这不起作用,因为我的班级必须一直在运行。

2 个答案:

答案 0 :(得分:0)

也许您可以使用类似于机制的事件总线,您可以通过您的应用程序发送或接收事件,虽然有几个库,但我建议使用Otto库来安装。

只需在您的活动onCreate

中注册即可轻松使用
Bus bus = new Bus();
bus.register(this);

用于发送活动

// example data to post
public class TestData {
    public String message;
}

// post this data
bus.post(new TestData().message="Hello from the activity");

订阅此类活动

@Subscribe public void getMessage(TestData data)  {
    // TODO: React to the event somehow!
}

更多信息here

答案 1 :(得分:0)

如果要在ServiceActivity之间实现通信模式,则应使用LocalBroadcastManager

它会变得很方便,因为如果你的Service仍然在,但你的Activity 已经被摧毁(非常常见的情况),那么两者之间的“混乱”就没有任何效果(没有NPE或者什么都不会被抛出)。

第1步

BroadcastReceiver中创建Activity并定义ID / Filter

this.localBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Do what you have to do here if you receive data from the Service / Background Task
    }
}

public static final IntentFilter SIGNAL_FILTER = new IntentFilter("com.you.yourapp.MY_SIGNAL")

第2步

Activity注册onResume()中的广播,并在onPause()中取消注册。

@Override
protected void onResume() {
    // Listen if a Service send me some data
    LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(this.localBroadcastReceiver, SIGNAL_FILTER);
}

@Override
protected void onPause() {
    // I'm going to the background / or being destroyed: no need to listen to anything anymore...
    LocalBroadcastManager.getInstance(getApplicationContext()).unregisterReceiver(this.localBroadcastReceiver);
}

您的Activity现在已准备好接收Application中任何其他组件的数据。

如果它在后台,则无需更新UI:事实上,如果在后台,Activity将不会响应。

同样地,如果它被垃圾收集,Receiver将被取消注册,而Activity将不会响应任何内容。

如果Activity已恢复/重新启动,则会触发onResume()并再次注册Receiver

第3步

您现在需要做的就是从Service发送数据。

只需致电

final Intent intent = new Intent();
intent.setAction(SomeActivity.SIGNAL_FILTER);
// put your data in intent
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);

并且您的Activity会相应地响应信号。

令人惊讶的是,很少有人知道LocalBroadcastManager,而是使用一些自我实现的回调/单一模式,这会增加复杂性和不可读性。

此模式内置于Android,因此您不需要外部库。至于安全性,这可确保您的信号保持在应用程序内部:因此其他应用程序无法读取任何数据。

我同样回答了另一个问题here