2010-02-01 1 views
23

Tôi hiện đang có một Dịch vụ chạy tốt khi tôi khởi động nó nhưng khi tôi cố dừng dịch vụ bằng phương thức stopService phương thức onDestroy của nó không được gọi.Dịch vụ sẽ không dừng khi phương thức StopService được gọi là

Đây là mã tôi sử dụng để cố gắng ngăn chặn các dịch vụ

stop_Scan_Button = (Button) findViewById (R.id.stopScanButton);

stop_Scan_Button.setOnClickListener(new View.OnClickListener(){ 
    public void onClick(View v){ 
     Log.d("DEBUGSERVICE", "Stop Button pressed"); 
     Intent service = new Intent(CiceroEngine. CICERO_SERVICE); 
     releaseBind(); 
     Log.d("Stop_Scan_Button", "Service: " + service.toString()); 
     stopService(service); 
     Log.d("Stop_Scan_Button", "Service should stop! "); 

     } 
}); 

Tôi có nghĩ rằng khi sử dụng stopService thì phương thức onDestroy của Dịch vụ có được không? Khi tôi bấm nút dừng quét, phương pháp onDestroy() trong Dịch vụ của tôi không được gọi.

Có bất kỳ điều gì khác mà tôi thiếu mà tôi nên đưa vào để ngừng dịch vụ không?

EDIT: để thêm onServiceConnected() được gọi khi stopService chạy thay vì onServiceDisconnected(), tại sao điều đó lại xảy ra?

EDIT: Để thêm biết thêm coi Binding

tôi gọi bindService trong onCreate() phương pháp và sau đó tôi có phương pháp releaseBind() unbind Dịch vụ.

Đây là mã cho phương pháp đó:

public void releaseBind(){ 
    unbindService(this); 
    } 

Vì vậy, tôi đoán rằng unbinding không phải là vấn đề của tôi?

Trả lời

42

Tôi sẽ đoán rằng bạn có cuộc gọi phương thức releaseBind() có nghĩa là trước đây bạn đã gọi bindService() trên dịch vụ này và releaseBind() đang gọi unbindService(). Nếu dự đoán của tôi không chính xác, vui lòng bỏ qua câu trả lời này.


Một dịch vụ sẽ đóng cửa sau khi tất cả các cuộc gọi bindService() đã tương ứng unbindService() cuộc gọi của họ. Nếu không có khách hàng bị ràng buộc, thì dịch vụ cũng sẽ cần stopService() nếu và chỉ khi ai đó gọi là startService() trên dịch vụ.

Vì vậy, có một vài khả năng ở đây:

  1. Bạn khách hàng vẫn bị ràng buộc (ví dụ, các hoạt động khác), trong trường hợp mà bạn không thể dừng dịch vụ cho đến khi họ unbind
  2. Kể từ khi cả hai unbindService()stopService() là không đồng bộ, một cái gì đó có thể đi haywire với thời gian, trong trường hợp này bạn có thể nhận được may mắn hơn nếu bạn gọi stopService() từ ServiceConnection của bạn 's onServiceDisconnected() phương pháp

Ngoài ra, hãy ghi nhớ rằng thời gian chính xác của dịch vụ đang bị hủy là lên đến Android và có thể không ngay lập tức. Vì vậy, ví dụ: nếu bạn đang dựa vào onDestroy() để dịch vụ của bạn ngừng hoạt động, hãy xem xét sử dụng trình kích hoạt khác cho điều đó (ví dụ: hoạt động gọi phương thức stopDoingStuff() thông qua giao diện dịch vụ).

+1

Tôi đã chỉnh sửa câu hỏi ban đầu của tôi để bao gồm thông tin về liên kết của tôi, tôi có nó ràng buộc và sau đó unbinding –

+2

Ummm, mã đó là hoàn toàn sai lầm và là gần như chắc chắn góp phần vào vấn đề của bạn. 'bindService()' và 'unbindService()' là không đồng bộ và được bảo đảm thất bại theo cách bạn đang sử dụng chúng. Thật không may, tôi không có ý tưởng những gì bạn đang cố gắng để thực hiện ở đây, vì vậy tôi không có cách nào tốt để tư vấn cho bạn thêm. – CommonsWare

+0

Giao diện người dùng của nó chỉ là một nút hai nút, một để bắt đầu dịch vụ và một để ngăn chặn nó. Tôi đã lấy câu lệnh if ra khỏi phương thức releaseBind() của tôi để lại chỉ unBindService (điều này); Điều này dường như hủy đăng ký Dịch vụ khi tôi nhấp vào Dịch vụ lần thứ hai tôi gặp lỗi "Dịch vụ chưa được đăng ký". Tuy nhiên, stopService vẫn không xuất hiện để gọi phương thức onDestroy() trong Dịch vụ của tôi, các dịch vụ nền vẫn hoạt động –

10

Tất cả các ràng buộc của bạn đã đóng chưa?

A service can be used in two ways. Hai chế độ không phải là hoàn toàn riêng biệt. Bạn có thể liên kết với một dịch vụ đã được bắt đầu với startService(). Ví dụ: có thể bắt đầu dịch vụ nhạc nền bằng cách gọi startService() với đối tượng Intent xác định nhạc phát. Chỉ sau này, có thể khi người dùng muốn thực hiện một số quyền kiểm soát đối với người chơi hoặc nhận thông tin về bài hát hiện tại, sẽ hoạt động thiết lập kết nối với dịch vụ bằng cách gọi bindService(). Trong những trường hợp như thế này , stopService() sẽ không thực sự dừng dịch vụ cho đến khi cuối cùng ràng buộc được đóng

.

+0

Yeh Tôi chỉ liên kết nó một lần và sau đó gọi releaseBind() để unbind –

4

hai người xin lỗi vì câu trả lời trễ nhưng theo như tôi biết tôi đã dừng thành công dịch vụ trong mã này: bạn có thể kiểm tra số link tại đây.

public void onClick(View src) { 
switch (src.getId()) { 
case R.id.buttonStart: 
    Log.d(TAG, "onClick: starting srvice"); 
    startService(new Intent(this, MyService.class)); 
    break; 
case R.id.buttonStop: 
    Log.d(TAG, "onClick: stopping srvice"); 
    stopService(new Intent(this, MyService.class)); 
    break; 
} 
} 

và dịch vụ đẳng cấp:

public class MyService extends Service { 
     private static final String TAG = "MyService"; 


@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

@Override 
public void onCreate() { 
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onCreate"); 


} 

@Override 
public void onDestroy() { 
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onDestroy"); 

} 

@Override 
public void onStart(Intent intent, int startid) { 
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onStart"); 

} 
}