2016-04-26 1 views
1

Je travaille sur un android personnalisé pour mon mémoire de master qui est basé sur CM12.1.Envoyer BroadcastIntent dans application.onCreate() entraîne le démarrage à jamais

Le cas d'utilisation de la ROM personnalisée capture des données d'utilisation pour des applications arbitraires, y compris par ex. démarrage, arrêt et appels à différentes ressources du système. Tout cela devrait arriver avec l'utilisation normale du téléphone. Actuellement, je veux utiliser la classe Application afin qu'elle envoie une intention de diffusion dans sa méthode 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()); 
} 
[...] 
} 

De cette façon, je pouvais connecter l'heure exacte quand une application démarre, mais malheureusement mes résultats d'approche dans l'appareil ne pas démarrer plus. Après avoir flashé l'image personnalisée et démarré, je suis bloqué sur l'animation de démarrage cyanogène (qui s'anime, elle n'est pas figée). Une image de travail quitte l'animation et commence Android après environ 2 minutes (aussi premier démarrage après flash), mais ma rom avec Application.java personnalisé montre encore l'animation de démarrage après> 15 minutes.

Je sais qu'il serait possible de vérifier périodiquement les applications en cours d'exécution avec ActivityManager, mais comme cela est inexact et empêcherait l'unité centrale de passer en mode d'économie d'énergie, je souhaite utiliser cette approche.

Si je décommode le sendBroadcast, tout fonctionne correctement. Donc, je suppose que le problème est que ActivityManagerNative ne fonctionne pas encore mais je suis incertain à ce sujet.

Puisque je ne peux pas obtenir les journaux avec adb je ne sais pas à quel moment/pourquoi le démarrage échoue.

Pouvez-vous me dire comment vérifier si tous les prérequis pour l'envoi de demandes sont satisfaits? Alternative Je ne pourrais envoyer mon intention que si le processus de démarrage du périphérique est terminé et analyser toutes les applications ouvertes dans mon BroadcastReceiver correspondant mais je ne sais pas comment (ou même si cela est possible) pour vérifier si le processus de démarrage est terminé.

Merci d'avance.

Répondre

0

Ok, je pourrais résoudre le problème.

Heureusement, Android veut savoir quand le système est démarré. La classe ActivityManagerService a une fonction finishBooting() qui définit un indicateur mCallFinishBooting. Donc, ajouter un getter pour ce drapeau fait partie de la solution. J'ai également ajouté ce getter à l'interface IActivityManager. Le problème restant est le ActivityManagerProxy (peut être trouvé dans ActivityManagerNative.java) qui implémente l'interface mais n'a pas de méthode finishBooting().

Certains tests ont révélé que le ActivityManagerProxy n'est pas utilisé pendant le démarrage afin que le getter retourne toujours vrai. Donc, en utilisant le code ci-dessous, je peux envoyer des diffusions au démarrage de l'application pour chaque application, une fois le processus de démarrage terminé. Je ne suis pas sûr si le chèque pour null est vraiment nécessaire.

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