Как я могу запустить Activity из класса non-Activity?

У меня есть активность отображения карты, которая показывает несколько OverlayItems. В методе onTap оверлея, я хочу вызвать новое действие, которое показывает это оверлейное фото как полноэкранный, например.

Когда я делаю это внутри моего класса оверлея:

Intent intent = new Intent();
intent.setClass(getApplicationContext, FullscreenView.class);
startActivity(intent);

.. он не может найти контекст приложения, так как я не вхожу в сферу действия.

Когда я добавляю метод к моей основной деятельности, скажем startFullscreen:

public static void startFullscreen() {
    if (sCurrentPhoto != null) {
        Intent intent = new Intent();
        intent.setClass(getApplicationContext(), FullscreenView.class);
        startActivity(intent);          
    }
}

Я не могу назвать getApplicationContext() и startActivity(), потому что я в статическом контексте. Однако мне нужен статический метод, чтобы вызвать его в классе Overlay, например MainView.startFullscreen().

Проще говоря: Как запустить Activity из класса non-Activity?

Ответ 1

Ваш переопределение onTap получает MapView, из которого вы можете получить Context:

@Override
public boolean onTap(GeoPoint p, MapView mapView)
{
    // ...

    Intent intent = new Intent();
    intent.setClass(mapView.getContext(), FullscreenView.class);
    startActivity(intent);

    // ...
}

Ответ 2

Как только вы получили контекст в своем onTap(), вы также можете:

Intent myIntent = new Intent(mContext, theNewActivity.class);
mContext.startActivity(myIntent);

Ответ 3

Я не знаю, хорошо это или нет, но casting a Context object to an Activity object compiles fine.

Попробуйте следующее: ((Activity) mContext).startActivity(...)

Ответ 4

Вы можете определить context для вашего приложения, скажем ExampleContext, который будет содержать контекст вашего приложения, а затем использовать его для создания экземпляра такой активности:

var intent = new Intent(Application.ApplicationContext, typeof(Activity2));
intent.AddFlags(ActivityFlags.NewTask);
Application.ApplicationContext.StartActivity(intent);

Пожалуйста, имейте в виду, что этот код написан в C#, поскольку я использую MonoDroid, но я считаю, что он очень похож на Java. Для того, чтобы создать ApplicationContext, посмотрите на thread

Вот как я сделал свой Application Class

    [Application]
    public class Application : Android.App.Application, IApplication
    {
        public Application(IntPtr handle, JniHandleOwnership transfer) : base(handle, transfer)
        {

        }
        public object MyObject { get; set; }
    }