Laden...

Kommunikation zwischen xaml.cs file und MainActivity

Letzter Beitrag vor einem Jahr 3 Posts 879 Views
Kommunikation zwischen xaml.cs file und MainActivity

Guten Morgen.
Ich habe folgendes Problem: In meiner Xamarin:Forms App hab ich in der MainActivity einen BroadcastReceiver eingebaut, mit allem was dazugehört.


namespace AppCommunication.Droid
{
    [Activity(Label = "AppCommunication", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize )]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        public static MainActivity MainActivityInstance { get; private set; }
        Receiver rec;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);

            MainActivityInstance = this;
            rec = new Receiver();
            LoadApplication(new App());
        }
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }

        public void sendBroadcastMessage()
        {
            if (rec != null)
            {
                SendBroadcast(new Intent("com.xamarin.example.TEST"));
            }
            else
            {
                return;
            }
        }

        protected override void OnResume()
        {
            base.OnResume();
            RegisterReceiver(rec, new IntentFilter("com.xamarin.example.TEST"));
        }

        protected override void OnPause()
        {
            UnregisterReceiver(rec);
            base.OnPause();
        }
    }
}

Mein BroadcastReceiver:


namespace AppCommunication.Droid
{
    [BroadcastReceiver]
    public class Receiver : BroadcastReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            Toast.MakeText(context, "Received intent!", ToastLength.Short).Show();
        }
    }
}

Meine XAML Datei:


<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="AppCommunication.MainPage">

    <StackLayout>
        <Button Text="START"
                Clicked="OnStartButtonClicked">
        </Button>
    </StackLayout>

</ContentPage>

Dazugehörige xaml.cs Datei


namespace AppCommunication
{
    public partial class MainPage : ContentPage
    {
        
        public MainPage()
        {
            InitializeComponent();
        }

        private void OnStartButtonClicked(object sender, EventArgs e)
        {
            //Do something
        }
    }
}

Ich möchte bzw. muss in der OnStartButtonClicked Methode meiner xaml.cs Datei die SendBroadcast() Methode aus der MainActivity aufrufen.
Wie man im Code der MainActivity sehen kann habe ich es bereits mit einem statischen MainActivity Objekt versucht aber auch so ist die MainActivity im xaml.cs Bereich nicht sichtbar.
Geh ich da ganz falsch ran oder seh ich den Wald vor lauter Bäumen nicht

Danke im Vorraus

Hallo und willkommen,

ich denke, das ist ein Problem bzgl. plattformunabhängigen Code (MainPage) und plattformabhängigen Code (MainActivity).
Zum einen liegt MainActivity ja in einem eigenen Namensbereich AppCommunication.Droid als auch architekturtechnisch sollte der Zugriff nur in die andere Richtung stattfinden.
Du solltest also wie in [FAQ] Kommunikation von 2 Forms vorgehen und ein Ereignis in der MainPage erzeugen und von der MainActivity-Klasse abonnieren und empfangen (welche dann die sendBroadcastMessage-Methode aufruft).

Problem gelöst.
Habs über den DependencyService gelöst.


[assembly: Xamarin.Forms.Dependency(typeof(MainActivity))]
namespace RFID_App.Droid
{
    [Activity(Label = "RFID_App", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize )]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity, IBroadcastService
    {
        
        
        private IntentFilter intentFilter = new IntentFilter("eu.logfox.ReceiverMDE");
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            
            StartService();

            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());
        }
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }

        public void sendDMC()
        {
            try
            {
                string dmcCode = "]<!n4lkj3n4j3n4lj3n4kj3n4l3k4nk3j4nlkj34nklj3";

                Intent intent = new Intent();
                intent.SetAction("eu.logfox.ReceiverMDE");
                intent.PutExtra("DMC_CODE", dmcCode);
                Context context = Android.App.Application.Context;
                context.SendBroadcast(intent);



            }
            catch(Exception ex)
            {
                System.Console.WriteLine(ex.Message);
            }
        }
    }
}

im forms Bereich


namespace RFID_App
{
    public interface IBroadcastService
    {
        void sendDMC();
    }
}

und in der xaml.cs file:


namespace RFID_App
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private void onBtnClick(object sender, EventArgs e)
        {
            try {
                Xamarin.Forms.DependencyService.Get<IBroadcastService>().sendDMC();
            } catch(Exception ex) {
                System.Console.WriteLine(ex.Message);
            };
        }
    }
}