如何从非Activity类启动Activity?

slh*_*hck 71 android android-intent android-activity

我有一个地图视图活动,显示了一些OverlayItems.在onTap叠加方法中,我想触发一个新活动,例如,将此叠加照片显示为全屏.

当我在overlay类中执行此操作时:

Intent intent = new Intent();
intent.setClass(getApplicationContext, FullscreenView.class);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

..它无法找到应用程序上下文,因为我不在活动范围内.

当我向主要活动添加方法时,让我们说startFullscreen:

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

我不能打电话getApplicationContext()startActivity(),因为我在一个静态的背景.我需要静态方法然后在Overlay类中调用它MainView.startFullscreen().

简单地说:如何从非Activity类启动Activity?

Exi*_*ile 88

一旦你在onTap()中获得了上下文,你也可以这样做:

Intent myIntent = new Intent(mContext, theNewActivity.class);
mContext.startActivity(myIntent);
Run Code Online (Sandbox Code Playgroud)


Dan*_*ien 39

您的onTap覆盖接收MapView您可以从中获取Context:

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

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 当我尝试开始从非活动类的活动(在同一过程中)我得到一个异常:"android.util.AndroidRuntimeException:从活动上下文之外调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志." (我在意图处理程序的上下文中这样做.) (2认同)

Som*_*ent 12

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

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

  • 如果上下文实际上是*是一个活动,这只会起作用.例如,我认为您不能将应用程序上下文转换为活动. (10认同)
  • 令人难以置信的是,这是有效的.这是唯一适用于startActivityForResult()的解决方案. (2认同)

Has*_*iar 9

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

var intent = new Intent(Application.ApplicationContext, typeof(Activity2));
intent.AddFlags(ActivityFlags.NewTask);
Application.ApplicationContext.StartActivity(intent);
Run Code Online (Sandbox Code Playgroud)

请记住,这段代码是在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; }
    }
Run Code Online (Sandbox Code Playgroud)