我在服务中有一个班级
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中看到了很多关于如何在服务和活动之间进行通信的例子;他们建议从活动开始上课,但在我的应用中这不起作用,因为我的班级必须一直在运行。
答案 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)
如果要在Service
和Activity
之间实现通信模式,则应使用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。