2016-04-26 40 views
1

我正在爲基於CM12.1的我的碩士論文定製一個android。在application.onCreate()中發送BroadcastIntent導致永遠啓動

自定義ROM的用例是捕獲任意應用程序的使用情況數據,例如,啓動,關閉和調用不同的系統資源。所有這些都應該在正常使用手機時發生。目前我想使用Application類,以便它在onCreate()方法中發送廣播意圖。

[...] 
class Application extends ContextWrapper implements ComponentCallbacks2 { 
[...] 
public void onCreate() { 
    // fire intent for capturing 
    Bundle bundle = new Bundle(); 
    if (mLoadedApk != null) { 
     bundle.putString("PACKAGE_NAME", mLoadedApk.getApplicationInfo().packageName); 
     bundle.putLong("CREATION_DATE", System.currentTimeMillis()); 
    } 
    Intent intent = new Intent(Intent.ACTION_START_APP) // custom action added to Intent.java 
     .putExtras(bundle); 
    getApplicationContext().sendBroadcastAsUser(intent, android.os.Process.myUserHandle()); 
} 
[...] 
} 

這樣我可以登錄的確切時間的應用程序啓動時,但遺憾的是我的做法的結果是設備不再啓動。在自定義圖像閃爍並啓動後,我被卡住在氰引導動畫(這是動畫,它不凍結)。工作映像離開動畫並在大約2分鐘後啓動android(也是閃存後首次啓動),但是具有自定義Application.java的我的ROM仍然在大於15分鐘後顯示啓動動畫。

我知道定期使用ActivityManager檢查運行的應用程序是可能的,但由於這是不準確的,並且會阻止CPU進入省電模式,所以我想使用這種方法。

如果我註銷sendBroadcast,一切正常。所以我想問題是ActivityManagerNative沒有運行,但我不確定這一點。

由於我無法用adb獲取日誌,我不知道在哪一點/爲什麼引導失敗。

你能告訴我如何檢查發送請求的所有先決條件是否滿足? 替代方案只有當設備啓動過程完成並掃描我相應的BroadcastReceiver中的所有打開的應用程序時,我纔可以發送我的意圖,但我不知道如何(或者即使有可能)檢查啓動過程是否完成。

在此先感謝。

回答

0

好的,我可以解決這個問題。

幸運的是,android也想知道系統何時啓動。 類ActivityManagerService有一個finishBooting()函數,它設置一個標誌mCallFinishBooting。因此,爲該標誌添加吸氣劑是解決方案的一部分。我還將此吸氣器添加到IActivityManager界面。剩餘的問題是ActivityManagerProxy(可以在ActivityManagerNative.java中找到),它實現了接口但沒有finishBooting()方法。

一些測試顯示ActivityManagerProxy未在啓動過程中使用,所以此處的getter始終返回true。

因此,通過使用下面的代碼,我可以在啓動過程結束後,在應用程序啓動時爲每個應用程序發送廣播。我不確定是否真的有必要檢查null

if (ActivityManagerNative.getDefault() != null && ActivityManagerNative.getDefault().isCallFinishBooting()) 
     getApplicationContext().sendBroadcastAsUser(intent, android.os.Process.myUserHandle()); 
相關問題