編輯:關於Android編程
1 今天在調試android 程序時候,發現即使程序退出了,發現還占用內存大概有15M.用MAT查看,經過多次GC操作,發現依舊是15.直覺告訴我,應該發生內存洩露了。然後利用MAT,查看Memory Leak。結果讓我很吃驚,發現是InputMethodManager。這個對象一直引用著Context。也就是Activity,導致它無法釋放內存。後來google 一下發現,
以下貼出解決辦法,希望給遇到類似情況的人,提供幫助:
@Override protected void onDestroy() { super.onDestroy(); //fix for memory leak: http://code.google.com/p/android/issues/detail?id=34731 fixInputMethodManager(); } private void fixInputMethodManager() { final Object imm = getSystemService(Context.INPUT_METHOD_SERVICE); final Reflector.TypedObject windowToken = new Reflector.TypedObject(getWindow().getDecorView().getWindowToken(), IBinder.class); Reflector.invokeMethodExceptionSafe(imm, "windowDismissed", windowToken); final Reflector.TypedObject view = new Reflector.TypedObject(null, View.class); Reflector.invokeMethodExceptionSafe(imm, "startGettingWindowFocus", view); }就是通過反射調用windowDismissed和startGettingWindowFocus。本來以為這個問題就這樣搞定了,誰知道又出現了一個更加奇葩的情況。我發現竟然還有一個更奇葩的對象:com.lflytek.speech.a.a.a。腦子懵了一下,這是啥東東?通過百度這個查詢,發現這是科大訊飛的語音識別sdk。對,腦子確實懵了。但是不對啊。這個對象怎麼生命周期那麼長。不對,肯定哪裡搞錯了。後來通過源代碼閱讀:
public RecognizerDialog(Context paramContext, String paramString) { super(paramContext); this.a = new a(paramContext, paramString); } public void setListener(RecognizerDialogListener paramRecognizerDialogListener) { ((a)this.a).a(paramRecognizerDialogListener); }這是sdk唯一能得到我應用程序的地方,其他的都是設置一些信息。難道問題就出在這個地方?對,你答對了!
表面上看起來這沒有任何問題,你看我們很多應用程序sdk不都是這麼弄的嘛,這很正常啊。沒辦法,雖然代碼混淆過了,可我為了搞清楚事情真相只能硬著頭皮去讀。通過代碼不斷的追蹤,終於發現秘密了。
在com.iflytek.speech.a.a中有一個很奇葩的私有的類成員。
private static a e=null
public static com.iflytek.speech.b b(Context paramContext, String paramString) { if (e == null) e = new a(paramContext, paramString); return e; }
以下貼出反射的代碼。
@Override public void finish() { com.iflytek.a.a.a=null; try { Class clazz=Class.forName("com.iflytek.speech.a.a"); Field field=clazz.getDeclaredField("e"); if (field.isAccessible()==false) { field.setAccessible(true); } field.set(null, null); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } super.finish(); }
看來以後用第三方sdk的時候,得注意點了,不能隨便用啊。
本文實例講述了Android編程之簡單計時器實現方法。分享給大家供大家參考,具體如下:這裡利用ContextMenu(上下文菜單),Chronometer實現簡單計數器。
效果預覽Send:Click LocationMessage: 實現1:注冊高德地圖開發者賬號,創建應用、獲取高德地圖的 appkey2: jar 包建議直接從 融雲
概述在開發過程中,經常會遇到系統中提供的控件無法滿足產品的設計需求,這時可能就需要考慮使用自定義的View來實現產品的設計細節了。對於自定義View,可以分為兩種,一種是
PS:用了一下個推.感覺實現第三方應用的推送功能還是比較簡單的.官方文檔寫的也非常的明確.學習內容:1.使用個推實現第三方應用的推送.所有的配置我最後會給一個源代碼,內部