Soll ich android: process = ": remote" in meinem Receiver verwenden?

73

Ich habe einen BroadcastReceiver, der von Zeit zu Zeit aufgerufen wird, und ich habe festgestellt, dass viele Leute ihn verwenden

android: process =":remote" 

in ihrem Empfänger. Meins wird verwendet, um ein paar Dinge zu überprüfen und wenn die Bedingungen übereinstimmen, aktivieren Sie einen Alarm. Meine Frage ist, ob ich die Zeile verwenden soll, die ich oben in meinem Manifest gepostet habe. Und wenn ja, welche Vorteile hat dies?

Jason
quelle
In welchem ​​Kontext (Aktivität, Service usw.) ist der Empfänger definiert?
Pentium10
Der Empfänger wird im Manifest definiert. Er wird vom Android-Dienstprogramm AlarmManager aufgerufen.
Jason

Antworten:

168

Indem Sie Ihren Empfänger mit definieren, führen Sie Ihren Empfänger android:process=":remote"grundsätzlich in einem anderen Prozess aus (= VM). Für typische Anwendungsfälle müssen Sie dies nicht in einem anderen Prozess ausführen, und was auch immer Sie tun möchten, kann wahrscheinlich lokal (in Ihrem APK-Prozess) einwandfrei ausgeführt werden.

Der Nachteil der Verwendung android:process=":remote"besteht darin, dass Sie zusätzliche Ressourcen benötigen, um ausgeführt zu werden (in diesem Fall ein separater Prozess). Dabei handelt es sich im Grunde genommen um 2 VMs, und bei einigen Mustern wie Singletons können statische Felder nicht mehr zwischen Ihrer App und Ihrem Remotedienst geteilt werden.

Der Vorteil der Verwendung android:process=":remote"besteht darin, dass es in einigen Anwendungsfällen nützlich sein kann, einen Dienst zu starten, der nach dem Herunterfahren Ihrer Anwendung (in einem eigenen Prozess) weiter ausgeführt wird oder wenn Remoteclients gebunden werden sollen zu Ihrem Dienst. Ihr Broadcast-Empfänger blockiert den Hauptthread Ihrer Anwendung nicht, wenn er beim Aufrufen der onReceive()Methode in einem separaten Prozess ausgeführt wird (es gibt jedoch auch andere Möglichkeiten, dies zu implementieren).

Ich habe festgestellt, dass Sie für die meisten gängigen Anwendungsfälle die meiste Zeit ohne Verwendung davonkommen können android:process=":remote".

ddewaele
quelle
Darf ich fragen, wie Sie eine nicht blockierende onreceive () -Methode, die Sie erwähnen, auf andere Weise implementieren könnten? Ich habe genau dieses Szenario im Gange, eine onReceive-Methode, die tatsächlich einige Arbeit leistet, und ich vermute, dass dies einige Probleme in meiner Software verursachen könnte ...
TiGer
Es gibt einen weiteren impliziten Vorteil, der nicht erwähnt wird: Wenn Sie eine Komponente in einem separaten Prozess ausführen, müssen Sie einen neuen VM-Heap verwenden. Wenn Ihre Anwendung speicherintensive Vorgänge ausführt, kann ein separater Prozess eine Lösung sein, um Speicherfehler zu vermeiden.
Rodrigo Dias
3
Wie kommuniziert man mit einem solchen Empfänger? Ich habe versucht, über Sharedpreferences zu kommunizieren, aber das funktioniert nicht, da der Remote-Empfang die erste Kopie hat und keine, die den ursprünglichen Daten folgt
humblerookie