【问题标题】:Launch app from wear and get the message regardless the state of app无论应用程序的状态如何,从磨损启动应用程序并获取消息
【发布时间】:2017-02-05 22:22:26
【问题描述】:

我正在处理可穿戴设备,我的目的是下一个:

在我的手表上,我想按一个简单的按钮,向手机发送一条简单的消息。但我想处理所有这些行为:

  • 当移动应用尚未启动时,启动应用并传递来自 Wear 的消息,可在启动器活动中处理
  • 当移动应用程序在后台启动时,只需将其带到前台并处理来自磨损的消息,这可以在启动器活动中处理
  • 当移动应用程序在前台启动时,只需在启动器活动中处理消息

到目前为止,我处理尚未启动的应用程序,但我无法在 intent 中包含的启动器活动中获得 额外消息时间>。代码在这里。

移动服务

public class MobileWearService extends WearableListenerService {

    private static final String START_ACTIVITY = "/start_activity";

    @Override
    public void onMessageReceived(MessageEvent messageEvent) {
        super.onMessageReceived(messageEvent);
        String event = messageEvent.getPath();
        String msg = new String(messageEvent.getData());

        if (event.equals(START_ACTIVITY)) {
            Intent intent = new Intent( this, MainActivity.class );
            intent.putExtra("Data", msg);
            intent.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK
                               | Intent.FLAG_ACTIVITY_CLEAR_TOP
                               | Intent.FLAG_ACTIVITY_SINGLE_TOP);
            startActivity( intent );
        }
    }
}

但是,如果我使用广播将消息从服​​务发送到主要活动,则它仅在应用程序启动和前台时才有效

   public class MobileWearService extends WearableListenerService {

        private static final String START_ACTIVITY = "/start_activity";

        @Override
        public void onMessageReceived(MessageEvent messageEvent) {
            super.onMessageReceived(messageEvent);
            String event = messageEvent.getPath();
            String msg = new String(messageEvent.getData());

            if (event.equals(START_ACTIVITY)) {
                broadcastIntent.setAction("com.me.project.wear.to.app");
                broadcastIntent.putExtra("Data", msg);
                broadcastIntent.putExtras(intent);
                sendBroadcast(broadcastIntent);
            }
        }
    }

启动器活动

private IntentFilter mIntentFilter = new IntentFilter("com.me.project.wear.to.app");
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent != null && intent.getAction().equals("com.me.project.wear.to.app")) {
            String msg = intent.getStringExtra("Data");
        }
    }
};

@Override
protected void onResume() {
    super.onResume();
    registerReceiver(mReceiver, mIntentFilter);
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(mReceiver);
}

因此,我会结合这一事实从磨损中获取消息(我知道如何),但无论应用程序的状态如何,都会传递此消息以在启动器活动中获取它。

【问题讨论】:

    标签: android android-intent broadcastreceiver wear-os


    【解决方案1】:

    只需制作静态广播接收器

    public class WatchMessageReceiver extends BroadcastReceiver{
    
    @Override
        public void onReceive(Context context, Intent intent) {
            if (intent != null &&  
                intent.getAction().equals("com.me.project.wear.to.app")) {
                String msg = intent.getStringExtra("Data");
                Intent launcherIntent = new Intent(context, LauncherActivity.class);
                launcherIntent.putExtra("Data",msg);
                startActivity(launcherIntent);
            }
        }
    }
    

    在您的清单文件中

       <receiver android:name ="WatchMessageReceiver"
          <intent-filter>
             <action android:name="com.me.project.wear.to.app"/>
          </intent-filter>
      </receiver>
    

    【讨论】:

    • 但是要从启动器活动中检索数据消息,我猜它是在 resume 方法中并通过 getIntent() 对吧?因为现在广播由于静态方式已经很好地启动了,但是我无法获取数据,因为捆绑包为空
    • 视情况而定。如果您的启动器活动启动模式是“singleTask”,那么您必须在启动器活动中覆盖 onNewIntent()。否则,您可以在 onCreate 中执行 getIntent()(如果再次创建启动器活动)
    • 好的,我会处理的。感谢您的帮助。
    【解决方案2】:

    在Sending and Syncing Data training中,有一个Handling Data Layer Events:

    当您调用数据层 API 时,您可以在调用完成时收到调用状态。您还可以侦听由应用程序在 Android Wear 网络上的任何位置进行的数据更改所产生的数据事件。

    监听数据层事件

    由于数据层在手持设备和可穿戴设备之间同步和发送数据,因此通常需要监听重要事件。此类事件的示例包括数据项的创建和消息的接收。

    要监听数据层事件,您有两种选择:

    • 创建一个扩展 WearableListenerService 的服务。
    • 创建一个实现 DataApi.DataListener 的 Activity。

    使用这两个选项,您可以为您有兴趣处理的事件覆盖数据事件回调方法。

    您可以使用WearableListenerService 监听的一些事件如下:

    • onDataChanged():每当创建、删除或更改数据项对象时,系统都会在所有连接的节点上触发此回调。
    • onMessageReceived():从节点发送的消息会在目标节点上触发此回调。
    • onCapabilityChanged():当您的应用程序实例宣传的功能在网络上可用时,该事件会触发此回调。如果您正在寻找附近的节点,您可以查询回调中提供的节点的isNearby() 方法。

    根据相关SOpost:

    WearableListenerService 不会持续运行 - 它仅在发送新消息/节点连接/数据层更改时启动,并在没有更多消息时停止。

    希望这会有所帮助。

    【讨论】:

    • 似乎也是处理这个问题的好方法!谢谢你们的帮助!
    猜你喜欢
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多