Android 如何以Xamarin表单广播基于当前页面的消息
我有一个Xamarin表单解决方案,如下所示:Android 如何以Xamarin表单广播基于当前页面的消息,android,xamarin.forms,Android,Xamarin.forms,我有一个Xamarin表单解决方案,如下所示: Solution: |- Forms.App | |- App.cs | |- MyViewPage.xaml | |- MyViewModel.cs | | ... | |- Droid Project | |- TriggerService.cs | | ... 我在Android项目中使用了一个带有意向过滤器的广播接收器,在按下某个物理触发器时发送事件,到目前为止,这对我来说是可行的,
Solution:
|- Forms.App
| |- App.cs
| |- MyViewPage.xaml
| |- MyViewModel.cs
| | ...
|
|- Droid Project
| |- TriggerService.cs
| | ...
我在Android项目中使用了一个带有意向过滤器的广播接收器,在按下某个物理触发器时发送事件,到目前为止,这对我来说是可行的,但现在我正试图根据按下的页面调整广播消息以做不同的事情
对我来说,从某个页面按下触发器与从另一个页面按下触发器不同,以下是我当前在相关类上的实现:
触发服务
[BroadcastReceiver(Enabled = true, Exported = false)]
[IntentFilter(new[] { "android.TRIGGER" })]
public class TriggerService : BroadcastReceiver, ITriggerService
{
public override void OnReceive(Context context, Intent intent)
{
//Here I need to identify the Page where I'm located
var page = "MyViewPage" // should replace by some mechanism to GetCurrentPage();
switch (page)
{
case "MyViewPage":
Xamarin.Forms.MessagingCenter.Send<TriggerService>(this, "TRIGGER_MyViewPage");
break;
case "MyViewPage2":
Xamarin.Forms.MessagingCenter.Send<TriggerService>(this, "TRIGGER_MyViewPage2");
break;
case "MyViewPage3":
Xamarin.Forms.MessagingCenter.Send<TriggerService>(this, "TRIGGER_MyViewPage3");
break;
}
}
}
[BroadcastReceiver(Enabled=true,Exported=false)]
[IntentFilter(新[]{“android.TRIGGER”}]
公共类触发器服务:BroadcastReceiver、ITriggerService
{
公共覆盖void OnReceive(上下文、意图)
{
//在这里,我需要确定我所在的页面
var page=“MyViewPage”//应替换为GetCurrentPage()的某种机制;
交换机(第页)
{
案例“MyViewPage”:
Xamarin.Forms.MessagingCenter.Send(这是“TRIGGER_MyViewPage”);
打破
案例“MyViewPage2”:
Xamarin.Forms.MessagingCenter.Send(这是“TRIGGER_MyViewPage2”);
打破
案例“MyViewPage3”:
Xamarin.Forms.MessagingCenter.Send(这是“TRIGGER_MyViewPage3”);
打破
}
}
}
这里是MyViewPage
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class MyViewPage : ContentPage
{
private MyViewModel _viewModel;
public MyViewPage()
{
InitializeComponent();
_viewModel = new MyViewModel();
MessagingCenter.Subscribe<TriggerService>(this, "TRIGGER_MyViewPage", (sender) =>
{
//Do something different for this Page when trigger pressed
});
}
}
[XamlCompilation(XamlCompilationOptions.Compile)]
公共部分类MyViewPage:ContentPage
{
私有MyViewModel _viewModel;
公共MyViewPage()
{
初始化组件();
_viewModel=新的MyViewModel();
MessagingCenter.Subscribe(此“触发器”\u MyViewPage),(发件人)=>
{
//按下触发器时对此页面执行不同的操作
});
}
}
总而言之,我正在寻找一种在使用Xamarin表单时从Android级别获取当前页面的方法,或者寻找一种更好的方法来实现这种机制。我解决了这个问题,在表单层而不是Android上反转控制和处理不同的行为,我认为这是更好的解决方案。我将在下面展示,以防帮助其他人: 触发服务(广播):
[BroadcastReceiver(Enabled=true,Exported=false)]
[IntentFilter(新[]{“android.TRIGGER”}]
公共类触发器服务:BroadcastReceiver、ITriggerService
{
公共覆盖void OnReceive(上下文、意图)
{
//不管我在哪一页,我都会广播信息
Xamarin.Forms.MessagingCenter.Send(这个“触发器”);
}
}
AppShell类:
public partial class AppShell : Xamarin.Forms.Shell
{
public AppShell()
{
InitializeComponent();
MessagingCenter.Subscribe<ITriggerService>(this, "TRIGGER", async (sender) =>
{
//Here I get the current page and do something different based on location
var current = Shell.Current?.CurrentItem?.CurrentItem?.Route?.Replace("IMPL_","");
if (current != null)
{
switch (current)
{
case "MyViewPage":
CrossToastPopUp.Current.ShowToastMessage($"Trigger was pressed from: {current}");
break;
case "MyViewPage2":
CrossToastPopUp.Current.ShowToastMessage($"Trigger was pressed from: {current}");
break;
default:
break;
}
}
});
}
}
public分部类AppShell:Xamarin.Forms.Shell
{
公共AppShell()
{
初始化组件();
订阅(此“触发器”,异步(发送方)=>
{
//在这里,我得到当前页面,并根据位置做一些不同的事情
var current=Shell.current?.CurrentItem?.CurrentItem?.Route?.Replace(“IMPL_”),替换为;
如果(当前!=null)
{
开关(电流)
{
案例“MyViewPage”:
CrossToAstOpup.Current.ShowToastMessage($”触发器是从:{Current}按下的);
打破
案例“MyViewPage2”:
CrossToAstOpup.Current.ShowToastMessage($”触发器是从:{Current}按下的);
打破
违约:
打破
}
}
});
}
}
如果要获取当前页面,可以使用`page currentPage=Navigation.NavigationStack.LastOrDefault();`获取序列的最后一个元素。嗨,这在Android层是不可能的,或者我只是没有找到方法,如果可能的话,请分享一些例子。不管怎样,我最终做了一些不同的事情。
public partial class AppShell : Xamarin.Forms.Shell
{
public AppShell()
{
InitializeComponent();
MessagingCenter.Subscribe<ITriggerService>(this, "TRIGGER", async (sender) =>
{
//Here I get the current page and do something different based on location
var current = Shell.Current?.CurrentItem?.CurrentItem?.Route?.Replace("IMPL_","");
if (current != null)
{
switch (current)
{
case "MyViewPage":
CrossToastPopUp.Current.ShowToastMessage($"Trigger was pressed from: {current}");
break;
case "MyViewPage2":
CrossToastPopUp.Current.ShowToastMessage($"Trigger was pressed from: {current}");
break;
default:
break;
}
}
});
}
}