【问题标题】:Android Wear passing data from Activity back to watchface serviceAndroid Wear 将数据从 Activity 传回表盘服务
【发布时间】:2016-02-04 14:45:43
【问题描述】:

我创建了一个 Android Wear 表盘,一个交互式表盘。在我的脸上,我有一个网格区域,我在其中监听 onTapCpmmand:

else if (x >= x6 & x <= x9 & y >= (y5 - (gridYUnit / 2)) & y <= (y8 - (gridYUnit / 2))) {
            activityLaunched = new Intent(MyWatchFace.this, ActivityLaunched.class);
            activityLaunched .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(activityLaunched );
        }

mew 活动随后接管。在这个活动中,我有三个选项,基本上是 ImageButtons,以及各自的 onClickHandlers:

optionOne.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            confirmationIntent = new Intent(ActivityLaunched.this, ConfirmationActivity.class);
            confirmationIntent .putExtra(ConfirmationActivity.EXTRA_ANIMATION_TYPE,
                    ConfirmationActivity.SEARCH_SERVICE);
            confirmationIntent .putExtra(ConfirmationActivity.EXTRA_MESSAGE,
                    getString(R.string.option_one));

            currentOption = "1";
            broadcastIntent(currentOption);
            startActivity(confirmationIntent );
            ActivityLaunched.this.finish();

        }
    });

使用 broadcastIntent 处理广播:

public void broadcastIntent(String currentOption){


    Intent optionUpdated = new Intent();
    optionUpdated .setAction("com.example.packagename....");
    optionUpdated .putExtra("Option", currentOption);
    sendBroadcast(optionUpdated );
}

用户选择一个选项,活动关闭,控制流传递给我的广播接收器。

现在,我设置了一个广播接收器,以便在选择一个选项时进行简单的祝酒。但是,除了显示敬酒之外,我无法对这些数据做更多的事情。

在我的广播接收器中:

public void onReceive(Context context, Intent intent) {
    Toast.makeText(context, "Option Updated." + intent.getStringExtra("Option"), Toast.LENGTH_LONG).show();


    currentOption = intent.getStringExtra("Option");
    sendOption .setAction("com.example.packagename....");
    sendOption tion.putExtra("Option", currentOption );
    context.sendBroadcast(sendOption );
    Log.d(TAG, "THIS WORKS : " + currentOption );
}

在我的 WatchFaceService 中,我已经像往常一样注册了接收器以及电池前接收器和任何其他系统接收器。我正在广播接收器中接收消息

再次回到我的 WatchFaceService,这是我遇到问题的地方,我没有收到任何更新:

optionUpdateReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Bundle results = getResultExtras(true);
                String option = results.getString("Option");
                Log.d(TAG, " NOTHING SHOWING HERE  " + currentOption + option );
            }
        };

我尝试过使用 setter 和 getter,这需要第二次启动活动才能获得真正的价值。

关于我做错了什么有什么想法吗?

我在这里尝试了其他一些答案和想法,以及其他外部资源。但由于它是我正在使用的 Android Wear,就像操作系统一样不稳定,我尝试过的任何建议都适用于 Android,但似乎对 Android Wear 无效。

谢谢,埃米特

【问题讨论】:

  • 很少有基本的 Android 代码(服务、广播接收器等)在 Wear 中不起作用。它只是下面的Android。但是回到你的问题......我认为你根本不应该在这里使用 BroadcastReceivers 。要么从你的活动直接发送一个意图到你的表盘服务,或者(可能更简单)使用像github.com/greenrobot/EventBus这样的库
  • @String 好的,谢谢,我会检查一下,我曾尝试通过意图发回数据,但我不得不重新启动活动以从前一个活动中检索数据。也许这是一个时间问题,但我无法弄清楚。但是,再次感谢,我会查看您的链接

标签: android android-activity service broadcastreceiver wear-os


【解决方案1】:

当您的表盘服务之上还有其他活动时,不能保证它会运行。它可能会被保留,但同样可能会被拆除。您可以尝试在WatchFaceService.onCreate()WatchFaceService.onDestroy() 中注册您的接收器,但这并不能保证有效。

相反,在 Activity 内部将信息保存到 SharedPreferences 中,然后在您的表盘中读取信息。创建表盘后,从首选项中读取值(您还可以设置首选项的侦听器,以便在表盘已启动时更新它们的更改)。

【讨论】:

  • 我实际上已经设法解决了它/提供了一个目前还可以的解决方法,请参阅下面的帖子
【解决方案2】:

我实际上已经设法解决了。

我创建了第二个广播接收器,将其传递回表盘,然后覆盖注册/取消注册方法来处理传输。

最初,当我注册第二个接收器时,它正在向日志文件发送垃圾邮件并导致手表崩溃。我必须重写的原因是为了处理过滤器的传递,由于某些奇怪的原因,这不能从 watchfacecanvas.engine 中完成。

无论如何,它现在工作正常,但感谢您的帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    相关资源
    最近更新 更多