2010-10-18 38 views
14

Tôi đã đọc tài liệu Android và tôi tự hỏi liệu có ai có thể làm sáng tỏ điều gì xảy ra với dịch vụ khi bắt đầu dịch vụ với START_STICKY không. Tôi giả định rằng dữ liệu trạng thái cục bộ (các biến mẫu) cũng bị mất. Android có làm bất cứ điều gì để giúp điền lại trạng thái cục bộ khi nó tái tạo dịch vụ không?onStartCommand sau khi quá trình dịch vụ bị giết khi bắt đầu với START_STICKY

Tôi đã có một số dữ liệu được gửi đến dịch vụ trong mục đích. Trong onStateCommand(), tôi sẽ điền dữ liệu cá thể của dịch vụ dựa trên những gì đã có trong mục đích. Từ những gì tôi đã đọc trong tài liệu Android, ý định được chuyển đến onStartCommand() sẽ không có giá trị khi dịch vụ đã bị giết và khởi động lại (với START_STICKY). Điều này có nghĩa là tôi mất cả mục đích và dữ liệu thành viên của dịch vụ khi dịch vụ được tạo lại?

Trả lời

16

Khi một quá trình bị giết và tái tạo, nó sẽ trải qua toàn bộ vòng đời một lần nữa (bắt đầu tại onCreate). Tùy thuộc vào cách nó đã bị giết và làm thế nào bạn lưu dữ liệu nó có thể hoặc có thể không có sẵn cho bạn.

Để nhận được ý định trở lại, có một lá cờ cho START_REDELIVER_INTENT sẽ phân phối lại ý định.

+0

Cảm ơn bạn đã xác nhận sự nghi ngờ của mình. Tôi không biết về START_REDLIVER_INTENT (phải có phần trên của tài liệu). – adstro

+0

Cảm ơn người đàn ông, tôi đã bị sa thải bởi lỗi này trong gần một tháng ... Cuối cùng phát hiện ra hệ điều hành Android đã giết dịch vụ ... –

+0

Rất tốt. Tôi không bao giờ biết về 'START_REDELIVER_INTENT', nó chắc chắn có ích @Falmarri –

1

Android sẽ không điền lại các giá trị dữ liệu 'bị mất' khi nó khởi động lại dịch vụ của bạn để mã của bạn cần phục vụ cho sự kiện này.

Cách tiếp cận của tôi là sử dụng tất cả các biến trạng thái không nguyên thủy và để chúng là rỗng. Bằng cách đó tôi có thể kiểm tra null và thực hiện các bước thích hợp để khởi tạo chúng như và khi nào.

Tôi đã thực hiện để lưu trữ dữ liệu nhẹ mà tôi muốn duy trì trong quá trình khởi động lại ứng dụng trong tùy chọn của ứng dụng.

2

Gần đây tôi đã gặp phải vấn đề tương tự này. Dịch vụ không cung cấp phương tiện tiết kiệm được xây dựng và mục đích cuối cùng có thể không đủ để đưa dịch vụ về trạng thái trước đó của nó. Giải pháp của tôi là có trạng thái hoạt động liên tục và chuyển trạng thái đó tới dịch vụ thông qua startService(). Dịch vụ này sau đó chỉ cần bắn các sự kiện tại các hoạt động, như:

  • đây là một bản cập nhật
  • một cái gì đó đã chết và đây là ngoại lệ
  • Tôi đã bị giết chết, hãy khởi động lại tôi với bất kỳ nhà nước cần thiết

Cách tiếp cận này đã làm sạch thiết kế của tôi rất nhiều, và cả dịch vụ và hoạt động đều kiên cường để bị giết.

+2

Bạn có thể chia sẻ một số mã cho cùng một .. ?? Khái niệm có vẻ lý tưởng, nhưng không thể thực hiện nó –

1

sử dụng Bộ nhớ trong để Lưu riêng đối tượng hoặc trường của đối tượng.

public void writeToInternalStorage(String fileName,String userName) 
    { 
     try{ 
      String endOfLine = System.getProperty("line.separator"); 
      StringBuffer buffer = new StringBuffer(); 

      FileOutputStream fos = openFileOutput(fileName, Context.MODE_PRIVATE); //// MODE_PRIVATE will create the file (or replace a file of the same name) and make it private to your application. Other modes available are: MODE_APPEND, MODE_WORLD_READABLE, and MODE_WORLD_WRITEABLE. 

      buffer.append(userName.toString() + endOfLine); 
      fos.write(buffer.toString().getBytes()); 


      Log.v(TAG, "writeFileToInternalStorage complete.. " + buffer.toString()); 
      //  writer.write(userName); 

      fos.close(); 
     } 
     catch(Exception e) 
     { 
      Log.v(TAG, "Error: " + e.getMessage()); 
      ExceptionNotificationMessage("writeToInternalStorage() Error: " + e.getMessage()); 
     } 
    } 

    public String readFromInternalStorage(String fileName) 
    { 
     try{ 
      File file = this.getFileStreamPath(fileName); 
      if(file.exists() == true) 
      { 
       Log.v(TAG, "readFileFromInternalStorage File found...");  

       FileInputStream fis = openFileInput(fileName); 
       StringBuilder buffer = new StringBuilder();    
       int ch; 
       while((ch = fis.read()) != -1){ 
        buffer.append((char)ch); 
       } 

       Log.v(TAG, "readFileFromInternalStorage complete.. " + buffer.toString()); 
       fis.close(); 

       return buffer.toString(); 
      } 
     } 
     catch(Exception e) 
     { 
      Log.v(TAG, "Error: " + e.getMessage()); 
      ExceptionNotificationMessage("readFromInternalStorage() Error: " + e.getMessage()); 
     } 
     return ""; 
    } 
Các vấn đề liên quan