Home > Mobile >  Xamarin.Forms Communication Between Two Pages Within Same App on Different Devices
Xamarin.Forms Communication Between Two Pages Within Same App on Different Devices

Time:04-16

Technologies, frameworks and devices I'm using:

  • Framework: Xamarin.Forms
  • IDE: Visual Studio 2022
  • Physical Device (smartphone): Zebra TC26 (Android 10)
  • Physical Device (smartwatch): Samsung Galaxy Watch4 (Android 11)

Problem definition

Currently I have a test Xamarin.Forms project that consists of two different UIs (XAML files):

  • User Interface 1: HomePage.XAML - This screen should be displayed on the smartphone
  • User Interface 2: WatchScreen.XAML - This screen should be displayed on the smartwatch

With code below I make sure HomePage.XAML is deployed to a smartphone and watchscreen is deployed to a smartwatch:

Page homePage = new NavigationPage(new HomePage());

// BuildVersionCodes.R is a reference to Android version 11 (mostly now used by Wear OS 3.x)
if (Build.VERSION.SdkInt == BuildVersionCodes.R)
{
    // SM-R870 is a reference to the Samsung Galaxy Watch4
    // Note: This is needed to ensure the UI is specific to the UI of a smartwatch
    if (Build.Model == "SM-R870")
    {
        Page watchScreen = new NavigationPage(new WatchScreen());
        MainPage = watchScreen;
    }
}
else
{
    MainPage = homePage;
}

Now I want to make these pages on different devices communicate with each other. HomePage.xaml exists within the main Xamarin.Forms project as well as WatchScreen.xaml. The way I want them to communicate with each other is by sending a message or something. A Xamarin.Forms project also comes with a native project. In this native Xamarin.Android project I try to retrieve inside the MainActivity.cs the button that exists within the main project by using (in WatchScreen.xaml this button exists and in WatchScreen.xaml.cs I have a method that gives this button back).

Method in WatchScreen.xaml.cs that gives button back:

public Button GetSendButtonFromWearableUI() => btnSendMessage;

In MainActivity.cs I get this method by using:

Button button = (App.Current.MainPage.Navigation.NavigationStack.LastOrDefault() as WatchScreen)
.GetSendButtonFromWearableUI();

Whenever I click on the button by doing this:

button.Clicked  = delegate
{
    SendData();
};

Some data should be sent from MainActivity.cs and catched by HomePage.xaml and displayed on it. I tried several approaches but I didn't succeed in achieving what needs to happen.. Therefore, I'm wondering if you guys could help me out with this and would be much appreciated.

CodePudding user response:

In the meantime I've been investigating this issue and came up with a solution. Follow steps below to get the same result. To make this solution work I've combined the Wearable Data Layer API from Google and MessagingCenter from Microsoft.

Also the example below shows only the communication from the smartwatch to the smartphone. In order to reverse processes you can put the send button on the HomePage instead of the smartwatch screen and make sure to subscribe to the correct messages.

One last note: keep in mind that code used below from Google is deprecated but it still works...

References used to make this work: SW to SP

If you want to communicate from smartphone to smartwatch, you could do something like this:

SP to SW

That's it guys. Now you will receive messages within the same application using the Wearable Data Layer API and MessagingCenter. Instead of having separate projects, we just use separate UIs to make this happen...

  • Related