2011-04-20 135 views
2

首先,我將解釋我處於我的應用程序中的情況,然後討論我的主要問題。首先,我想知道我處理活動的方式是否是處理活動的正確方式,因爲我認爲這可能不會導致我的問題。Android:處理活動的正確方法

目前我有3個活動設置。 Main.class,Login.class和Display.class。主要活動根本沒有任何關聯的UI,它啓動其他活動。因此,啓動應用程序時啓動的第一個活動是Main活動,它會從SharedPreferences存儲中讀取並讀取用戶是否登錄。如果它們未登錄,它將打開Login。類,如果他們已經登錄,它會打開Display.class(兩者都有與之關聯的UI)。它使用startActivityForResult()。

由於我決定去處理活動,我需要重寫Login.class和Display.class上的後退按鈕:否則,它將返回到Main.class,並重新運行啓動活動序列,它將重新啓動剛剛運行的活動(因此後退按鈕無用)。所以,我覆蓋了後退按鈕發回一個-1的整數,然後完成()當前活動。我重寫了Main.class的onActivityResult(int,int,Intent),如果它接收到-1,它也會完成(),而不是試圖重新啓動活動。

現在,這一切都爲我的需要而工作,儘管我有一種感覺,這是完全錯誤的方式來處理活動,並且這會給我以後的問題帶來麻煩。

在我的應用程序中,我決定將一個應用程序窗口小部件和一個通知放入,這兩個窗口都會在點擊時打開應用程序(通過啓動Main.class的意圖)。我已經完成了所有工作,以便它能這樣做,儘管看起來開始一個新的活動會導致問題。

會發生什麼基本上是,如果應用程序已經在運行,並且有人拉下通知並點擊它,它會打開同一應用程序的新活動。這是有問題的,尤其是我處理後退按鈕的方式:當您打開一個新按鈕並按下後退按鈕時,它將關閉新按鈕(如預期的那樣),但會將您帶回舊的按鈕。然後您可以再次按下後退按鈕並退出,但顯然我不想發佈需要按下後退按鈕兩次的應用程序。解決這個問題的最好方法是什麼?如果這是問題的主要部分,我很樂意完全改變我處理活動的方式。

謝謝, 喬希。

+0

+1有關重新思考方法的良好討論。我試圖通過在活動之上有一個Application類來解決這個問題。我在下面發佈了一個例子。 – Aleadam 2011-04-20 05:00:20

回答

1

其實你如何設置-1(這很好),然後調用finish()是完全可以接受的。我忘記了屬性值,但是如果您只想要一個Activity的單個實例,則可以在清單中設置該屬性...任務關聯或其中一個值 - 您必須查看它。

作爲替代方案,您可以覆蓋Application類並使用您自己的方法來管理應用程序狀態。把它看作主Activity的單例追蹤器。「如果它已經存在使用那個,否則創建一個新實例」。在創建主Activity時,在你新擴展的Application類中設置一個引用(當main關閉時確保你將它清空),然後檢查onCreate()再次觸發時是否有引用。如果有參考已經在那裏使用Main的實例..如果沒有,按正常進行並設置它。

深思...

+2

感謝您更改清單的建議。我最終在登錄和顯示(不是主)的標記中放置了android:launchMode =「singleTop」,它運行良好。我第一次嘗試了singleInstance,但由於某種原因,setResult停止了工作,但它們全部是相同的文檔。鏈接到Android開發文檔:http://developer.android.com/guide/topics/manifest/activity-element.html – joshhendo 2011-04-20 05:53:26

+0

是的。我不記得該屬性的名稱,但我記得讀過它。用於在Windows CE和Windows Mobile應用程序中具有類似的結果。找到它的好工作。 – BonanzaDriver 2011-04-20 05:57:30

1

我有一種感覺,我不完全理解問題的深度,所以請原諒我,如果我說的話,你已經嘗試過。

但難道你不能刪除主要和啓動顯示登錄?我的意思是,更有意義。這就是我在這裏所做的一切,當我需要輔助活動時,必須填寫主要活動的數據(顯然這是您的案例中的顯示)。當你從登錄處返回時,你可以做所有你需要的檢查。你可以允許一個「只讀」顯示,你可以提供一個對話框警告......

你會節省很多麻煩和無用的代碼的確(大多數結果/意向麪條)。

+0

起初我認爲這將是一個好方法,我認爲它仍然是。我的思路是我可以有一個Main類,它通過setResult()來處理所有事情,而不是在其他人的基礎上構建。當然,在一個小應用程序中,你的方式可能會更好。如果我重新做這個應用程序或做出另一個類似的應用程序,我可能會這樣做。謝謝! – joshhendo 2011-04-20 05:56:08

+0

不客氣。很高興你找到了一種方法來使它工作。我對singleTop,singleTask,singleInstance等方面的知識不太瞭解,所以感謝您在這裏發佈。 – davidcesarino 2011-04-20 14:52:56

1

一個可行的辦法是具有延伸Application一類,並綁定了幾個Activity秒。一個private boolean logged的值可以確定Display是否需要調用LogIn爲前景。

public class MyApp extends Application { 
    private static boolean logged = false; 
    private Activity logInActivity; 
    private Activity displayActivity; 
    public void onCreate() { 
     super.onCreate(); 
    } 
    public void setDisplayActivity (Activity act) { 
     displayActivity = act; 
    } 
    public void setLogInActivity (Activity act) { 
     logInActivity = act; 
    } 
    public void finishActivities (Activity act) { 
     activity.finish(); 
    } 
    public void setLogged (boolean logged) { 
     this.logged = logged; 
    } 
    public boolean isLogged() { 
     return logged; 
    } 
    public Activity getLoginActivity() { 
     return logInActivity; 
    } 
    public Activity getDisplayActivity() { 
     return displayActivity; 
    } 
} 

class Display extend Activity { 
    private MyApp app; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     app = (MyApp) getApplicationContext(); 
     if (!app.isLogged()) { 
      // start LogInActivity. After log in, it will call app.setLogged (true); 
     } 
     else { 
      // continue with Display; 
     } 
    } 
} 
+0

絕對不是我以前的方式。感謝您的建議,我對Android開發很陌生,所以仍然在學習活動,意圖,應用程序等方面的工作。我肯定會參考我的下一個Android應用程序。 – joshhendo 2011-04-20 05:54:35