簡體   English   中英

從MAIN重新啟動應用程序並清除活動堆棧

[英]Starting Application Again from MAIN & Clearing the activity stack

我已經開發了一個使用Soap Web Service的android 2.1應用程序。 當我的應用程序啟動時,它首先檢查是否存在Internet連接。

如果是這樣,它將顯示相應的活動。 如果沒有,它將顯示一個Activity(NetworkErrorActivity),其中提供有關網絡錯誤和所有錯誤的信息。

問題是如果沒有互聯網連接,它會向我顯示NetworkErrorActivity。 現在,當用戶按下“后退”按鈕時,它將用戶重定向到“主頁”。 我已經像這樣重寫了onBackPressed方法:

@Override 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。 無法從主啟動器活動中啟動應用程序。 它總是一次又一次地顯示相同的活動。

我使用AlertDialog(不是Activity)來通知用戶有關需要網絡連接的信息,並帶有將其轉到網絡設置(啟用移動/ Wi-Fi)連接的選項。 如果他們選擇單擊“取消”,則我將主要活動強制為finish()。

檢查主要活動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
    }
}

我不確切知道您想要什么,但是嘗試這樣的方法,而不是建立連接並在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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM