9

Es scheint eine sehr wichtige Änderung in der Art und Weise zu geben, wie ACTION_BOOT_COMPLETED in der neuesten Android-Version gesendet wird. In JB 4.3 wurde der Boot-Complete-Broadcast parallel verarbeitet. Wo wie in KK 4.4.2 wird es seriell verarbeitet. Dies verzögert den Start von Diensten nach dem Hochfahren.boot complete broadcast seriell verarbeitet in KITKAT 4.4.2 <ACTION_BOOT_COMPLETED><ActivityManagerService.java>

KITKAT 4.4.2

JELLY BEAN 4.3

Aufgrund dieser Änderung von Google, wird mein Service Start komplett nach dem Start verzögert wird. Man kann beobachten, dass das Gerät träge wird und Audio für Touch nicht ausspielt. All das, weil die jeweiligen Dienste zu spät starten.

Auch von den Protokollen sehe ich, dass der erste Typ, der ACTION_BOOT_COMPLETED empfängt, nachdem es ausgesendet wurde, empfängt es nach 16-19 Sekunden, wo wie auf JBP dauert es kaum 10 Millisekunden für den ersten Mann im Empfänger- Warteschlange, um es zu bekommen.

Könnte jemand, der sich dieser Änderung bewusst ist, erklären, warum das gemacht wurde. Es wäre eine große Hilfe.

Vielen Dank!

+2

Da niemand kennt den Grund für diese Änderung und die Auswirkungen davon, Ausgabe auf Android Issue Tracker wurde gemeldet. Link-https: //code.google.com/p/android/issues/detail?id=66341 Ich hoffe auf eine Antwort. Danke. – theunaffectedlotus

Antwort

1

Die Änderung wurde von @hackbod gemacht, vielleicht kann sie den Grund klären.

Ihre checkin Note heißt es:

Fertig Ausgabe # 10779747: Kalender Speicher Absturz beobachtet ...

... während Sie einen neuen Benutzer von Einstellungen einrichten.

Wir können jetzt Broadcasts verzögern, wenn genug Hintergrunddienste gerade starten (immer noch 1 für schlanke Geräte, 3 für normale Geräte).

hinzufügen Absicht Flag nicht Empfänger erlauben Sendungen abzubrechen, die ich ein Problem mit dem anfänglichen BOOT_COMPLETED beheben ausgestrahlt nicht tatsächlich pss Daten zur richtigen Zeit anfordernden - es kann nun als geordnetes gesendet werden Broadcast ohne die Fähigkeit für die Empfänger es abzubrechen.

Checkin diff

0

Ja, treffe ich diese Frage jetzt. BOOT_COMPLETED ordered = true, viele Dienste laufen lange Zeit. Wenn ich alle GMS-Apps entferne, wird es OK. Weil zu viele GMS-Apps die BOOT_COMPLETED-Übertragung registrieren.

public class BootReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context arg0, Intent arg1) { 
     // TODO Auto-generated method stub 

     try { 
      Thread.sleep(10000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

Es scheint ein Fehler zu sein. Da ich eine Demo-App schreibe, um BOOT_COMPLETED wie oben zu erhalten, wird das falsche Problem erneut angezeigt.

Ich habe überprüft @ hackbod Modifikation.Ich habe keine Ahnung, außer für die Modifizierung der Reihenfolge von richtig zu falsch. Wartet auf @ hackbods Antwort!

1

Sie können versuchen, die folgen Code in Frameworks \ base \ services \ java zu ändern \ com \ android \ server \ bin \ ActivityManagerService.java (Linie 1974 um):

private ActivityManagerService() { 
......  
    mBgBroadcastQueue = new BroadcastQueue(this, "background", BROADCAST_BG_TIMEOUT, true); 
...... 
} 

aus:

mBgBroadcastQueue = new BroadcastQueue(this, "background", BROADCAST_BG_TIMEOUT, true); 

zu:

mBgBroadcastQueue = new BroadcastQueue(this, "background", BROADCAST_BG_TIMEOUT, false); 

Eine andere Lösung wird nur die ACTION_BOOT_COMPL ETED Absicht „FLAG_RECEIVER_NO_ABORT“ in finishBooting(), ActivityManagerService.java zu sein:

final void finishBooting() { 
... 
Intent intent = new Intent(Intent.ACTION_BOOT_COMPLETED, null); 
intent.putExtra(Intent.EXTRA_USER_HANDLE, userId); 
intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT); 
//add FLAG_RECEIVER_FOREGROUND to force the intent in foreground 
intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); 
...... 
}