如何从Java类启动一个Activity?

4

我看到了一些关于如何从另一个在应用程序中实现的Java类调用Android活动的帖子,但没有解决我的问题。

我有一个连接类(Connection.java),它处理应用程序所需的永久连接。 这个类使用单例模式构建,因此每当我需要连接信息或请求某些内容时,我会执行以下操作:

final Connection conn = Connection.getConnection(getApplicationContext());
//... Some Code Here
conn.methodDoSomethingA();

接下来,我有一个TabActivity包含5个活动(A、B、C、D、E):

public class Tab extends TabActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tab);

        final Connection conn = Connection.getConnection(getApplicationContext());

        intent = new Intent().setClass(this, A.class);
        spec = tabHost.newTabSpec("A")
                .setIndicator("A", res.getDrawable(R.drawable.tab_A))
                .setContent(intent);
        tabHost.addTab(spec);

        //... same for activities B, C, D and E

        tabHost.setCurrentTab(0);
    }
}

现在,我在Connection类中有一个公共方法来结束连接 - endConnection() - 在Connection类中多次调用,例如当套接字超时或从服务器接收到自定义消息通知要结束会话时。
问题从这里开始 - 当调用endConnection()时,它必须关闭套接字,然后显示一个Activity(Theme.Dialog),通知连接已丢失。 为了实现这一点,我尝试了以下方法,但没有成功:
public class Connection {
    private static Connection connection = null;
    private Context appContext = null;

    private Connection(Context appContext) {
        this.appContext = appContext;
    }

    public static Connection getConnection(Context appContext) {
        if (connection == null)
            return connection = new Connection(appContext);
        else
            return connection;
    }

    public void endConnection() {
        // ... Close sockets and streams - SOME CODE HERE

        // Show Disconnect Dialog
        Intent myIntent = new Intent(appContext, Disconnect.class);
        myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        appContext.startActivity( myIntent );
    }
}

我尝试将TabActivity上下文作为参数传递给Connection.java类并使用它来代替appContext,但是没有成功。
我遇到了以下错误:
W/dalvikvm(9449): threadid=3: thread exiting with uncaught exception (group=0x2aaca228)
E/AndroidRuntime(9449): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime(9449): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.Disconnect}: java.lang.NullPointerException

换句话说:如何从Java类启动Activity?!

@Houcine 所有的活动都在清单文件中,如果我从另一个活动意图开始,我就可以启动它。 - Jorge
如果我理解你的代码正确,在newIntent(appContext ...)处appContext将为null。通常,Android应用程序中的网络通信在AsyncTask(或某些同样方便的异步处理实用程序,但往往更多地使用AsyncTask)中处理,其中包括回调机制(onPostExecute)向启动它的Activity。这样的模型是否适合您的目的? - Phillip Fitzsimmons
在调用“Intent myIntent = new Intent(appContext, Disconnect.class);”之前,请检查您的appContext是否为空。否则,似乎您已经熟悉如何从另一个类调用Activity。 - hovanessyan
@PhillipFitzsimmons appContext 不是 null。它作为参数传递给 Connection 构造函数中的 getApplicationContext() - Jorge
@hovanessyan 我无法捕获endConnection()代码中的空异常。我会尝试找出是什么为空。 - Jorge
显示剩余7条评论
1个回答

4

我找到了错误。

首先,感谢大家的评论。

显然我做的一切都没问题,就是这样做的!

错误是一个新手错误,让我非常尴尬:

Disconnect.java有一个监听器,监听的是Content View XML布局文件中不存在的按钮,但它存在于另一个布局文件中!

我从来没有想到过这个!太愚蠢了,不是吗!?

我希望这篇文章可以帮助大家实现以下两个目标之一:

  1. 从另一个Java类中调用活动;
  2. 在没有探索无法想象的错误的情况下不要发布问题!!!

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