我有一個包含多個活動的應用程序。Android - 按住HOME時如何殺死所有活動?
目前整個應用程序包含約8個活動。首先,我將顯示啓動畫面幾秒鐘,其中所有首選項都被加載並設置(來自sharedPreferences) - 這些保存在我爲此設置的「設置」類中 - 這個類基本上只有一堆靜態變量,所以應用中的所有活動都可以讀取並根據需要進行修改。
編輯:更多的數據獲得存儲在這個類的應用程序運行,一些這是一個Web服務 - 數據解析成obejcts和引用這些obejcts保存在設置類太(或對象列表)。
我的問題是,當用戶按下HOME鍵時,當前活動放在後臺。如果活動長時間處於後臺(很多用戶通過按回家而不是後退關閉應用程序),然後重新打開它顯示在按下HOME之前運行的活動。
作爲一個例子 - 可以說用戶啓動應用程序,看到啓動屏幕幾秒鐘。啓動畫面然後開始一個新的活動並自行完成。
這意味着現在Activity棧只是MainActivity(主菜單)。在MainActivity中,我使用onCreate方法爲所有按鈕提供偵聽器,並且大多數按鈕都需要上述Settings類中的一些信息。
當我在幾小時後按HOME並重新打開應用程序時,沒有任何按鈕可以工作 - 看起來圖形反應等,但仍然出現問題。即使所有設置都被擦除,其中一個按鈕應該可以工作,只需打開一個對話框,其中包含一些文本。
監聽器:
Button b = (Button)v.findViewById(R.id.id_b1);
b.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Dialog dialog = createDialog(MainActivity.this, DIALOG_CONST1);
dialog.show();
}
});
我有一些constantst的對話框類型,因爲我使用的對話框我創建了一個類來創建對話框我一些定製設計。
從包含按鈕活性(簡化的一個位):
public static Dialog createDialog(final Context c, int dialogId) {
Dialog dialog = null;
CustomDialog.Builder customBuilder;
switch (dialogId) {
...
case d1:
customBuilder = new CustomDialog.Builder(c, DIALOG_CONST1);
//Sets up the parapters to create the dialog afterwards
customBuilder.setTitle("Header").setMessage("Content")
.setPositiveButton("", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
dialog = customBuilder.create(); //Creates the dialog from the above settings
dialog.setCanceledOnTouchOutside(true);
break;
...
}
... //Set the width of the dialog
return dialog;
}
的CustomDialog類擴展對話框類,然後依賴於常量其附帶它 小號膨脹的幾個對話佈局之一,並增加了內容等。通常很好地工作,但在應用程序被HOME暫停一段時間後,出現問題,當按下按鈕時不會顯示對話框。我在其他按鈕上加載了一個對話框,但之後沒有任何反應 - 沒有顯示對話框。奇怪的是,如果我再次按下屏幕中間的按鈕,我不能按下它(grahics不反應),但是當在屏幕的側面按下一次,然後在圖形的中間會反應,當外面按下對話框時,對話框會被取消,所以我想知道中間是否有一些非常纖細的「透明」對話框 - 我只是不知道爲什麼會出現這種情況。
編輯:實際上查看我保存在Settings類中的變量我看到我確實保存了屏幕像素的寬度和高度。用於將自定義對話框的寬度設置爲屏幕寬度的特定百分比的寬度。如果設置被擦除,這也許可以解釋爲什麼我沒有看到任何對話框,因爲寬度設置爲0 ...我真的不能看到發生了什麼,如果它不是所有我的變量在設置類被擦除 - 一切都確實指向了這一點。
dialog.getWindow().setLayout(Settings._widthpx - (Settings._widthpx/5), dialog.getWindow().getAttributes().height); //Width = 80%
其實我不得不承認,我不知道是什麼導致了這一點,因爲我對Android比較陌生。我懷疑GC在一段時間內沒有使用Settings類時會刪除所有變量 - 導致用戶在幾個小時後返回時擦除所有設置。然而,這並不能解釋爲什麼按鈕不起作用(其中一個不需要設置)。
該主要活動可以啓動其他活動,並且這些活動可以再次啓動新的活動。
我認爲我所有的問題都可以解決,如果我可以在按下HOME時強制關閉整個應用程序,從而強制它在按下圖標時從頭開始 - 迫使聽衆按鈕和要加載的設置。
我在這裏閱讀關於「android:clearTaskOnLaunch」,「android:launchMode」和「android:finishOnTaskLaunch」,但我不太清楚如何使用這些正確的。
任何人都可以向我解釋爲什麼按鈕不起作用,或者當應用程序在後臺運行一段時間後,Settings Settings類中的變量可能會發生什麼,或者可能會給我一些好的提示如何正確使用「活動」設置。
編輯:該應用程序將運行Android 1.6或更高版本,所以我不能使用任何新功能或任何...
非常感謝您
根據您希望設置的數據結構類型,您可能會更好地使用SharedPreferences類。 (http://developer.android.com/guide/topics/data/data-storage.html#pref)看似未被捕獲的按鈕有點神祕。介意發佈創建它的代碼/設置監聽器? – Turnsole 2012-04-10 14:38:32
當我在Splashscreen加載設置時,我從sharedPreferences加載設置,所以我已經儘可能地使用了這些設置。不過,我也從Web服務器獲取一些數據,將其解析爲對象,並將引用直接保存在Settings類或包含在Settings類中的列表中。我可以儘可能多地使用sharedPreferences來解決一些問題,但從webservice解析的對象仍然會被擦除。 另外還有一條評論... – Knirkegaard 2012-04-10 15:32:07
關於按鈕和聽衆 - 我將在OP中編輯代碼,但正如我剛從工作回來的路上嘗試它,啓動應用程序並按下回家,以及當我回到家。字體設置爲標準,並且我從一個按鈕中獲得一個錯誤,指示用戶名(從sharedPrefs中讀取,並在運行ref時保存在Settings類中)已設置爲空(已擦除)。 聽衆的工作(我的壞) - 我將編輯OP來解釋發生了什麼。 – Knirkegaard 2012-04-10 15:35:05