Java 在Android中的活动之间共享数据
我正在编写一个android应用程序,它可以实现以下功能(简而言之):Java 在Android中的活动之间共享数据,java,android,android-intent,android-activity,data-binding,Java,Android,Android Intent,Android Activity,Data Binding,我正在编写一个android应用程序,它可以实现以下功能(简而言之): 创建通过蓝牙监听数据流的活动 解析流入的数据 (计划)显示数据的解释含义,如图形/文本 对于#3,我计划在Bluetooth流媒体活动的基础上创建一个新的活动——毕竟,在初始设置之后,Bluetooth事务应该在后台进行 但是,我在蓝牙活动和显示活动之间发送数据时遇到问题 我在谷歌上搜索过,研究过,我能想到的最好的办法就是使用意图,但它不起作用 这里有一个例子。假设有数据进来,我解释数据涉及身体运动: private Bod
private BodyMovementPositionStream() {
if (getActivity() != null && getContext() != null && iDebug == null) {
iDebug = new Intent(getActivity(), AGDebug.class);
iDebug.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
new Thread(new Runnable() {
public void run() {
if (theApplication.isD()) {
Log.d(theApplication.getTAG(), "Creating Intent for Position Debuging...");
getContext().registerReceiver(new AGDReceiver(), new IntentFilter("com.ekscsy.sleepstudy.debug.AGDebug"));
getContext().startActivity(iDebug);
}
}
}).start();
}
}
所以基本上,在剪断它时,我启动活动AGDebug,为新任务添加标志,然后在新线程中注册接收器。这是可行的,我在手机上看到它,就会出现Log.d()
消息
稍后在我的代码中,我提取数据:
private static final int fSize = 4;
public void unpack(byte[] data) {
int i = -fSize;
accx = Streams.byteArr2ByteBuff(data, i += fSize, fSize).order(null).getFloat();
accy = Streams.byteArr2ByteBuff(data, i += fSize, fSize).order(null).getFloat();
accz = Streams.byteArr2ByteBuff(data, i += fSize, fSize).order(null).getFloat();
gyrox = Streams.byteArr2ByteBuff(data, i += fSize, fSize).order(null).getFloat();
gyroy = Streams.byteArr2ByteBuff(data, i += fSize, fSize).order(null).getFloat();
gyroz = Streams.byteArr2ByteBuff(data, i += fSize, fSize).order(null).getFloat();
temp = Streams.byteArr2ByteBuff(data, i += fSize, fSize).order(null).getFloat();
Intent intent = new Intent("com.ekscsy.sleepstudy.debug.AGDReceiver");
intent.putExtra("com.ekscsy.sleepstudy.debug.AGDebug.accxF", accx);
getContext().sendBroadcast(intent);
}
在提取结束时,我创建了一个新的意图,.putExtra()
包的名称+一个带有一些数据的浮点。我执行.sendBroadcast()
但是。。。什么也没发生。我有一个从未被调用的断点:
public class AGDReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
assert(true); //breakpoint here
}
}
显然,我在这里遗漏了一些步骤,但我似乎找不到任何关于在活动之间共享数据的好信息
事实上,让我重申一下,这里的主要目标是在活动之间共享数据。数据、浮点数、整数等等。我假设“Android”这样做的方式是通过意图和广播,但如果有更好的方法,我洗耳恭听
我希望使这个应用程序与API 8兼容
编辑:仅供参考,我更改了代码,将AGDebug活动的开始从它自己的线程中取出。现在看起来更像这样:
if (getActivity() != null && getContext() != null && iDebug == null) {
iDebug = new Intent(getActivity(), AGDebug.class);
iDebug.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Log.d(theApplication.getTAG(), "Creating Intent for Position Debuging...");
getContext().registerReceiver(new AGDReceiver(), new IntentFilter("com.ekscsy.sleepstudy.debug.AGDebug"));
getContext().startActivity(iDebug);
}
但还是没有改变什么。我想可能存在在不同手动创建的线程之间运行活动的问题
主要更新/新问题:
我找到了这本指南,并成功地实施了它的策略,使广播公司与LocalBroadcastManager一起工作。然而。。。这很奇怪。。。我发现onreceive()
方法有时会被调用,有时不会。IOW:当我运行应用程序时,要么每次我说lbm.sendBroadcast(intent)
它都会被调用,要么根本不会被调用
非常令人费解
最终编辑:
好吧,我开始工作了。确保每一个意图都被正确命名并指向正确的地点是一种微妙的艺术。一旦完成,它似乎是一致的 按如下方式注册广播接收器:
getContext().registerReceiver(new AGDReceiver(),
new IntentFilter("com.ekscsy.sleepstudy.debug.AGDebug"));
但是你传播了这个意图:
Intent intent = new Intent("com.ekscsy.sleepstudy.debug.AGDReceiver");
意图中的行为是不同的。如果您为此定义了一个常数,则可以避免此问题,即:
public static final String MY_INTENT_ACTION = "com.ekscsy.sleepstudy.debug.AGDReceiver";
然后在创建广播意图和创建用于注册广播接收器的意图过滤器时使用该常数。如果您已经找到了答案,您应该回答自己的问题并接受它。否则,这个问题就会出现在“未回答”列表中。或者,你可以接受我的回答;-)虽然我通过这本指南找到了答案,但你的答案一针见血。我没有使用相同的包和类名——我在区分接收者和活动的意图时感到困惑。