最近做一個應用,log一直在打印
GC_CONCURRENT freed 433k,7% free 7975K/8564K,paused 12ms+4ms, total 70ms
類似這樣的信息。
這個應用在一直使用的情況下是沒有問題的,可是鎖屏大概1分鐘之後再回來,一種情況是應用直接沒有響應了,另一種情況是等很久(大概10秒左右)又能響應,等它能響應回來後,又可以正常工作了。
真是不知道是怎麼回事,從log信息看到雖然UI上面沒有響應,可是後台的service還在正常工作的。
是內存洩露嗎?因為從上面的GC_CONCURRENT
看出,我只有7%的內存是free的,還是什麼別的原因引起的?
另外還有一個問題,就是我用一個繼承Application的類來管理activity的退出,在點擊退出按鍵的時候調用
public void exit() {
Log.e(TAG, "exit in myapplication");
for (Activity activity : activityList) {
Log.e(TAG, activity.getLocalClassName()+ " finish");
activity.finish();
}
System.exit(0);
}
這個函數,可是發現執行finish()方法後activity的onDestroy方法並沒有被調用,這是怎麼回事啊?
你的應用鎖屏後無響應是內存洩漏造成的。
鎖屏之後不代表應用退出了,一般在鎖屏時將應用設置為後台運行會更好,試試saveInstanceState
和onPause
。
對於android來說一般不鼓勵應用退出,這和手機型號也有一些關系。
補充:
重寫onSaveInstanceState,(savedInstanceState包),然後設置需要的應用狀態參數值。
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
// Save UI state changes to the savedInstanceState.
// This bundle will be passed to onCreate if the process is
// killed and restarted.
savedInstanceState.putBoolean("MyBoolean", true);
savedInstanceState.putDouble("myDouble", 1.9);
savedInstanceState.putInt("MyInt", 1);
savedInstanceState.putString("MyString", "Welcome back to Android");
// etc.
}
包本質上一個存儲NVP(屬性名-值對應)的方法地圖,並且會傳遞到你提取值的onCreate
和onRestoreInstanceState
:
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// Restore UI state from the savedInstanceState.
// This bundle has also been passed to onCreate.
boolean myBoolean = savedInstanceState.getBoolean("MyBoolean");
double myDouble = savedInstanceState.getDouble("myDouble");
int myInt = savedInstanceState.getInt("MyInt");
String myString = savedInstanceState.getString("MyString");
}
這種方法也可以用到存儲應用實例值上面,比如未保存的文本。
看看這個鏈接:SavingPersistentState
兩個方法的文檔說明鏈接:
onCreate
onSaveInstanceState