Android Wear将数据从Activity传递回watchface服务

时间:2016-02-04 14:45:44

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

我创建了一个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 );
        }

然后,新的活动接管了。在这个活动中,我有三个选项,基本上是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 );
}

用户选择一个选项,活动关闭,控制流传递给我的broadcastReceiver。

现在,我已经设置了一个broadcastReceiver来在选择一个选项时做一个简单的toast。但是,除了显示祝酒之外,我无法再使用这些数据了。

在我的broadcastReceiver中:

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中,我已经注册了接收器以及batteryinforecece和其他任何系统,正常情况下。我在broadcastReceiver中收到消息

再次回到我的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无效。

谢谢,艾美特

2 个答案:

答案 0 :(得分:2)

如果在其上还有其他活动,则无法保证您的表盘服务正在运行。它可能会被保留,但同样可能会被拆除。您可以尝试在WatchFaceService.onCreate()WatchFaceService.onDestroy()中注册您的接收器,但这不是一种可以保证有效的方式。

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

答案 1 :(得分:0)

我实际上设法解决了这个问题。

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

最初,当我注册了第二个接收器时,它是垃圾邮件日志文件并导致手表崩溃。我必须覆盖的原因是处理过滤器的传递,由于某些奇怪的原因,无法在watchfacecanvas.engine中完成。

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