2016-01-07 34 views
7

Tôi hiện đang viết một chương trình Android cần một số IntentService. Khi tôi đặt mã trong hàm onHandleIntent, mã không chạy, nhưng nó không cung cấp lỗi trong MainActivity. Nhưng khi tôi sao chép mã của tôi vào onStartCommand, nó chạy hoàn hảo.Android sự khác biệt giữa onHandleIntent & onStartCommand

Vấn đề là tôi muốn biết sự khác biệt giữa onHandleIntentonStartCommand là gì. Cảm ơn.

Mã sản phẩm:

Trong onHandleIntent:

System.out.println("SERVICE STARTED! ! !"); 
//System.out.println(intent.getBooleanExtra("once", Boolean.FALSE)); 
if (intent.getBooleanExtra("once", Boolean.FALSE)) { 
    Check(); 
} 
mHandler.postDelayed(mRunnable, 3000); 

Trả lời

21

Kể từ the docs:

Các IntentService nào sau đây:

  • Tạo một sợi công nhân mặc định mà thực hiện tất cả ý định được phân phối tới onStartCommand() tách biệt khỏi chuỗi chính của ứng dụng của bạn.
  • Tạo hàng đợi công việc chuyển một mục đích tại một thời điểm để triển khai onHandleIntent() của bạn, vì vậy bạn không bao giờ phải lo lắng về việc phân luồng đa luồng .
  • Dừng dịch vụ sau khi tất cả các yêu cầu bắt đầu đã được xử lý, vì vậy bạn không bao giờ phải gọi stopSelf().
  • Cung cấp triển khai mặc định onBind() trả về null.
  • Cung cấp triển khai mặc định onStartCommand() gửi mục đích đến hàng đợi công việc và sau đó thực hiện onHandleIntent() của bạn.

Và cũng:

Tất cả điều này cho biết thêm lên đến thực tế là tất cả các bạn cần làm là thực hiện onHandleIntent() để làm công việc được cung cấp bởi khách hàng. (Mặc dù, bạn cũng cần phải cung cấp một constructor nhỏ cho dịch vụ.)

Vì vậy, một IntentService là một "Custom" Service với những tính chất đặc biệt. Vì vậy, không cần phải ghi đè lên số onStartCommand(), trên thực tế, bạn không nên làm điều đó trừ khi bạn đang sử dụng lớp Service thông thường.

Một số ví dụ về IntentService sử dụng:

Activity.java

Intent it = new Intent(getApplicationContext(), YourIntentService.class); 
it.putExtra("Key", "Value"); 
startService(it); 

YourIntentService.java

public YourIntentService() { 
    super("YourIntentService"); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 

    if (intent != null) { 
     String str = intent.getStringExtra("key"); 
     // Do whatever you need to do here. 
    } 
    //... 
} 

Bạn cũng có thể kiểm tra this tutorial hoặc this one để biết thêm về ServiceIntentService.

Ngoài ra, hãy kiểm tra the docs.

+2

Chà, điều này cực kỳ kỹ lưỡng. Câu trả lời hay! – AdamMc331

+0

Tôi đã trải qua các hướng dẫn, chúng rất tuyệt! Nhưng vấn đề là tôi đã không 'vượt quá' onStartCommand' hoặc 'onHandleIntent'? – Chromium

+0

Bạn đã nói về câu hỏi mà bạn đã ghi đè lên 'onStartCommand', và bạn không nên làm điều đó trên' IntentService'. Sử dụng 'onHandleIntent' thay vào đó, nó sẽ tự động được gọi. – Mauker

3

onStartCommand được sử dụng khi bạn sử dụng Service. onHandleIntent nên được sử dụng thay thế khi bạn sử dụng IntentService. IntentService mở rộng Service. Và theo tài liệu hướng dẫn

"Bạn không nên ghi đè phương pháp này (onStartCommand) cho IntentService của bạn. Thay vào đó, ghi đè onHandleIntent(Intent), mà hệ thống gọi khi IntentService nhận được yêu cầu khởi động."

Nếu bạn đã ghi đè onStartCommand, đó có thể là lý do tại sao số onHandleIntent của bạn không được gọi.

+1

Nếu bạn ** ghi đè 'onStartCommand()' khi sử dụng 'IntentService', bạn sẽ không nhận được' onHandleIntent() 'được gọi sau này, ** trừ khi ** dòng cuối cùng của' onStartCommand() 'là 'return super.OnStartCommand (intent, flags, startId)'. – GeertVc

1

Bạn không được ghi đè onStartCommand() cho IntentService của mình.

Nếu bạn làm như vậy, hãy đảm bảo là return super.onStartCommand();, vì điều đó gửi ý định đến hàng đợi công việc và sau đó thực hiện onHandleIntent() của bạn.

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