2014-04-11 19 views
6

Câu hỏi đầu tiên ở đây, nhưng tôi đã ở một lúc.Giao tiếp với dịch vụ nền trước android

Tôi phải làm gì:

Tôi đang xây dựng một ứng dụng Android đóng file audio cũng như danh sách nhạc trực tuyến. Mọi thứ đang hoạt động tốt, nhưng tôi đang gặp vấn đề trong giao tiếp với dịch vụ của tôi.

Nhạc đang phát trong Dịch vụ, bắt đầu bằng startForeground, vì vậy nó không bị giết.

Tôi cần liên lạc từ hoạt động của mình với dịch vụ, để nhận tên bản nhạc, hình ảnh và một vài thứ khác.

Whats vấn đề của tôi:

Tôi nghĩ rằng tôi cần phải bắt đầu dịch vụ của tôi với bindService (thay vì startService hiện tại của tôi) để hoạt động có thể nói chuyện với nó.

Tuy nhiên, khi tôi làm điều đó, dịch vụ của tôi bị giết sau khi đóng Hoạt động.

Tôi có thể nhận cả hai bằng cách nào? Dịch vụ ràng buộc và tiền cảnh?

Cảm ơn!

+0

Bạn đã thử thực hiện một thông báo cho dịch vụ của mình chưa? Tôi nghĩ điều đó sẽ giúp ngăn nó bị giết. – indivisible

+0

Câu trả lời của tôi có giúp ích không? – Libin

Trả lời

6

No. bindService sẽ không khởi động dịch vụ. Nó sẽ chỉ liên kết với Service với service connection, để bạn sẽ có instance dịch vụ truy cập/kiểm soát nó.

Theo yêu cầu của bạn, tôi hy vọng bạn sẽ có phiên bản MediaPlayer trong dịch vụ. Bạn cũng có thể bắt đầu dịch vụ từ Activity và sau đó là bind. Nếu số service đang chạy onStartCommand() sẽ được gọi và bạn có thể kiểm tra xem MediaPlayer thể hiện không phải là không, sau đó chỉ cần trả lại START_STICKY.

Thay đổi bạn Activity như thế này ..

public class MainActivity extends ActionBarActivity { 

    CustomService customService = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // start the service, even if already running no problem. 
     startService(new Intent(this, CustomService.class)); 
     // bind to the service. 
     bindService(new Intent(this, 
      CustomService.class), mConnection, Context.BIND_AUTO_CREATE); 
    } 

    private ServiceConnection mConnection = new ServiceConnection() { 
     @Override 
     public void onServiceConnected(ComponentName componentName, IBinder iBinder) { 
      customService = ((CustomService.LocalBinder) iBinder).getInstance(); 
      // now you have the instance of service. 
     } 

     @Override 
     public void onServiceDisconnected(ComponentName componentName) { 
      customService = null; 
     } 
    }; 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     if (customService != null) { 
      // Detach the service connection. 
      unbindService(mConnection); 
     } 
    } 
} 

Tôi có ứng dụng tương tự với MediaPlayerservice. cho tôi biết nếu cách tiếp cận này không giúp bạn.

+0

Trong trường hợp của tôi nếu tôi không liên kết với dịch vụ của mình. Dịch vụ bị giết. Bởi vì hoạt động duy nhất đã bị ràng buộc với nó đã bị đóng/đã tắt tầm nhìn. Đây là tài liệu được đánh giá cao. Tôi đang làm một hệ thống tải xuống cho ứng dụng của mình. Nhưng nó giết chết dịch vụ. Khi trình tải xuống được thực hiện, tôi đã tự ngừng gọi một nơi nào đó trong dịch vụ để Dịch vụ của tôi không hoạt động mãi mãi. Bất kỳ ý tưởng? –

2

Trích dẫn Android documentation:

Một dịch vụ ràng buộc bị phá hủy khi tất cả các khách hàng unbind, trừ khi dịch vụ cũng đã được bắt đầu

Và về sự khác biệt giữa bắt đầuràng buộc chỉ mất một hãy xem https://developer.android.com/guide/components/services.html

Vì vậy, bạn phải tạo Dịch vụ bằng cách sử dụng startService và sau đó bindService, như @Libin thực hiện trong ví dụ của anh ấy/cô ấy. Sau đó, dịch vụ sẽ chạy cho đến khi bạn sử dụng stopService hoặc stopSelf hoặc cho đến khi Android quyết định rằng dịch vụ đó cần tài nguyên và giết bạn.

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