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