How can I start an Activity from a non-Activity class?

AndroidAndroid ActivityAndroid Intent

Android Problem Overview


I have a map view activity that shows a few OverlayItems. In the onTap method of an overlay, I want to trigger a new activity that shows this overlay photo as a fullscreen, for example.

When I do this inside my overlay class:

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

.. it can't find an application context, as I am not in the scope of an activity.

When I add a method to my main activity, let's say startFullscreen:

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

I can not call getApplicationContext() and startActivity(), because I am in a static context. I need the static method however to call it in the Overlay class like MainView.startFullscreen().

Put simply: How can I start an Activity from a non-Activity class?

Android Solutions


Solution 1 - Android

Once you have obtained the context in your onTap() you can also do:

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

Solution 2 - Android

Your onTap override receives the MapView from which you can obtain the Context:

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

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

	// ...
}

Solution 3 - Android

I don't know if this is good practice or not, but casting a Context object to an Activity object compiles fine.

Try this: ((Activity) mContext).startActivity(...)

Solution 4 - Android

You can define a context for your application say ExampleContext which will hold the context of your application and then use it to instantiate an activity like this:

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

Please bear in mind that this code is written in C# as I use MonoDroid, but I believe it is very similar to Java. For how to create an ApplicationContext look at this thread

This is how I made my Application Class

    [Application]
    public class Application : Android.App.Application, IApplication
    {
        public Application(IntPtr handle, JniHandleOwnership transfer) : base(handle, transfer)
        {
            
        }
        public object MyObject { get; set; }
    }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionslhckView Question on Stackoverflow
Solution 1 - AndroidExileView Answer on Stackoverflow
Solution 2 - AndroidDaniel TrebbienView Answer on Stackoverflow
Solution 3 - AndroidSome Noob StudentView Answer on Stackoverflow
Solution 4 - AndroidHas AlTaiarView Answer on Stackoverflow