5

В API Документов PackageManager.DONT_KILL_APP сказать:непредсказуемое поведение, вызванное PackageManager.DONT_KILL_APP

Будьте осторожны при установке этого, поскольку изменение состояния компонентов может сделать поведение объемлющего приложения непредсказуемы.

К сожалению, они не вдаваться в подробности, что они подразумевают под непредсказуемым поведением.

В моем приложении я переключаю включенное состояние активности. Первая услуга позволяет деятельность и запускает его:

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

Если (один-топ) активности запускается снова или уничтожена она устанавливает себя diabled снова:

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

Обычно все работает отлично, но иногда объекты имеют нулевое значение в onResume(), которые создаются в onCreate() и не трогают нигде. Мне не удалось восстановить эту проблему в отладчике, но я получаю много сообщений об ошибках с помощью NullPointerExceptions в onResume(), которые невозможны, если onCreate() действительно был вызван ранее.

Тривиальный пример для этого:

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

Мой вопрос: Может ли это быть непредсказуемым поведением PackageManager.DONT_KILL_APP? Или у кого-нибудь есть другая идея, как это может произойти?

+0

Помните, что 'onDestroy' не может быть вызван, см. Http://stackoverflow.com/a/19608985/562139. Я бы переместил любую логику обслуживания состояния на 'onStop'. – scorpiodawg

ответ

0

Да, довольно много, если вы не хотите, чтобы приложение было убито, иногда система нуждается в памяти и уничтожает некоторые объекты. Само приложение все еще существует и будет только вызывать onResume(), но не имеет всех объектов, которые он создал ранее.

+1

Это объясняет мои проблемы. Знаете ли вы, есть ли какая-либо официальная документация об этом, или у вас есть какие-либо ссылки на справочную информацию, которая объясняет это поведение? Если это правильно, это поможет создать объекты в onResume вместо onCreate. Я попробую это, но, к сожалению, мне придется ждать следующего релиза, чтобы увидеть, работает ли это, потому что даже при массивном тестировании проблема никогда не появлялась на моих устройствах. –

Смежные вопросы