Các tài liệu API của PackageManager.DONT_KILL_APP nói:hành vi không thể đoán trước do PackageManager.DONT_KILL_APP
Hãy cẩn thận khi bạn thiết lập này kể từ khi thay đổi trạng thái thành phần có thể làm cho hành vi ứng dụng chứa của không thể đoán trước.
Thật không may họ không đi vào chi tiết ý nghĩa của hành vi không thể đoán trước.
Trong ứng dụng của tôi, tôi đang chuyển trạng thái đã bật của một hoạt động. Lần đầu tiên một dịch vụ cho phép hoạt động và bắt đầu nó:
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);
Nếu (single-top) hoạt động được bắt đầu lại hoặc phá hủy nó đặt bản thân để diabled một lần nữa:
@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);
}
Thông thường tất cả mọi thứ hoạt động tốt, nhưng đôi khi các đối tượng là null trong onResume()
được tạo ra trong onCreate()
và không được chạm vào bất kỳ nơi nào khác. Tôi đã không thể tái tạo lại vấn đề này trong trình gỡ rối, nhưng tôi nhận được nhiều báo cáo lỗi với NullPointerExceptions trong onResume()
là không thể nếu onCreate()
thực sự được gọi trước đây.
Một ví dụ nhỏ cho điều này là:
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
...
}
Câu hỏi của tôi là: đây có thể là hành vi không thể đoán trước của PackageManager.DONT_KILL_APP
? Hay không ai có ý tưởng khác về việc điều này có thể xảy ra như thế nào?
Hãy nhớ rằng 'onDestroy' không được bảo đảm để được gọi, xem: http://stackoverflow.com/a/19608985/562139. Thay vào đó, tôi sẽ chuyển bất kỳ logic bảo trì trạng thái nào sang 'onStop'. – scorpiodawg