Thanks for the explanation :)

I have some concerns:
1. The users can want to use different intervals for AbstractTdLogger and TdLoggerService?
2. TdLoggerService instance is a singleton and its lifetime is longer than TdLogger instances. For example, after an application which had used TdLogger was closed, the TdLoggerService can keep running while the logger was removed. When the second logger is created, calling TdLoggerService#setUploadInterval wouldn't take effect.
3. Thanks for letting me know "Here is a small trick that I use in JAVA to replicate C++ friend mechanism." It's interesting, but looks too complicated. I think we don't need to insist not to expose TdLoggerService#setUploadInterval.

How about using Intent to tell TdLoggerService instance new interval? Then TdLogger can access TdLoggerService instance and its uploadWorker like this:
```
    private class LogReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(TAG, "received intent " + intent);
            if (intent.getAction().equals(ACTION_FLUSH)) {
               :
            }
            else if (intent.getAction().equals(ACTION_CLOSE)) {
                isClosing = true;
            }
            else if (intent.getAction().equals(ACTION_UPDATE_INTERVAL)) {
                int intervalMilli = intent.getIntExtra(EXTRA_KEY_INTERVAL, -1);
                if (intervalMilli > 0) {
                    uploadWorker.setInterval(intervalMilli);
                }
            }
```
It can work only while the service is running. So we still need to implement something like static method TdLoggerService.setUploadInterval for the first call, though.