我正在编写一个执行以下操作的 android 应用程序(简而言之):
- 创建一个通过蓝牙监听数据流的活动
- 解析流入的数据
- (计划)显示数据的解释含义,如图形/文本
对于#3,我计划创建一个位于蓝牙流活动之上的新活动——毕竟,在初始设置后,蓝牙问题应该在后台。
但是,我在蓝牙活动和显示活动之间发送数据时遇到问题。
我已经用谷歌搜索,研究过,我能想到的最好的方法就是为此使用 Intents,但它不起作用。
这是一个例子。假设有数据进来,我解释数据涉及身体运动:
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);
}
尽管如此,仍然没有改变任何东西。我认为可能存在在不同手动创建的线程之间运行活动的问题。
主要更新/新问题:
我找到了本指南http://www.sohailaziz.com/2012/04/localbroadcastmanager-intra-application.html并且能够成功地实施其使广播公司与 LocalBroadcastManager 一起工作的策略。但是......这很奇怪......我发现onReceieve()
有时会调用该方法。IOW:当我运行应用程序时,要么每次我说它都会被调用,要么根本lbm.sendBroadcast(intent)
不会被调用。
非常令人费解。
最终编辑:好的,我开始工作了。确保每个意图都被正确命名并指向正确的位置是一种微妙的艺术。一旦完成,它似乎是一致的。