Get current Activity - Xamarin Android

44,326

Solution 1

Since the release of Xamarin 2.5, Xamarin.Forms.Forms.Context is obsolete. The Context can now be obtained as follows:

var currentContext = Android.App.Application.Context;

Solution 2

A better way would be to use the Standalone Current Activity Plugin or the Current Activity Property in the Xamarin Essentials Plugin. Then you could just do:

  • Standalone: CrossCurrentActivity.Current.Activity
  • Xamarin Essentials: Platform.CurrentActivity

If you do not want to use a plugin and you only have 1 Activity in your app, you could get away with assigning a static variable in MainActivity and referencing that where ever you needed it like this:

public class MainActivity : FormsApplicationActivity {
    public static Context Context;

    public MainActivity () {
        Context = this;
    }
}

If you needed Context within a custom renderer, you would want to use the Context passed into the constructor, like this:

public class MyEntryRenderer : EntryRenderer {

    private readonly Context _context;

    public MyEntryRenderer(Context context) : base(context) {
        _context = context;
    }

    // Now use _context or ((Activity)_context) any where you need to (just make sure you pass it into the base constructor)
}

The old deprecated way would be Context view = (Activity)Xamarin.Forms.Forms.Context

Xamarin automatically assigns the Activity to Forms.Context.

Solution 3

var activity = (Activity)Forms.Context;

or if you are using MainActivity

var activity = (MainActivity)Forms.Context;

Solution 4

If you are using Xamarin Essentials 1.5 or higher, then you can use Platform.CurrentActivity. This is basically the equivalent of using the CurrentActivity plugin.

Ensure you initialise this correctly as per the instructions ie. in MainActivity OnCreate add the following line

Xamarin.Essentials.Platform.Init(this, savedInstanceState);
Share:
44,326
Lexu
Author by

Lexu

Apparently, this user prefers to keep an air of mystery about them.

Updated on May 27, 2021

Comments

  • Lexu
    Lexu almost 3 years

    I am developing an portable App for Android and iOS. My current function is taking a Screenshot and use that image in the code. Therefor I have an Interface in the portable library.

    public interface IFileSystemService
    {
        string GetAppDataFolder();
    }
    

    I am taking the Screenshot also in the portable Library with the following code:

    static public bool TakeScreenshot()
        {
            try
            {
                byte[] ScreenshotBytes = DependencyService.Get<Interface.IScreenshotManager>().TakeScreenshot();
                return true;
            }
            catch (Exception ex)
            {
            }
            return false;
        }
    

    This either calls the Android or the iOS version.

    Android:

    class ScreenshotManagerAndroid : IScreenshotManager
    {
        public static Activity Activity { get; set; }
    
        public byte[] TakeScreenshot()
        {
    
            if (Activity == null)
            {
                throw new Exception("You have to set ScreenshotManager.Activity in your Android project");
            }
    
            var view = Activity.Window.DecorView;
            view.DrawingCacheEnabled = true;
    
            Bitmap bitmap = view.GetDrawingCache(true);
    
            byte[] bitmapData;
    
            using (var stream = new MemoryStream())
            {
                bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream);
                bitmapData = stream.ToArray();
            }
    
            return bitmapData;
        }
    

    The question now is to get the current Activity from my app.

  • Will Faulkner
    Will Faulkner about 7 years
    Yep! And I read your comment after posting mine originally and realising I overdid it. I have upvoted but it won't display
  • Jayden Meyer
    Jayden Meyer about 4 years
    For anyone else that may be confused if they can't seem to find Platform.CurrentActivity, make sure you are on the latest Xamarin.Essentials. I was on 1.3 and couldn't see it, upgrading to 1.5 fixed the issue.
  • James Westgate
    James Westgate about 4 years
    Xamarin Essentials now has the current activity plugin built-in, see answer below.