【问题标题】:How can I start an Activity from a non-Activity class?如何从非 Activity 类启动 Activity?
【发布时间】:2011-05-16 22:35:55
【问题描述】:

我有一个显示几个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(),因为我处于静态上下文中。但是我需要静态方法来在 MainView.startFullscreen() 这样的 Overlay 类中调用它。

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

【问题讨论】:

    标签: android android-activity android-intent


    【解决方案1】:

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

    @Override
    public boolean onTap(GeoPoint p, MapView mapView)
    {
        // ...
    
        Intent intent = new Intent();
        intent.setClass(mapView.getContext(), FullscreenView.class);
        startActivity(intent);
    
        // ...
    }
    

    【讨论】:

    • 当我尝试从非活动类(在同一进程中)启动活动时,出现异常:“android.util.AndroidRuntimeException:从活动上下文外部调用 startActivity() 需要FLAG_ACTIVITY_NEW_TASK 标志。” (我在意图处理程序的上下文中执行此操作。)
    • 在startActivity前添加intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    【解决方案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(...)

    【讨论】:

    • 难以置信,这行得通。这是唯一适用于 startActivityForResult() 的解决方案。
    • 这只有在上下文实际上是一个活动的情况下才会起作用。例如。我认为您不能将应用程序上下文转换为活动。
    • Timmmm 是对的,顺便说一句,ApplicationContext 和 Activity 的 BaseContext 都扩展了 Android.Content.Context 这是一个抽象类
    【解决方案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; }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 2015-08-05
      • 1970-01-01
      相关资源
      最近更新 更多