2017-07-19 51 views
0

該類的Android documentation有點令人困惑。從我因而被理解到目前爲止,我已經得出結論,活動開始時發生瞭解Android ActivityLifeCyleCallbacks

  • OnResume/OnPause事件對/停止對用戶交互可用。
  • OnStart/OnStop這對事件發生在活動開始/停止可見時。因爲後者意味着交互性。

如果這種理解是正確的,那麼它讓我感到事件名稱是相當想要的。 OnStart/OnStop本來可以稱爲OnVisible/OnInVisibleOnResume/OnPause本來可以稱爲OnInteractive/OnPassive

這如何與Cordova應用程序中的Window.OnPause/OnResume方法配合使用?我的假設是他們映射到相應的Android活動生命週期事件。

基於這樣的認識,我假設

  • 廣播接收機
  • 地理位置前景/背景模式開關更好地從活動週期完成的OnStart /調用OnStop事件,而不是的onResume /的onPause事件
  • 保存在內存中的數據應該放在OnPause上的文件/寫入數據庫等,以減少應用程序的內存佔用,因爲如果應用程序不是交互式的,那麼這些數據不太可能被使用。

我用這個認識創建下面的類作爲我的自定義科爾多瓦插件

import android.app.Activity; 
import android.app.Application.ActivityLifecycleCallbacks; 
import android.os.Bundle; 

public class StateMonitor implements ActivityLifecycleCallbacks 
{ 
public static int isVisible = 0; 
public static int isInFG = 0; 

public static boolean isAppInForeground() 
{Feedback.postBackInfo("In FG:" + isInFG);return isInFG > 0;} 

public static boolean isAppVisible(){return isVisible > 0;} 

public void onActivityCreated(Activity activity,Bundle bundle){} 

public void onActivityDestroyed(Activity activity){} 

public void onActivityResumed(Activity activity) 
{ 
    isInFG++; 
    Feedback.postBackInfo("Resumed:" + isInFG); 
} 

public void onActivityPaused(Activity activity) 
{ 
    isInFG--; 
    Feedback.postBackInfo("Paused"); 
} 

public void onActivitySaveInstanceState(Activity activity,Bundle outState) 
{} 

public void onActivityStarted(Activity activity) 
{Feedback.postBackInfo("started");isVisible++;} 

public void onActivityStopped(Activity activity){isVisible--;} 
} 

我開始通過發行

cordova.getActivity().getApplication(). 
registerActivityLifecycleCallbacks(new StateMonitor()); 

監測活動生命週期事件的一部分,其中Feedback是助手類我在插件內部使用,例如將消息發回我的服務器以便在我的Web瀏覽器中進行實時記錄和顯示。

從插件的

public void initialize(CordovaInterface cordova, CordovaWebView webView) 

方法。這立即引發了一個問題:

  • 這些事件不會開始射擊,當我第一次啓動該應用程序
  • 我猜她是在調用registerActivityLifecycleCallbacks是「亡羊補牢」來監視初步的OnStart /的onResume事件,因爲通過那次通話的時間 - 從Plugin.initialize - 這些事件已經「已經發生」。

我非常感謝以前曾在這裏的人,他們可能會發表評論並提供解決方案。

回答

0

我發現的唯一方法就是讓它工作,就是在Cordova應用程序的MainActivity中添加這個類。它將在你的插件之外。 沒有別的工作。

+0

你能解釋一下你如何去添加類 - 通過黑客相關的Java代碼或在運行時通過JS ...? – DroidOS

+0

是的,黑客入侵了一個Java類。 ActivityLifecycleCallbacks添加到API 14冰淇淋中。我的猜測是cordova.getActivity()。getApplication()會爲您帶來該對象的「舊」版本。 – pashakym