2012-04-10 83 views
3

我有一個包含多個活動的應用程序。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或更高版本,所以我不能使用任何新功能或任何...

非常感謝您

+0

根據您希望設置的數據結構類型,您可能會更好地使用SharedPreferences類。 (http://developer.android.com/guide/topics/data/data-storage.html#pref)看似未被捕獲的按鈕有點神祕。介意發佈創建它的代碼/設置監聽器? – Turnsole 2012-04-10 14:38:32

+0

當我在Splashscreen加載設置時,我從sharedPreferences加載設置,所以我已經儘可能地使用了這些設置。不過,我也從Web服務器獲取一些數據,將其解析爲對象,並將引用直接保存在Settings類或包含在Settings類中的列表中。我可以儘可能多地使用sharedPreferences來解決一些問題,但從webservice解析的對象仍然會被擦除。 另外還有一條評論... – Knirkegaard 2012-04-10 15:32:07

+0

關於按鈕和聽衆 - 我將在OP中編輯代碼,但正如我剛從工作回來的路上嘗試它,啓動應用程序並按下回家,以及當我回到家。字體設置爲標準,並且我從一個按鈕中獲得一個錯誤,指示用戶名(從sharedPrefs中讀取,並在運行ref時保存在Settings類中)已設置爲空(已擦除)。 聽衆的工作(我的壞) - 我將編輯OP來解釋發生了什麼。 – Knirkegaard 2012-04-10 15:35:05

回答

3
  • 請勿覆蓋家庭按鍵功能。也許你會在某個地方找到可以讓你這樣做的東西。一個敬畏神的,標準擁抱的應用程序絕不會覆蓋主鍵。
  • 只需在您的清單中放入android:clearTaskOnLaunch = true即可。這將確保您每次按下啓動器圖標時都會啓動您的主要活動。

我懷疑是GC做了一段時間後,刪除我的所有變量時 設置類沒有被使用 - 從而導致所有的設置是 當用戶返回數小時後

抹去
  • 對於你的應用來說,Android並不是那麼邪惡。它可能會導致應用程序,服務以及一段時間不活動之後在後臺運行的任何內容,並且/或者需要更多的內存,但是不會在沒有變量的情況下將應用程序掛在那裏。
+0

我不會嘗試以任何方式覆蓋HOME按鈕(我讀過這種情況絕不應該這樣做),我只是在尋找一種方法來從啓動程序啓動應用程序(加載設置),每當應用程序圖標被按下。 我不確定什麼是我的設置類中的引用(僅包含靜態變量和方法),但在主屏幕上一段時間後再次打開應用程序,它們似乎消失了 - 這是怎麼回事不知道。但只有當它隱藏了一段時間後纔會發生(在下班途中嘗試,30分鐘就發生了)。如果只有1分鐘 - 一切正常 – Knirkegaard 2012-04-10 16:00:54

+0

看看我剛​​剛做出的編輯 - 不確定它是否在我腦海中,但我認爲我看到的所有錯誤都可能是由於缺少Settings類中設置的變量 – Knirkegaard 2012-04-10 16:21:39

0

我實際上這個定製的Android 2.0開發2.0。現在可以選擇更好的選項。我所做的是聲明所有活動全局,並且當您從任何地方單擊home按鈕時,我們檢查它們是否都不爲null。如果不爲null,則關閉它們並將引用設置爲null。這些活動僅在全球範圍內宣佈。只有在使用這些活動時才予以定義。

+0

該應用程序必須在Android 1.6+上運行,因此使用2.0的東西不是一種選擇。謝謝你 – Knirkegaard 2012-04-10 15:59:51

0

如果您使用的是Android 4.0或更高版本,您可以在開發人員選項中啓用「不要保留活動」。如果您沒有4.0設備,請使用仿真器。

+0

該應用必須在Android 1.6+上運行,因此使用在較新版本中實現的功能不是一種選擇。感謝壽。 我已經將此添加到OP – Knirkegaard 2012-04-10 15:56:50

+0

我認爲很可能導致應用程序在後臺崩潰的原因在4.0或1.6中相同,因此在4.0中修復它可能會將其修復爲1.6。 – Gallal 2012-04-10 18:28:13

0

你必須殺死所有的都是當前的活動對主頁按鈕的頂部和 爲做到這一點,你必須重寫,你必須寫

Intent intent = new Intent(context,login.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent); 

這個Home鍵的功能活動將清除該活動頂部的所有活動,然後按Home鍵並將其切換爲登錄活動並且如果您不想覆蓋主鍵功能,則必須在中寫入一個Androidmanifest.xml文件機器人:clearTaskOnLaunch =真從這個當過你點擊應用程序圖標將開始你的第一個活動

我推薦第二種方法是你最好的suted。

0

對於後人,在我的應用程序中,我只是加了finish();onStop()方法之後,我在那裏做的一切,它的工作魅力。