从MAIN& amp;清除活动堆栈

时间:2011-03-14 06:55:11

标签: android android-activity

我开发了一个使用Soap Web Service的android 2.1应用程序。 当我的应用程序启动时,它首先检查是否存在互联网连接。

如果是,它将显示相应的活动。 如果没有,那么它将显示一个活动(NetworkErrorActivity),提供有关网络错误和所有的信息。

问题是如果没有互联网连接,它会显示NetworkErrorActivity。 现在,当用户按下按钮时,它会将用户重定向到Home。 我已经覆盖了onBackPressed方法,如下所示:

@覆盖         public void onBackPressed(){

        Intent setIntent = new Intent(Intent.ACTION_MAIN);
        setIntent.addCategory(Intent.CATEGORY_HOME);
        setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(setIntent); 
        return;
    }

按下后退按钮后,它会显示android主屏幕。 但问题是,当我再次启动相同的应用程序时,即使存在网络连接,它也会向我显示NetworkErrorActivity。无法从Main Launcher Activity启动应用程序。它总是一次又一次地向我显示相同的活动。

2 个答案:

答案 0 :(得分:1)

我使用AlertDialog(非活动)来通知用户需要网络连接,并选择将其连接到网络设置(启用移动/ Wi-Fi)连接。如果他们选择单击“取消”而我强制主要活动完成()。

检查主活动onResume()中的网络连接,如果没有连接,则调用CreateNetErrorDialog()...不能使用BACK来关闭对话框 - 只有取消会杀死主要活动。

示例...

protected void CreateNetErrorDialog(String errorMessage) {
    Log.d(TAG, "CreateNetErrorDialog() entered...");

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage(errorMessage)
    .setTitle("Unable to connect")
    .setCancelable(false)
    .setPositiveButton("Settings",
        new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                Intent i = new Intent(Settings.ACTION_WIRELESS_SETTINGS);
                startActivity(i);
            }
        }
    )
    .setNegativeButton("Cancel",
        new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                MyMainActivity.this.finish();
            }
        }
    );
    AlertDialog alert = builder.create();
    alert.show();
    Log.d(TAG, "Exiting CreateNetErrorDialog()...");
}

编辑:从AsyncTask的onPostExecute()方法调用CreateNetErrorDialog - 它在UI线程上运行(doInBackground没有)。我自己的代码示例......

private class FileDownloader extends AsyncTask<String, Void, Void> {
    private Boolean Success = false;
    private String ResultString = "";

    @Override
    protected Void doInBackground(String... params) {
        try {
            // Do whatever
        }
        catch (Exception e) { // <-- Use the correct exception type
              ResultString = "Some error message";
        }
    }

    @Override
    protected void onPostExecute(Void result) {
        if (!Success)
            CreateNetErrorDialog (ResultString);
        else
            // Do whatever
    }
}

答案 1 :(得分:0)

我不知道你想要什么,但尝试这样的事情,而不是在catch block中建立连接并编写代码,这不是一个好习惯

检查代码后的网络使用

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();

然后取决于上面代码的结果

if (ni == null)
{
      //Show you network error activity
}
else
{
    //Show some other activity
}