0

我正在编写一个执行以下操作的 android 应用程序(简而言之):

  1. 创建一个通过蓝牙监听数据流的活动
  2. 解析流入的数据
  3. (计划)显示数据的解释含义,如图形/文本

对于#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)不会被调用。

非常令人费解。

最终编辑:好的,我开始工作了。确保每个意图都被正确命名并指向正确的位置是一种微妙的艺术。一旦完成,它似乎是一致的。

4

1 回答 1

0

您像这样注册广播接收器:

getContext().registerReceiver(new AGDReceiver(),
    new IntentFilter("com.ekscsy.sleepstudy.debug.AGDebug"));

但是你广播了这个意图:

Intent intent = new Intent("com.ekscsy.sleepstudy.debug.AGDReceiver");

Intents 中的动作并不相同。如果您为此定义了一个常量,则可以省去这个麻烦,即:

public static final String MY_INTENT_ACTION = "com.ekscsy.sleepstudy.debug.AGDReceiver";

然后在创建广播意图和创建意图过滤器以注册广播接收器时使用该常量。

于 2013-04-19T14:42:25.840 回答