2012-05-18 41 views
7

Sau khi đọc hầu hết các tài liệu sẵn có trên các dịch vụ Android trên trang web của nhà phát triển và ở đây trong stackoverflow, tôi vẫn còn bối rối bởi một số khía cạnh của chạy một dịch vụ trong một nhiệm vụ riêng biệt. Hy vọng rằng ai đó có thể đưa tôi đi đúng hướng.Làm thế nào để bắt đầu nhiệm vụ nền chạy dài trong dịch vụ android

Hãy nói rằng chúng tôi có khuôn khổ dịch vụ trival như

public class HliService extends Service { 

    @Override 
    public void onCreate() { 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     // If we get killed, after returning from here, restart 
     return START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // We don't provide binding, so return null 
     return null; 
    } 

    @Override 
    public void onDestroy() { 
    } 
} 

và trong biểu hiện, tôi có

<service android:name=".HliService" android:process=":HLI_Comms"/> 

để dịch vụ chạy trong chủ đề riêng của mình.

Mục đích của dịch vụ là cung cấp tác vụ nền sẽ liên lạc với thiết bị bằng cách sử dụng ổ cắm TCP và thực hiện một số nội dung khác. Có nguy cơ bỏ qua các vấn đề về pin vv, về cơ bản tôi muốn nó chạy mãi mãi.

Something như

// Method that communicates using a TCP socket, and needs to send 
// information back to the activity and receive messages from activity 
// not shown here. 
private void dummytask() { 

    boolean keepGoing = true; 
    while (keepGoing) { 
     // do useful stuff in here 
     // sets keepGoing false at some point 
    } 
    stopSelf(); 
} 

cách tốt nhất để bắt đầu phương pháp này/nhiệm vụ là gì?

Tôi đã xem mã trong trang web dành cho nhà phát triển sử dụng trình xử lý tin nhắn và looper, mà tôi chỉ hiểu một phần, nhưng có vẻ rất phức tạp và có lẽ nhiều hơn tôi yêu cầu?

Tôi không tin tôi có thể gọi phương thức này từ onCreate() hoặc onStartCommand() kể từ đó sẽ không hoàn thành khi được gọi từ hệ thống? Tôi có nên bắt đầu nó với một bộ đếm thời gian hoặc báo động?

Tôi sẽ cần thêm trình xử lý tin nhắn để giao tiếp với hoạt động gui, nhưng vì tôi đang bắt đầu dịch vụ trong một chuỗi khác (theo hướng dẫn "quy trình"), tôi có cần sử dụng AIDL không ?

Tôi cũng đã xem xét việc sử dụng AysnchTask thay vì mở rộng Dịch vụ, nhưng có vẻ như phù hợp hơn với việc chạy tác vụ và sau đó chấm dứt.

+0

'while (keepGoing)' - nếu điều này nằm trong một luồng khác so với chuỗi đặt 'keepGoing' thành false' keepGoing' PHẢI LÀ 'bay hơi' - hãy đọc trên mô hình bộ nhớ Java –

+0

Vui lòng xem câu trả lời này có thể giúp bạn . [nhập liên kết mô tả ở đây] [1] [1]: http://stackoverflow.com/a/13783477/2165080 –

Trả lời

2

để dịch vụ chạy theo chủ đề riêng.

Điều đó đặt dịch vụ vào quy trình riêng của mình. Điều này thường là một cái gì đó để tránh, vì nó tiêu thụ thêm RAM và CPU (cho IPC). Bạn có thể tạo một chủ đề chỉ bằng cách tạo ra một Thread hoặc bất kỳ số phương tiện nào khác, hầu hết trong số đó đã ở Java trong một thập kỷ hoặc lâu hơn.

Có nguy cơ bỏ qua các vấn đề về pin, v.v. về cơ bản tôi muốn nó chạy vĩnh viễn.

Dịch vụ chạy mãi mãi là không thể. Người dùng hoặc hệ điều hành sẽ loại bỏ dịch vụ của bạn cuối cùng.

Cách tốt nhất để bắt đầu phương pháp/nhiệm vụ này là gì?

Gọi dummytask() từ chủ đề nền.

tôi có cần sử dụng AIDL không?

số dịch vụ của bạn có thể phát sóng một Intent, hoặc gọi một PendingIntent được cung cấp bởi các hoạt động, hoặc gửi một Message qua một Messenger được cung cấp bởi các hoạt động, vv tốt nhất là nên sử dụng LocalBroadcastManager từ hỗ trợ Android gói, nhưng điều đó sẽ không hoạt động trên các ranh giới quy trình, buộc bạn vào các tùy chọn liên lạc đắt tiền hơn.

+0

Ok - nhờ @CommonsWare. Tôi cũng đã xem xét phương pháp đó, nhưng tôi cũng không chắc chắn về các khía cạnh nhất định trong việc thực hiện nó - tôi sẽ nghiên cứu thêm và có thể gửi một câu hỏi tiếp theo. Tôi sẽ đưa ra lời khuyên của bạn về việc không sử dụng "quy trình". BTW Tôi biết rằng dịch vụ sẽ không thực sự chạy mãi mãi - đó chỉ là một sự đơn giản hóa. Cảm ơn một lần nữa. – SteveJP

+0

@CommonsWare Cảm ơn bạn đã giải thích ở trên ... thực sự tốt – Biplab

0

Tôi nghĩ bạn có thể sử dụng IntentService mà bạn chạy bằng cách thiết lập báo thức (thông thường) (AlarmManager.setRepeating) với PendingIntent trong đó. Bạn có thể thông báo cho giao diện người dùng bằng cách phát một ý định từ IntentService và nhận nó trong giao diện người dùng của bạn thông qua BroadcastReceiver.

+0

Cảm ơn @omoling -Không phải là phù hợp hơn để chỉ chạy một nhiệm vụ nhỏ và sau đó chấm dứt, thay vì bắt đầu một quá trình chạy dài? – SteveJP

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