0

私のアプリの 1 つで、ライブラリ プロジェクトに FileCache があります。アプリ自体には、ライブラリ内の FileCache が新しいファイルをキャッシュしたときに通知を待機する Service があります。

ライブラリは Android ライブラリ プロジェクトであり、アプリに含まれています。

ライブラリから App Service に通知を送信する最良の方法は何ですか?

  • ブロードキャストを送信するには、サービス内のレシーバーを知る必要があります。これは、ライブラリ プロジェクト内からはできません。

  • ライブラリ コードから Service 内の関数を呼び出すこともできません。

コードのスケルトンは次のとおりです。

// This is in the App
public class MyService extends Service implements OnBufferingUpdateListener, OnCompletionListener, OnErrorListener, OnInfoListener, OnPreparedListener {

    public class MyBroadcastReceiver extends BroadcastReceiver {

        public static final String BROADCASTRECEIVER = "xx.yyy.zzzzz.MyService.MyBroadcastReceiver";

        @Override
        public void onReceive(final Context context, final Intent intent) {
        }
    }
}

// This is in a library project that's included in the App
public class FileCache {

    private void doThread() {
        final Handler handler = new Handler() {

            @Override
            public void handleMessage(final Message message) {

                try {
                    if (processed.size() > 0) {
                        //TODO: Notification to Service
                        processed.clear();
                    }
                } catch (NullPointerException nullPointerException) {
                    //TODO:
                }

                if (queue.size() > 0) {
                    doThread();
                } else {
                    running = false;
                }
            }
        };

        new Thread() {

            @Override
            public void run() {
                for (Map.Entry<String, QueueElement> entry : queue.entrySet()) {
                    QueueElement element = entry.getValue();
                    if (element != null) {
                        File file = fetch(element.url);
                        if (file != null) {
                            ProcessedElement processedElement = new ProcessedElement();
                            processedElement.file = file; 
                            processedElement.url = element.url; 
                            processed.put(entry.getKey(), processedElement);
                        }
                    }

                    deleteFromQueue(entry.getKey());
                }

                handler.sendEmptyMessage(0);
            }
        }.start();
    }
}
4

1 に答える 1

0

ブロードキャストを送信するには、サービス内のレシーバーを知る必要があります。これは、ライブラリ プロジェクト内からはできません。

もちろんそうだ。ライブラリ プロジェクトのクライアントに、いくつかのメソッドのパラメータを介して次のいずれかを実行するのに十分な情報をライブラリに提供してもらいます。

  • サービス (サービスClassオブジェクトなど) を識別します。この場合startService()、コマンドをサービスに送信するために使用します。

  • を識別しますBroadcastReceiver(たとえば、その によって使用されるアクション文字列IntentFilter)。sendBroadcast()

于 2012-06-17T15:24:08.187 に答える