5

Die API-Dokumentation von PackageManager.DONT_KILL_APP sagen:Unpredictable Verhalten verursacht durch PackageManager.DONT_KILL_APP

Seien Sie vorsichtig, wenn Sie diesen Satz seit Komponentenstatus zu ändern können die Anwendung enthält das Verhalten unvorhersehbar machen.

Leider gehen sie nicht ins Detail, was sie mit unvorhersehbarem Verhalten meinen.

In meiner Anwendung wechseln ich den aktivierten Status einer Aktivität. Zunächst wird ein Dienst ermöglicht es, die Aktivität und es beginnt:

getPackageManager().setComponentEnabledSetting(
    new ComponentName(MyService.this.getApplicationContext(), 
    MyActivity.class), 
    PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
    PackageManager.DONT_KILL_APP); 

final Intent launchIntent = new Intent(context, MyActivity.class); 
    launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK 
     | Intent.FLAG_ACTIVITY_CLEAR_TOP 
     | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

context.startActivity(launchIntent); 

Wenn die (single-top) Aktivität wieder gestartet wird oder zerstört sie sich wieder auf diabled setzt:

@Override 
protected void onDestroy() { 
    log.d("ON DESTROY"); 
    super.onDestroy(); 
    getPackageManager().setComponentEnabledSetting(getComponentName(), 
     PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
     PackageManager.DONT_KILL_APP); 
} 

@Override 
protected void onNewIntent(Intent intent) { 
    if (someCondition) { 
     getPackageManager().setComponentEnabledSetting(getComponentName(), 
      PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
      PackageManager.DONT_KILL_APP); 

     Intent i = new Intent(); 
     i.setAction(Intent.ACTION_MAIN); 
     i.addCategory(Intent.CATEGORY_HOME); 
     startActivity(i); 

     finish(); 
     return; 
    } 

    super.onNewIntent(intent); 
} 

Normalerweise alles funktioniert gut, aber Manchmal sind Objekte in onResume() null, die in onCreate() erstellt und nirgendwo anders berührt werden. Ich war nicht in der Lage, dieses Problem im Debugger zu rekonstruieren, aber ich bekomme viele Fehlerberichte mit NullPointerExceptions in onResume(), die unmöglich sind, wenn onCreate() wirklich vorher aufgerufen wurde.

Ein triviales Beispiel hierfür ist:

private String s; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ... 
    s = new String(""); 
    ... 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    ... 
    s.equals(""); // rarely causes NullPointerException 
    ... 
} 

Meine Frage ist: Das ist das das unberechenbare Verhalten von PackageManager.DONT_KILL_APP werden kann? Oder hat jemand eine andere Idee, wie das passieren kann?

+0

Denken Sie daran, 'onDestroy' kann nicht garantiert aufgerufen werden, siehe: http://StackOverflow.com/a/19608985/562139. Ich würde stattdessen jede Zustandsverwaltungslogik auf "onStop" verschieben. – scorpiodawg

Antwort

0

Ja ziemlich, obwohl Sie nicht möchten, dass die App getötet wird, manchmal benötigt das System Speicher und trasht einige Objekte. Die App selbst ist immer noch da und ruft nur onResume() auf, hat aber nicht alle zuvor erstellten Objekte.

+1

Das würde meine Probleme erklären. Wissen Sie, ob es offizielle Dokumente zu diesem Thema gibt oder haben Sie Links zu Hintergrundinformationen, die dieses Verhalten erklären? Wenn dies korrekt ist, würde es hilfreich sein, die Objekte in onResume statt onCreate zu erstellen. Ich werde das versuchen, aber leider muss ich auf die nächste Veröffentlichung warten, um zu sehen, ob es funktioniert, denn selbst mit massiven Tests erschien das Problem nie auf meinen Geräten. –

Verwandte Themen