Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get current activity from Application.Context - MonoAndroid

I am currently developing an application using Xamarin.Forms that will be available on the Android and iOS platforms. When the application is first loaded on device, I check to see if there is an internet connection available on the device. I want to display a dialog box if an internet connection is not available.

Here is the following snippet of code I am using to check the internet on the Xamarin.Forms.ContentPage

if(App.Connectivity.IsNetworkConnectivityAvailable())
{
    App.Notification.DisplayLocalNotifications("No Internet", "You need an internet connection to access certain application content");
}

I am using dependency injection to build the appropriate module for handling dialog boxes for each appropriate environment. The Android is throwing the following exception

Android.Views.WindowManagerBadTokenException: Unable to add window -- token null is not for an application Here is the code for the DisplayLocalNotification method on the Android:

public void DisplayLocalNotification(string title, string content)
{        
     AlertDialog.Builder builder = new AlertDialog.Builder(Application.Context)
          .SetTitle(title)
          .SetMessage(content)
          .SetCancelable(true)
          .SetPositiveButton("OK", (EventHandler<DialogClickEventArgs>) null);

      AlertDialog alert = builder.Create();
      alert.Show();

      var okBtn = alert.GetButton((int)DialogButtonType.Positive);

      okBtn.Click += (sender, args) =>
      {
           alert.Dismiss();
      };
}

After doing some research, I need to get pass the current activity to the AlertDialog.Builder constructor instead of the Application.Context. How do I get the current activity object from the application context when you need to the activity outside of the activity context?

like image 440
Michael Kniskern Avatar asked Sep 01 '14 21:09

Michael Kniskern


People also ask

How do I get running activities on Android?

There's an easy way of getting a list of running tasks from the ActivityManager service. You can request a maximum number of tasks running on the phone, and by default, the currently active task is returned first. Once you have that you can get a ComponentName object by requesting the topActivity from your list.

What is the difference between applicationContext and activity context?

Application Context: It is the application and we are present in Application. For example - MyApplication(which extends Application class). It is an instance of MyApplication only. Activity Context: It is the activity and we are present in Activity.

Can I start an activity with application context?

In order to call startActivity with application context, include the flag FLAG_ACTIVITY_NEW_TASK. Also think about changing the name from context to appContext so it is clear which context you expect.


Video Answer


1 Answers

Xamarin.Forms Android platform code should assign the current Activity into Forms.Context property. This is the static Forms class and if you debug it you will see that the Forms.Context is an Activity.

public static class Forms
{
    public static Context Context { get; }
    public static bool IsInitialized { get; }

    public static event EventHandler<ViewInitializedEventArgs> ViewInitialized;

    public static void Init(Activity activity, Bundle bundle);
}
like image 172
SKall Avatar answered Sep 19 '22 15:09

SKall