【问题标题】:Sharing data between activitiesin Android在 Android 中的活动之间共享数据
【发布时间】:2013-04-12 04:46:07
【问题描述】:

我正在编写一个执行以下操作的 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) 时都会调用它,或者根本不会调用它。

非常令人费解。

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

【问题讨论】:

  • 如果你想通了,你应该回答你自己的问题并接受它。否则,这个问题最终会出现在“未回答”列表中。或者,你可以接受我的回答;-)

标签: java android android-intent android-activity data-binding


【解决方案1】:

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

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

但是你广播了这个 Intent:

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

Intents 中的动作不一样。如果你为此定义一个常量,你可以省去这个麻烦,即:

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

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

【讨论】:

  • 虽然我确实设法通过本指南 (sohailaziz.com/2012/04/…) 弄清楚了你的答案。我没有使用相同的包名和类名——我在区分接收者和活动的意图时感到困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
相关资源
最近更新 更多