5

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?

+0

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

Trả lời

0

Có khá nhiều, bạn không muốn ứng dụng bị giết, đôi khi Hệ thống cần bộ nhớ và phát một số đối tượng. Bản thân ứng dụng vẫn ở đó và sẽ chỉ gọi onResume() nhưng không có tất cả các đối tượng mà nó tạo ra trước đó.

+1

Điều này sẽ giải thích vấn đề của tôi. Bạn có biết liệu có bất kỳ tài liệu chính thức nào về vấn đề này không hoặc bạn có bất kỳ liên kết nào đến thông tin cơ bản giải thích hành vi này không? Nếu điều này là đúng, nó sẽ giúp tạo các đối tượng trong onResume thay vì onCreate. Tôi sẽ thử điều này, nhưng thật đáng buồn tôi sẽ phải đợi bản phát hành tiếp theo để xem nó có hoạt động hay không, bởi vì ngay cả khi thử nghiệm lớn thì vấn đề không bao giờ xuất hiện trên thiết bị của tôi. –

Các vấn đề liên quan