2013-07-18 26 views
17

Những gì tôi có:Cách tốt nhất để giao tiếp một dịch vụ với một hoạt động (phát sóng, callbacks, vv)

Tôi có một thư viện chạy trên một quá trình sử dụng aidl. Tôi có một ứng dụng sử dụng thư viện này và trên hoạt động nhắn tin, tôi kết nối với dịch vụ để gửi tin nhắn và tôi có một bộ thu phát sóng để quản lý các tin nhắn đến.

Sự cố?

nếu thư viện này sẽ được sử dụng bởi hai ứng dụng trên cùng một thiết bị, hành động phát sẽ giống nhau và tôi sẽ gặp sự cố khi tôi gửi một chương trình phát sóng.

Nghi ngờ của tôi là gì?

Cách tốt nhất để "nghe" các tin nhắn mới đến mà tôi nhận được trên thư viện của mình và gửi nó đến Ứng dụng là gì. Có thể gọi lại? hoặc có giải pháp nào tốt hơn không?

Thông tin thêm

Thư viện cung cấp một vài phương pháp để bắt đầu một phiên làm việc, và các phương pháp khác để gửi loại khác nhau của thông điệp (hình ảnh, văn bản, địa điểm, vv ...) và tôi nhận được một cuộc gọi lại từ một thư viện khác, sử dụng C và C++, khi một thư mới đến.

Nếu bạn cần thêm thông tin, hãy hỏi.

Mã của tôi:

IRemote.aidl

interface IRemote 
{ 
    int sendTextMessage(String to, String message); 
} 

WrapperLibrary.java

public class MyLibrary extends Service { 

    // Current context, used to sendbroadcast() from @Callbacks 
    private Context mContext = this; 

    private static MyLibrary instance = new MyLibrary(); 

    //Executor to start a new thread from the service. 
    final ExecutorService service; 

    @Override 
    public IBinder onBind(Intent arg0) { 
     //Return the interface. 
     return mBinder; 
    } 

    /** Return the current instance */ 
    public static WrapperLibrary getInstance() { 
     return instance; 
    } 

private final IRemote.Stub mBinder = new IRemote.Stub() { 

     @Override 
     public int sendTextMessage(String to, String message) 
       throws RemoteException { 


      Log.d(TAG, "Send Text Message. "); 
      int i = -1; 
      Future<Integer> task; 
      task = service.submit(new Callable<Integer>() { 
       public Integer call() { 
        return tu.tu_message_send_text(to, message); 
       } 
      }); 
      try { 
       i = task.get(); 
      } catch (Exception e) { 
       Log.e(TAG, "Send Text Message: EXCEPTION *** " + e.getMessage()); 
      } 

      Log.d(TAG, "Send Text Message: Status Code: " + i); 

      return 0; 
     } 

} 

Callbacks.java

public class Callbacks extends JNICallback { 

    private Context mContext; 


    public Callbacks(Context context) { 
     this.mContext = context; 
    } 

    public void on_incoming_text_message(final String from, final String message) { 

     Log.d(TAG, " Incoming TEXT message from:" + from + " with message: " + message); 
     Intent i = new Intent(BroadcastActions.INCOMING_TEXT_MESSAGE); 
     i.putExtra("from", from); 
     i.putExtra("message", message); 
     mContext.sendBroadcast(i); 

    } 

} 

MainActivity.java O n hoạt động này, tôi có một máy thu phát sóng và tôi có thể cập nhật giao diện người dùng với một thông điệp mới

public class MessageReceiver extends BroadcastReceiver { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      Bundle extra = intent.getExtras(); 
      String incomingMessage = ""; 

      if(extra != null) { 

       incomingMessage = extra.getString("message"); 
       addNewMessage(new Message(incomingMessage, false)); 
      } 

      Toast.makeText(MessagingActivity.this, "Incoming Message", Toast.LENGTH_LONG).show(); 

     } 

    }; 
+1

Bạn có vấn đề gì với chương trình phát sóng? –

+0

Sử dụng cùng một thư viện cho các ứng dụng khác nhau: Cùng tên hành động phát sóng trên thư viện với các ứng dụng khác nhau: Tôi không biết chính xác điều gì sẽ xảy ra. Dù sao, bạn có nghĩ đây là một cách tiếp cận tốt không? – Pipeline

+0

Vấn đề đằng sau người nhận là gì .. người nhận là lựa chọn tốt nhất. Tất cả các dự án và lib có được phát triển bởi bạn không? –

Trả lời

1

Vâng, cuối cùng tôi sẽ sử dụng triển khai Callbacks. Kiến trúc sẽ là như thế này:

App

  • chính Hoạt động (Kết nối với LibService)
  • LibService (sẽ có callbacks và thu phát sóng)

Thư viện

  • Gọi lại và giao diện nhưng không chạy trong ervice.

Đây là phương pháp tốt nhất để tôi tích hợp trong tương lai vào các dự án khác và thư viện sẽ đơn giản hơn nếu không có sự trợ giúp và dịch vụ.

Tôi nghĩ việc sử dụng máy thu là một lựa chọn rất tốt, nhưng suy nghĩ về sự tích hợp vào các dự án khác, đây là cách tốt nhất để làm điều đó (đối với tôi).

+0

hi, bạn có thể hiển thị một số mã để nó có thể hữu ích cho người khác không? –

+0

Mehul, tất nhiên, nhưng tôi cần một ít thời gian để làm sạch mã của tôi và viết một câu trả lời cụ thể hơn. – Pipeline

+0

Có, Sẽ rất tuyệt khi thấy phản hồi cụ thể. –

6

tôi sẽ đề nghị sử dụng LocalBroadcastManager hoặc nếu nó trở nên lộn xộn EventBus, nhưng nếu các dịch vụ chạy trong tiến trình riêng của mình (đó không phải là điều tôi chắc chắn) tin nhắn sẽ không được chuyển từ quy trình này sang tiến trình khác.

Vì vậy, tôi sẽ đề xuất xác định Hành động phát sóng từ dịch vụ trong strings.xml và làm cho nó khác nhau cho mọi ứng dụng. Tất nhiên, bạn sẽ phải cẩn thận vì bạn cũng sẽ cần phải cập nhật hành động của người nhận cho mọi ứng dụng.

+0

Dịch vụ đang chạy trên quy trình của riêng họ, nhưng tôi có thể sửa đổi nó. Cảm ơn câu trả lời. – Pipeline

+0

Về strings.xml, điều gì sẽ xảy ra nếu giải phóng thư viện dưới dạng * .jar, bạn không thể thay đổi strings.xml. Tôi đang tìm một giải pháp chung. – Pipeline

+0

Bạn có thể phân phối phần mã trong một cái bình bên trong một Dự án Thư viện, cạnh nhau với các tài nguyên (strings.xml) (đó là cách Google Play Services được phân phối cho chúng tôi btw) http://developer.android.com/tools/ projects/index.html # LibraryProjects – galex

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