如何从非活动类开始活动?


74

我有一个显示一些活动的地图视图活动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()

简而言之:如何从非活动类开始活动?

Answers:


41

您的onTap替代会收到MapView,您可以从中获取Context

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

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

    // ...
}

2
当我尝试从非活动类(在同一过程中)启动活动时,出现异常:“ android.util.AndroidRuntimeException:从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志。” (我是在意图处理程序的上下文中这样做的。)
汤姆(Tom

在startActivity之前添加intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Leonardo

90

在onTap()中获得上下文后,您还可以执行以下操作:

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

1
你救了我的命!
肯蒂·托莫

14

我不知道这是否是好习惯,但是 casting a Context object to an Activity object compiles fine.

尝试这个: ((Activity) mContext).startActivity(...)


3
令人难以置信的是,这行得通。这是唯一适用于startActivityForResult()的解决方案。
SMBiggs 2012年

10
仅当上下文实际上活动时,这才起作用。例如,我认为您不能将应用程序上下文强制转换为活动。
Timmmm 2012年

Timmmm是正确的,同时ApplicationContext和Activity的BaseContext都扩展了Android.Content.Context,后者是一个抽象类
AlTaiar 2013年

9

您可以context为应用程序定义一个say ExampleContext,它将保存应用程序的上下文,然后使用它实例化这样的活动:

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

请记住,此代码是在C#我使用MonoDroid时编写的,但是我认为它与十分相似Java。有关如何创建ApplicationContext线程的外观

这就是我做我的方式 Application Class

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

        }
        public object MyObject { get; set; }
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.