使用Activity类对象创建一个Activity实例。

3

我有一个Activity类:

Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());

String activityClassName = launchIntent.getComponent().getClassName();

Class<?> activityClazz = Class.forName(activityClassName);

是否可以使用activityClazz创建此Activity的实例?如果可以,如何实现?

(我的代码是在独立的Java类中编写的,而不是在Activity或Service中。)


是的,你可以这样做。但是当你的类在同一字符串的活动类名中时,你必须指示包。显然要抛出类未找到异常。问候 - Max Pinto
你可以这样做,但没有什么好的理由去这样做。这会导致你的活动处于未初始化状态,你无法对其进行任何操作。 - njzk2
3个回答

6
从技术上讲,您可以像这样创建Activity的实例。然而,该实例将是无用的,因为其基础Context还没有设置。

规则是您绝不能自己创建Android组件(Activity, Service, BroadcastReceiver, Provider)的实例(使用new关键字或其他手段)。这些类只能由Android框架创建,因为Android会为这些对象设置底层Context并管理生命周期。

简而言之,如果您需要像这样创建Activity的实例,则您的架构有缺陷。

1

Class.forName()需要完整的限定名,即包含类的包名和类本身的简单名称。

假设包含类的包名为com.your.package,则代码应为

    String className = "com.your.package.Tab3";  // Change here
     Object obj= null;
    try {
        obj= Class.forName(className).newInstance();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

0

是的,您可以使用以下代码行获取活动上下文

Activity activity = (Activity) getContext();

我的代码在一个独立的Java类中,而不是在活动(Activity)或服务(Service)中。 - user842225
然后,您可以在Java类的构造函数中传递上下文。 - shaikhmanzoor
我可以使用 getBaseContext() 吗? - user842225
不,你不能从独立的Java类中使用getBaseContext(),所以要传递上下文。 - shaikhmanzoor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接