2013-01-06 24 views
0

我有一個訪問服務器的應用程序。我有很多訪問數據服務器的活動。在應用程序的不同點,我做了一個簡單的檢查來驗證兩件事情,1)有互聯網連接和2)服務器不處於維護模式或關閉。如果是,我顯示一個活動,詳細說明爲什麼以及何時服務器將會備份。如何從任何點退出應用程序。

當用戶在此「服務器已關閉」活動中單擊時,我需要退出該應用程序。我試過下面的代碼/意圖調用「Server Down」活動,但它不起作用。

Intent i = new Intent(this, ServerMaintenanceActivity.class); 
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(i); 

我到處都找過,這是面對人們通常在登錄/註銷屏幕一個非常普遍的問題。我找到的解決方案都不適合我。我知道這是可能的,因爲我有適用於Spotify的應用程序。

任何想法?謝謝。

回答

2

每當你開始一個活動,您可以創建新的ResultReceiver然後把它變成一個列表,在一個全球性的輔助類。然後,在您的通知活動中(告訴用戶「服務器已關閉」),請覆蓋onDestroy()併發送完成其他請求的請求。

例如:

  • Helper類:

    public static final int REQUEST_FINISH = 1; 
    
    private static final List<ResultReceiver> mClients = new ArrayList<ResultReceiver>(); 
    
    public static void registerClient(ResultReceiver receiver) { 
        mClients.add(receiver); 
    } 
    
    public static void unregisterClient(ResultReceiver receiver) { 
        mClients.remove(receiver); 
    } 
    
    public static void finishApp() { 
        for (ResultReceiver client : mClients) 
         client.send(REQUEST_FINISH, null); 
    } 
    
  • 其他活動:

    private ResultReceiver mCommandHandler; 
    
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
    
        // ... 
    
        mCommandHandler = new ResultReceiver(null) { 
    
         @Override 
         public void onReceiveResult(int resultCode, Bundle resultData) { 
          if (resultCode == Helper.REQUEST_FINISH) { 
           // do some other stuffs... 
    
           finish(); 
          } 
         } 
        }; 
    
        Helper.registerClient(mCommandHandler); 
    }// onCreate() 
    
    @Override 
    protected void onDestroy() { 
        super.onDestroy(); 
        Helper.unregisterClient(mCommandHandler); 
    } 
    
  • 通知活動:

    @Override 
    protected void onDestroy() { 
        super.onDestroy(); 
        Helper.finishApp(); 
    } 
    
+0

極好的示例,以及執行此操作的最佳方法。謝謝。 –

+0

除了現在當我試圖實現它.. ResultReceiver的構造函數需要Handler作爲參數。這在上面的代碼中似乎沒有。 –

+0

@ToddPainton謝謝。我錯過了。在你的情況下,你可以通過'null'。 – 2013-01-09 00:05:22

0

在開始ServerMaintenanceActivity之前,先完成當前的一個,所以當你按下Back時,它應該從堆棧中移除。

//... 
startActivity(i); 
finish(); 
+0

是的,我真的這樣做。問題是......可能會有5個活動的堆棧,所以我只是傳遞給下一個堆棧... –

0

刪除Intent.FLAG_ACTIVITY_NEW_TASK。如果您使用NEW_TASK標誌開始新活動,它將啓動新任務。你不想要新的任務,你想清除所有當前的任務活動堆棧。因此請移除FLAG_ACTIVITY_NEW_TASK。 P.S.以這種方式關閉所有活動並不是最好的解決方案,ResultReceiver更好。