Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.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 如何以Xamarin表单广播基于当前页面的消息_Android_Xamarin.forms - Fatal编程技术网

Android 如何以Xamarin表单广播基于当前页面的消息

Android 如何以Xamarin表单广播基于当前页面的消息,android,xamarin.forms,Android,Xamarin.forms,我有一个Xamarin表单解决方案,如下所示: Solution: |- Forms.App | |- App.cs | |- MyViewPage.xaml | |- MyViewModel.cs | | ... | |- Droid Project | |- TriggerService.cs | | ... 我在Android项目中使用了一个带有意向过滤器的广播接收器,在按下某个物理触发器时发送事件,到目前为止,这对我来说是可行的,

我有一个Xamarin表单解决方案,如下所示:

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