2015-01-06 17 views
9

Tôi đã tìm kiếm trên mạng để tìm câu trả lời này. Nhưng không tìm thấy kết quả nào. Xin lỗi tôi là một người mới trong Java & Lập trình Android.Điều gì xảy ra khi Hoạt động của tôi bị hủy khi tôi đang sử dụng IntentService với ResultReceiver

Tôi sẽ giải thích thêm về câu hỏi của mình. Giả sử Activity của tôi bắt đầu IntentService và nó chạy độc lập trong nền. Dịch vụ được "đăng ký" với hàm gọi lại của ResultReceiver để cập nhật giao diện người dùng hoạt động. Và trong khi dịch vụ đang thực hiện quy trình chạy dài, Hoạt động sẽ bị hủy. Vậy điều gì sẽ xảy ra nếu dịch vụ gửi trả lời hoặc cập nhật tiến trình cho Activity thông qua ResultReceiver?

Nguyên nhân như tôi biết, ResultReceiver cần có tham chiếu về Hoạt động.

Trong dự án của tôi, tôi bắt buộc phải phát triển ứng dụng nhắn tin video clip. Khi người dùng quay video, nó sẽ chuyển dữ liệu đến dịch vụ và dịch vụ sẽ thực hiện tải lên cũng như lưu một số thông tin vào db .. trong khi tiếp tục đăng cập nhật tiến trình lên giao diện người dùng hoạt động thông qua ResultReceiver.

Người dùng có thể thoát hoặc hủy Hoạt động theo ý muốn. Nhưng khi họ điều hướng trở lại ứng dụng/Hoạt động, nếu tải lên/tải xuống vẫn đang diễn ra, cần phải hiển thị tiến độ hiện tại ..

Ban đầu tôi nghĩ về Asynctask, nhưng cũng có vấn đề tương tự như tôi đã đề cập. Nó cần tham chiếu đến Activity Activity.

Có bất kỳ nơi nào mà tôi có thể đạt được yêu cầu mà tôi đã đề cập không? Xin lỗi vì bài đăng dài. Hy vọng ai đó có thể khai sáng cho tôi một chút và thậm chí còn tốt hơn để có một số đoạn mã. Cảm ơn rất nhiều :)

Chỉnh sửa: Tóm lại, có cách nào liên kết động Hoạt động mới được tạo với IntentService đang hoạt động để dịch vụ có thể gửi cập nhật tiến trình đến Hoạt động chính xác không?

+1

Tôi có cùng một vấn đề đây. Bạn có tìm thấy giải pháp nào để khắc phục vấn đề này không? –

+0

tôi cũng gặp vấn đề tương tự – has19

Trả lời

2

Sử dụng BroadcastReceiver trên Hoạt động của bạn và đăng ký/hủy đăng ký nó theo số onResume()onPause() tương ứng. Bạn có thể sử dụng IntentFilter để nghe số Intent từ số IntentService của mình.

Trong IntentService của bạn, tạo ra một giá trị Action for the IntentFilter và gửi một phát sóng với hành động đó khi bạn muốn cập nhật:

public static final String ACTION = "com.example.yourapp.action.ACTION_TAG"; 

private void handleResult() { 
    if (BuildConfig.DEBUG) { 
     Log.v(TAG, "handleResult"); 
    } 

    // Broadcast result 
    Intent intent = new Intent(ACTION); 
    intent.putExtra("your_extra", someValue); 
    LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 
} 

Trong bạn Activity:

private BroadcastReceiver mYourReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (BuildConfig.DEBUG) { 
       Log.v(TAG, "onReceive"); 
      } 



      Bundle bundle = intent.getExtras(); 
      if (bundle != null) { 
       // Update with content from bundle 
      } 
     } 
    }; 

    @Override 
    public void onResume() { 
     super.onResume(); 

     if (BuildConfig.DEBUG) { 
      Log.v(TAG, "onResume"); 
     } 

     // Register broadcast receiver 
     LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mYourReceiver, new IntentFilter(YourIntentService.ACTION)); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     if (BuildConfig.DEBUG) { 
      Log.v(TAG, "onPause"); 
     } 

     // Unregister broadcast receiver 
     LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mYourReceiver); 
    } 
Các vấn đề liên quan