6

Tôi đang cố gắng ràng buộc một dịch vụ, nhưng onBind() luôn trả về false.OnBind() trên dịch vụ luôn trả về False - Android

Đây là mã cho ServiceConnection -

private ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder service) { 
     // This is called when the connection with our service has been established, 
     // giving us the service object we can use to interact with our service. 
     mBoundService = ((ScheduleService.ServiceBinder) service).getService(); 
    } 

    public void onServiceDisconnected(ComponentName className) { 
     mBoundService = null; 
    } 
}; 

này được gọi bindService() -

boolean test = getApplicationContext().bindService(new Intent(this, ScheduleService.class), mConnection, Context.BIND_AUTO_CREATE); 

Đây là tuyên bố của dịch vụ trong Manifest -

<service android:name=".Notifications.ScheduleService" android:enabled="true"/> 

Tôi đã đọc các câu hỏi trước về chủ đề và không thể tìm thấy ans wer (cố gắng chuyển ngữ cảnh Hoạt động với ngữ cảnh Ứng dụng, nhưng nó không giúp được).

Tôi đang sử dụng Frgaments và ActionBarSherlock và Hoạt động của tôi mở rộng SlidingFragmentActivity (Đó là lý do tại sao tôi đang sử dụng ngữ cảnh ứng dụng, điều này không có tác dụng).

Edit - Đây là mã của dịch vụ tôi đang cố gắng để bắt đầu -

public class ScheduleService extends Service { 

    /** 
    * Class for clients to access 
    */ 
    public class ServiceBinder extends Binder { 
     public ScheduleService getService() { 
      return ScheduleService.this; 
     } 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.i("ScheduleService", "Received start id " + startId + ": " + intent); 

     // We want this service to continue running until it is explicitly stopped, so return sticky. 
     return START_STICKY; 
    } 

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

    // This is the object that receives interactions from clients. See 
    private final IBinder mBinder = new ServiceBinder(); 

    /** 
    * Show an alarm for a certain date when the alarm is called it will pop up a notification 
    */ 
    public void setAlarm(Calendar c) { 
     // This starts a new thread to set the alarm 
     // You want to push off your tasks onto a new thread to free up the UI to carry on responding 
     new AlarmTask(this, c).run(); 
    } 
} 

Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn.

+0

Tôi nghĩ bạn nên xóa thông báo .Notifications trong tệp kê khai. –

+0

Đăng mã triển khai dịch vụ của bạn. – yorkw

+0

Tôi đã chỉnh sửa câu hỏi bằng cách triển khai. – Tofira

Trả lời

1

Tên lớp học đủ điều kiện là ScheduleService (nghĩa là bao gồm tên gói đầy đủ)?

tôi yêu cầu này, bởi vì trong tệp AndroidManifest.xml của bạn, tên của dịch vụ của bạn là .Notifications.ScheduleService, mà có vẻ hơi kỳ quặc:

này nói với tôi rằng một trong hai

  • The (phần cuối cùng của the) tên gói chứa upper-case ký tự ... không tốt lắm.
    Thay vào đó, tôi mong đợi .notifications.ScheduleService, nếu xảy ra trường hợp này.
  • ScheduleService được xác định trong tệp có tên Notifications.java. Thay vào đó, tôi mong đợi .Notifications$ScheduleService, nếu đây là trường hợp (ký hiệu đô la thay vì dấu chấm).
1

Bạn có nghĩa là bindService() trả về false? onBind() trả về IBinder loại.

Hãy nhớ rằng ràng buộc dịch vụ mất một thời gian. Nếu bạn muốn thực hiện một số hành động sau khi ràng buộc được thực hiện, bạn có thể thực hiện nó theo phương thức onServiceConnected().

public void onServiceConnected(ComponentName className, IBinder service) { 

    mBoundService = ((ScheduleService.ServiceBinder) service).getService(); 
    Calendar c = new Calendar(); 
    mBoundService.setAlarm(c); 
} 

Nếu bạn cần thêm hướng dẫn về điều này, bạn cần hiển thị cho chúng tôi mã Hoạt động của bạn.

0

Tại sao bạn sử dụng ngữ cảnh ứng dụng để ràng buộc dịch vụ? Phương thức bindService được gọi thông qua ContextWrapper. Nó có thể không phải là vấn đề nhưng tôi muốn chia sẻ bối cảnh trên khắp nơi mà bạn ràng buộc dịch vụ và nơi bạn có kết nối.

Trong trường hợp của bạn thay vì

boolean test = getApplicationContext().bindService(new Intent(this, ScheduleService.class), mConnection, Context.BIND_AUTO_CREATE); 

Tôi muốn làm như sau

boolean test = bindService(new Intent(this, ScheduleService.class), mConnection, Context.BIND_AUTO_CREATE); 

Hoặc nếu bạn muốn giữ lại một bối cảnh toàn cầu trong ứng dụng, di chuyển tất cả mọi thứ để tập tin ứng dụng của bạn và cuộc gọi nó tương tự như cách đề xuất ở trên.

Sự cố cũng có thể ở trên tên gói của ứng dụng và khai báo dịch vụ trong tệp kê khai của bạn. Nếu bạn không chắc chắn, hãy đảm bảo cung cấp tuyến đường toàn cầu cho dịch vụ của bạn trong tệp kê khai.

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