2012-02-13 32 views
6

Có cách nào để ngăn Dịch vụ của tôi tự động được khởi động lại bởi ActivityManager sau khi "treo" không? Trong một số tình huống, tôi buộc phải giết dịch vụ của mình khi thoát chương trình, nhưng không muốn Android tiếp tục khởi động lại nó.Android: Cách ngăn dịch vụ khởi động lại sau khi bị lỗi?

+1

Hiển thị việc triển khai bộ xương của dịch vụ. –

+0

Đây có phải là Dịch vụ thông thường hoặc IntentService không? –

Trả lời

1

Dịch vụ của bạn có thể lưu trữ một giá trị trong SharedPreferences. Ví dụ bạn có thể lưu trữ một cái gì đó như thế này mỗi khi dịch vụ của bạn bắt đầu: cửa hàng ("serviceStarted", 1);

Khi dịch vụ của bạn chấm dứt quy định (bạn gửi tin nhắn để làm như vậy), bạn ghi đè giá trị này: lưu trữ ("serviceStarted", 0);

Khi lần sau dịch vụ của bạn tự khởi động lại, nó phát hiện giá trị serviceStarted là "1" - điều đó có nghĩa là dịch vụ của bạn không bị ngừng và sẽ tự khởi động lại. Khi bạn phát hiện dịch vụ này, dịch vụ của bạn có thể gọi: stopSelf(); để tự hủy.

Để biết thêm thông tin: http://developer.android.com/reference/android/app/Service.html#ServiceLifecycle

30

Hành vi này được xác định bởi giá trị trả về của onStartCommand() trong việc thực hiện Service của bạn. Hằng số START_NOT_STICKY yêu cầu Android không khởi động lại dịch vụ nếu nó đang chạy trong khi quá trình này bị "giết". Nói cách khác:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // We don't want this service to continue running if it is explicitly 
    // stopped, so return not sticky. 
    return START_NOT_STICKY; 
} 

HTH

+3

Mặc dù không được đánh dấu là giải pháp được chấp nhận, đây là câu trả lời đúng – scooterman

+0

Nó sẽ không hoạt động nếu có ý định nổi bật. Tôi có vấn đề đó và cách tiếp cận trên không hoạt động. Cách tiếp cận dưới đây có thể là một lựa chọn tốt hơn nhưng tôi chưa thực hiện nó. Đã thử các cách tiếp cận khác được đề xuất trong ngăn xếp tràn nhưng chúng chưa thành công. –

+0

@BrianReinhold vấn đề của bạn có vẻ như nó có một twist cụ thể về câu hỏi này, bạn đã đăng một trong những của riêng bạn giải thích trường hợp sử dụng của bạn và các vấn đề bạn đã quan sát? Tôi muốn được quan tâm để xem xét nó nhiều hơn nữa. – Devunwired

5

Đây là giải pháp tôi đã đưa ra trong trường hợp nó có thể giúp người khác. Ứng dụng của tôi vẫn khởi động lại ngay cả với START_NOT_STICKY. Vì vậy, thay vào đó tôi kiểm tra xem mục đích là null có nghĩa là dịch vụ đã được khởi động lại bởi hệ thống.

@Override 
public int onStartCommand(@Nullable Intent intent, int flags, int startId) { 
    // Ideally, this method would simply return START_NOT_STICKY and the service wouldn't be 
    // restarted automatically. Unfortunately, this seems to not be the case as the log is filled 
    // with messages from BluetoothCommunicator and MainService after a crash when this method 
    // returns START_NOT_STICKY. The following does seem to work. 
    Log.v(LOG_TAG, "onStartCommand()"); 
    if (intent == null) { 
     Log.w(LOG_TAG, "Service was stopped and automatically restarted by the system. Stopping self now."); 
     stopSelf(); 
    } 
    return START_STICKY; 
} 
+0

Cảm ơn! Tôi có yêu cầu tìm nạp các cập nhật vị trí thường xuyên và gửi nó đến máy chủ từ dịch vụ. thông báo dựa trên dịch vụ nền trước, nhưng nó ngừng nhận cập nhật vị trí, bất cứ khi nào ứng dụng đóng lại. Sau 2 ngày đấu tranh, tôi đã đến câu trả lời của bạn và chỉnh sửa mã của bạn trước khi 'stopSelf()', tôi cấu hình khởi động lại cùng một dịch vụ bằng cách sử dụng 'AlarmManager' sau chậm trễ nói 10 giây ngay bây giờ.Và, điều này làm việc rất tốt, bây giờ nhận được cập nhật vị trí từ dịch vụ liên tục. Cảm ơn rất nhiều! – manoj

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