与活动通信的最佳方式(广播,回调等)

时间:2013-07-18 11:01:41

标签: android performance android-service android-broadcast

我有什么:

我有一个使用aidl在进程上运行的库。 我有一个使用此库的应用程序,在消息传递活动中,我连接服务以发送消息,我有一个广播接收器来管理传入的消息。

问题?

如果这个库将由同一设备上的两个应用程序使用,则广播操作将是相同的,并且当我发送广播时我会遇到问题。

我有什么疑问?

“收听”我在图书馆收到的新收到的消息并将其发送到应用程序的最佳方式是什么。 也许回调?还是有更好的解决方案?

更多信息

该库提供了一些启动会话的方法,以及其他用于发送不同类型消息(图像,文本,位置等等)的方法,并且我从另一个使用C和C ++的库接收回调,当有新消息传入时。

如果您需要更多信息,请随时提出。

我的代码:

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     在这个活动中,我有一个广播接收器,我可以使用新消息更新UI

    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();

        }

    };

2 个答案:

答案 0 :(得分:6)

我打算建议使用LocalBroadcastManager或者它变得凌乱EventBus,但如果服务在自己的进程中运行(这不是我确定的事情),那么消息将不会从一个过程传递到另一个过程。

所以我建议在strings.xml中定义来自服务的Broadcast Action,并使每个应用程序的内容不同。当然,您必须小心,因为您还需要更新每个应用程序的接收器操作。

答案 1 :(得分:1)

好吧,最后我将使用Callbacks实现。 架构将是这样的:

应用

  • 主要活动(与LibService联系)
  • LibService(将有回调和广播接收器)

  • 回调和接口但未在服务中运行。

这是我未来在其他项目上集成的最佳方法,如果没有援助和服务,图书馆将变得更加简单。

我认为使用接收器是一个非常好的选择,但考虑到在其他项目上的集成,这是最好的方法(对我来说)。