2010-11-19 37 views
5

Tôi đã viết một chương trình Android có: hoạt động chính cho giao diện người dùng và bắt đầu dịch vụ. Dịch vụ kịp thời gọi lại hoạt động giao diện người dùng để cập nhật lượt xem. Nó hoạt động tốt ngoại trừ: nếu hoạt động được đóng (với BACK) và bắt đầu lại, dịch vụ cũng sẽ được bắt đầu lại (Dịch vụ phát tệp âm thanh, do đó có hai âm thanh chồng chéo). Tôi sử dụng bindService với cờ BIND_AUTO_CREATE để bắt đầu và kết nối với dịch vụ. Theo tài liệu, nó sẽ tạo ra dịch vụ chỉ khi nó không tồn tại, nhưng rõ ràng nó bắt đầu một thể hiện khác khi mở lần thứ hai. Tất cả những gì tôi muốn là khi hoạt động được đóng, dịch vụ sẽ tiếp tục chạy và khi hoạt động mở lại, nó có thể kết nối lại với dịch vụ. Điều đó có thể không? Hoặc tôi chỉ hiểu lầm việc sử dụng dịch vụ?Tại sao dịch vụ từ xa bị hủy khi hoạt động chính bị đóng?

Đã thử thêm: Sử dụng ICountService (được mô tả trong .aidl) thay vì CountService trong mục đích bindService. Nó onDestroyed được gọi khi hoạt động được đóng lại.

Dưới đây là mã tạo dịch vụ nếu nó trợ giúp.

ServiceConnection conn = new ServiceConnection(){ 
    @Override 
    public void onServiceConnected(ComponentName c, IBinder b) { 
     Log.d("TK","Connected"); 
     //binder = (ICountService.Stub) b; 
     service = ICountService.Stub.asInterface(b); 
     try { 
      service.setCallback(new ICountCallback.Stub(){ 

       @Override 
       public void alert() { 
        Log.d("TK","alert!"); 
       } 

       @Override 
       public void updateTime(final int sec) { 
        handler.post(new Runnable(){ 

         @Override 
         public void run() { 
                  indicator.setText(toText(sec)); 
         } 

        }); 
       }    
      }); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName c) { 
     Log.d("TK","Disconnected"); 
    }   
}; 

private void startCountService(){ 
    Intent i = new Intent(ICountService.class.getName()); 
    boolean ok = context.bindService(i, conn, Context.BIND_AUTO_CREATE); 
    Log.d("TK", "bindService="+ok); 
} 

Trả lời

7

Theo tài liệu này, nó sẽ tạo ra dịch vụ duy nhất nếu nó không tồn tại, nhưng rõ ràng là nó bắt đầu một ví dụ khi mở ra lần thứ hai.

bindService() sẽ tạo trường hợp dịch vụ nếu dịch vụ không hoạt động. unbindService() sẽ hủy bản sao dịch vụ nếu không có kết nối bị ràng buộc nào khác và không ai được gọi là startService(). Nếu dịch vụ bị hủy trên unbindService(), thì bindService() sau đó sẽ tạo một phiên bản dịch vụ mới.

IMHO, lý tưởng, unbindService() sẽ không ngay lập tức phá hủy dịch vụ, nhưng hãy để nó kéo dài trong vài giây trước, trong trường hợp có bindService() ngay sau unbindService(). Tuy nhiên, đó không phải là cách họ thực hiện nó.

Tất cả những gì tôi muốn là khi hoạt động được đóng, dịch vụ sẽ tiếp tục chạy và khi hoạt động mở lại, nó có thể kết nối lại với dịch vụ.

Bạn nên sử dụng startService()stopService() thay vì (hoặc hình dung bổ sung cho) bindService()unbindService().

+0

Cảm ơn. start/stopService không hoạt động. Tôi đã thử nhiều hơn và thấy rằng dịch vụ này thực sự bị phá hủy khi hoạt động bị đóng (CountService.onDestroy được gọi). Vấn đề bây giờ là: Làm thế nào để ngăn chặn các dịch vụ bị phá hủy? – Reno

+0

@Reno: Sử dụng 'startService()'. Tin hay không, nó hoạt động. – CommonsWare

+0

Cảm ơn. Nó cuối cùng cũng được làm việc. Bây giờ tôi sử dụng như thế này: khi bắt đầu hoạt động, 1) startService, 2) bindService không có BIND_AUTO_CREATE; khi ngừng hoạt động, chỉ cần unbindService, không stopService – Reno

-2

Điều này đã hiệu quả đối với tôi.

Main.java

public class Main extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     startService(new Intent(Main.this, MyService.class)); 

     try{ 

      MyService.setMainActivity(this); 

     }catch(Exception e){ 

      //t.setText(e.getMessage()); 

     } 
    } 
} 

MyService.java

public class MyService extends Service { 
    private Context ctx; 
    public static Main main; 
     @Override public IBinder onBind(Intent intent) {   
     // TODO Auto-generated method stub  
     return null; 
    }  

    public void onCreate() 
    { 
     super.onCreate(); 
     ctx = this; 
     startService(); 
    } 

    @Override public void onDestroy() {   
     // TODO Auto-generated method stub  
     Log.d("ASAS","Destroy"); 
     super.onDestroy(); 
    } 

    public static void setMainActivity(Main activity) { 
     main = activity; 
    } 

    private void startService() 
    {   
     //timer.scheduleAtFixedRate(new checkdata(),0,30000); 
    } 
} 
+1

Nên thêm một số giải thích để làm cho câu trả lời hữu ích hơn. –

+0

Vui lòng thêm một số nhận xét cho mã ở trên. – SoH

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