5

Docs API PackageManager.DONT_KILL_APP powiedzieć:nieprzewidywalne zachowanie spowodowane PackageManager.DONT_KILL_APP

Bądź ostrożny, gdy ustawienie to od zmieniających stany elementów może sprawić zachowanie zawierającego aplikacji nieprzewidywalne.

Niestety, nie podają szczegółowo, co oznaczają nieprzewidywalne zachowanie.

W mojej aplikacji przełączam włączony stan działania. Pierwsza usługa umożliwia aktywność i zaczyna go:

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); 

Jeśli (single-top) działalność rozpoczęła ponownie lub zniszczone ustawia się do diabled ponownie:

@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); 
} 

Normalnie wszystko działa poprawnie, ale czasami obiekty mają wartość NULL w onResume(), które są tworzone w onCreate() i nie są nigdzie dotykane. Nie mogłem zrekonstruować tego problemu w debugerze, ale dostaję wiele raportów o błędach z NullPointerExceptions w onResume(), które są niemożliwe, jeśli onCreate() był naprawdę nazywany wcześniej.

trywialny przykład na to:

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 
    ... 
} 

Moje pytanie brzmi: Czy to może być nieprzewidywalne zachowanie PackageManager.DONT_KILL_APP? A może ktoś ma inny pomysł, jak to się może stać?

+0

Pamiętaj, że 'onDestroy' nie może zostać wywołane, zobacz: http://stackoverflow.com/a/19608985/562139. Zamiast tego przestawiłbym jakąkolwiek logikę konserwacji stanu na "onStop". – scorpiodawg

Odpowiedz

0

Tak, ale nie chcesz, aby aplikacja była zabijana, czasami system potrzebuje pamięci i przetwarza niektóre obiekty. Sama aplikacja jest nadal dostępna i wywoła tylko onResume(), ale nie ma wszystkich obiektów, które wcześniej utworzyła.

+1

To by wyjaśniało moje problemy. Czy wiesz, czy istnieje jakaś oficjalna dokumentacja na ten temat, czy też masz jakieś linki do ogólnych informacji wyjaśniających to zachowanie? Jeśli jest to poprawne, pomoże utworzyć obiekty w onResume zamiast onCreate. Spróbuję tego, ale niestety będę musiał poczekać na następne wydanie, aby sprawdzić, czy to działa, ponieważ nawet przy masowych testach problem nigdy nie pojawił się na moich urządzeniach. –