Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从wear启动应用程序并获取消息,而不管应用程序的状态如何_Android_Android Intent_Broadcastreceiver_Wear Os - Fatal编程技术网

Android 从wear启动应用程序并获取消息,而不管应用程序的状态如何

Android 从wear启动应用程序并获取消息,而不管应用程序的状态如何,android,android-intent,broadcastreceiver,wear-os,Android,Android Intent,Broadcastreceiver,Wear Os,我正在处理可穿戴设备,我的目标是: 在我的手表上,我想按下一个简单的按钮,向手机发送一条简单的信息。但我想处理所有这些行为: 当移动应用程序尚未启动时,启动该应用程序并传递来自wear的消息,该消息可在launcher活动中处理 当移动应用程序在后台启动时,只需将其置于前台并处理来自wear的消息,即可在launcher活动中处理 当移动应用程序启动并处于前台时,只需在launcher活动中处理消息即可 到目前为止,我可以在应用程序尚未启动时启动它,但我无法在包含在意图中的启动程序活动中获得

我正在处理可穿戴设备,我的目标是:

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

  • 当移动应用程序尚未启动时,启动该应用程序并传递来自wear的消息,该消息可在launcher活动中处理
  • 当移动应用程序在后台启动时,只需将其置于前台并处理来自wear的消息,即可在launcher活动中处理
  • 当移动应用程序启动并处于前台时,只需在launcher活动中处理消息即可
到目前为止,我可以在应用程序尚未启动时启动它,但我无法在包含在意图中的启动程序活动中获得额外的消息。这是代码

移动服务

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);
}

因此,我想结合这一事实从wear(我知道如何)获取消息,但不管应用程序的状态如何,都要将此消息传递到launcher活动中获取它。

只需创建静态广播接收器即可

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>

只需制作静态广播接收器

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>
在中,有一个:

当您对数据层API进行调用时,可以在调用完成时接收调用的状态。您还可以监听数据事件,这些事件是由您的应用程序在Android Wear网络上的任何位置进行的数据更改引起的

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

要侦听数据层事件,有两个选项:

  • 创建扩展WearableListenerService的服务
  • 创建一个实现DataApi.DataListener的活动
使用这两个选项,可以覆盖您感兴趣处理的事件的数据事件回调方法

您可以侦听以使用的某些事件如下所示:

  • :无论何时创建、删除或更改数据项对象,系统都会在所有连接的节点上触发此回调
  • :从节点发送的消息将触发目标节点上的此回调
  • :当应用程序实例在网络上发布的功能可用时,该事件将触发此回调。如果要查找附近的节点,可以查询回调中提供的节点的方法
根据有关条例:

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

希望这有帮助。

在中,有一个:

当您对数据层API进行调用时,可以在调用完成时接收调用的状态。您还可以监听数据事件,这些事件是由您的应用程序在Android Wear网络上的任何位置进行的数据更改引起的

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

要侦听数据层事件,有两个选项:

  • 创建扩展WearableListenerService的服务
  • 创建一个实现DataApi.DataListener的活动
使用这两个选项,可以覆盖您感兴趣处理的事件的数据事件回调方法

您可以侦听以使用的某些事件如下所示:

  • :无论何时创建、删除或更改数据项对象,系统都会在所有连接的节点上触发此回调
  • :从节点发送的消息将触发目标节点上的此回调
  • :当应用程序实例在网络上发布的功能可用时,该事件将触发此回调。如果要查找附近的节点,可以查询回调中提供的节点的方法
根据有关条例:

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


希望这会有所帮助。

但是要从launcher活动中检索数据消息,我想它应该在resume方法中,并通过getIntent()进行,对吗?因为现在由于静态方式,广播启动良好,但我无法获取数据,因为捆绑包是空的,这取决于它。如果启动程序活动启动模式为“singleTask”,则必须在启动程序活动中重写onNewIntent()。否则您可以在onCreate中执行getIntent()(如果再次创建启动程序活动),好的,我会处理它。感谢您的帮助。但是要从launcher活动中检索数据消息,我想它应该在resume方法中,并通过getIntent()进行,对吗?因为现在由于静态方式,广播启动良好,但我无法获取数据,因为捆绑包是空的,这取决于它。如果启动程序活动启动模式为“singleTask”,则必须在启动程序活动中重写onNewIntent()。否则您可以在onCreate中执行getIntent()(如果再次创建启动程序活动),好的,我会处理它。谢谢你的帮助。这似乎也是一个很好的处理方法!谢谢你们的帮助,伙计们!这似乎也是一个很好的处理方法!谢谢你们的帮助,伙计们!