无论应用状态如何

时间:2017-02-05 22:22:27

标签: android android-intent broadcastreceiver wear-os

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

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

  • 当移动应用尚未启动时,请启动应用并将消息传递给可以在启动器活动中处理的消息
  • 当移动应用程序启动但在后台时,只需将其置于前台并处理来自磨损的消息,这可以在启动器活动中处理
  • 当移动应用程序启动并处于前台时,juste会在启动器活动中处理该消息

到目前为止,我还没有启动应用程序,但是我无法在额外消息 >意图。这是代码。

移动服务

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

所以我想结合这个事实来获取消息(我知道如何),但是无论应用程序的状态如何,都要通过此消息将其发送到启动器活动中。

2 个答案:

答案 0 :(得分:1)

制作静态BroadcastReceiver

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>

答案 1 :(得分:1)

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

  

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

侦听数据层事件

  

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

     

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

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

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

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

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

根据相关的SO post

  

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

希望这有帮助。