17

私が持っているもの:

aidl を使用するプロセスでライブラリを実行しています。このライブラリを使用するアプリがあり、メッセージング アクティビティでサービスに接続してメッセージを送信し、受信メッセージを管理するブロードキャスト レシーバーを持っています。

問題?

このライブラリが同じデバイス上の 2 つのアプリで使用される場合、ブロードキャスト アクションは同じになり、ブロードキャストを送信するときに問題が発生します。

私の疑問は何ですか?

ライブラリで受信した新しい着信メッセージを「聞いて」アプリに送信する最良の方法は何ですか? もしかしてコールバック?またはより良い解決策はありますか?

詳しくは

ライブラリには、セッションを開始するためのいくつかのメソッドと、さまざまな種類のメッセージ (画像、テキスト、場所など) を送信するためのその他のメソッドが用意されています。メッセージが届いています。

さらに詳しい情報が必要な場合は、お気軽にお問い合わせください。

私のコード:

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

        }

    };
4

2 に答える 2

6

LocalBroadcastManager を使用するか、それが乱雑になる場合はEventBusを使用することを提案するつもりでしたが、サービスが独自のプロセスで実行されている場合 (これについては確信が持てません)、メッセージングは​​あるプロセスから別のプロセスに渡されません。

そのため、strings.xml でサービスからブロードキャスト アクションを定義し、アプリごとに異なるものにすることをお勧めします。もちろん、すべてのアプリのレシーバー アクションも更新する必要があるため、注意が必要です。

于 2013-07-22T15:47:41.833 に答える
1

さて、最後に Callbacks の実装を使用します。アーキテクチャは次のようになります。

アプリ

  • メイン アクティビティ (LibService に接続)
  • LibService (コールバックとブロードキャスト レシーバーを持つ予定です)

としょうかん

  • コールバックとインターフェースですが、サービスで実行されていません。

これは、他のプロジェクトでの将来の統合に対する私にとって最良のアプローチであり、ライブラリは援助やサービスなしでよりシンプルになります。

受信機の使用は非常に良いオプションだと思いましたが、他のプロジェクトへの統合を考えると、これが最善の方法です (私にとって)。

于 2013-07-26T09:17:30.230 に答える