如何在库代码中通知App中的服务?

时间:2012-06-17 14:03:49

标签: android service

在我的一个应用程序中,我在库项目中有一个FileCache。当库中的FileCache缓存了新文件时,应用程序本身有一个等待通知的服务。

该库是一个Android库项目,包含在App。

从图书馆向App 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();
    }
}

1 个答案:

答案 0 :(得分:0)

  

发送广播需要知道服务中的接收者。这在图书馆项目中是不可能的。

当然可以。让您的图书馆项目的客户通过某种方法的参数向图书馆提供足够的信息:

  • 识别服务(例如,服务Class对象),在这种情况下,您使用startService()向服务发送命令,或

  • 标识BroadcastReceiver(例如,IntentFilter使用的操作字符串),在这种情况下,您使用sendBroadcast()