2011-05-17 41 views
0

我希望我的應用能夠在預安卓2.0操作系統(即1.5和1.6)上運行。我需要在2.0及更高版本中包含Activity.onAttachedToWindow()。我如何使用反射(或任何其他方法)使我的應用程序工作在2.0以前的Android操作系統上運行?如何在Activity.onAttachedToWindow()上使用反射

+0

你是什麼意思下「有」?你想調用這個方法還是重寫它? – inazaruk 2011-05-17 19:06:08

+0

另一方面,我建議在投入1.5/1.6支持之前考慮三次。只有大約5%的活躍用戶,但你的代碼變得難以支持。作爲另一種選擇,您可以堅持1.6,並保持1.5(約2.3%的用戶)。 – inazaruk 2011-05-17 19:08:25

+0

我的意思是我需要重寫它。這是一種奇怪的情況,因爲我不是那個調用它,所以我不知道如何反射可以在這裏發揮作用... – user645402 2011-05-18 02:14:55

回答

1

ActivityonAttachedToWindow爲空。這意味着您可以避免撥打super.onAttachedToWindow。所以,最簡單的方法是:

@Override 
public void onAttachedToWindow() 
{ 
    Log.e("TEST", "onAttachedToWindow");    
} 

Android操作系統將調用onAttachedToWindow在API級別5+(2.0+)。而在1.5/1.6這個功能從來沒有被調用過。


如果你想通過反射來調用執行onAttachedToWindow從超類:

@Override 
public void onAttachedToWindow() 
{ 
    Log.e("TEST", "onAttachedToWindow"); 

    /* calling: 
    * super.onAttachedToWindow(); 
    */ 
    Class<?> activityClass = (Class<?>)getClass().getSuperclass(); 
    try 
    { 
     Method superOnAttachedToWindow = activityClass.getMethod("onAttachedToWindow"); 
     superOnAttachedToWindow.invoke(this); 
    } 
    catch(InvocationTargetException ex) 
    { 
     //TODO: add exception handling 
    } 
    catch(IllegalAccessException ex) 
    { 
     //TODO: add exception handling; 
    } 
    catch(IllegalArgumentException ex) 
    { 
     //TODO: add exception handling 
    } 
    catch(NoSuchMethodException ex) 
    { 
     /* you are here if `onAttachedToWindow` does not exist */   
    } 

} 
+0

應該是:superOnAttachedToWindow.invoke(activityClass); 否則我得到一個堆棧溢出... – user645402 2011-05-23 22:56:06

+0

@ user645402我認爲將其更改爲'activityClass',這意味着將'Class'作爲'this'傳遞給'onAttachedToWindow',並沒有真正的幫助,你可能得到了'IllegalArgumentException '你沒有登錄。 – TWiStErRob 2014-12-10 12:45:36

+0

@inazaruk我認爲他是對的,反射在這裏沒有幫助,因爲'invoke'的文檔說:「*反射方法調用遵循通常的方法查找過程。*」這意味着它是多態的,因此調用你的覆蓋,而不是'super',請參閱http://stackoverflow.com/q/5411434/253468;但是您可以使用反射來檢查是否存在'super.onAttachedToWindow()',如果沒有引發'NoSuchMethodException',則將其稱爲正常方式。 – TWiStErRob 2014-12-10 12:49:44