Bedzie ciezko tak jak chyba chcesz, bo jak dodasz zaleznosc z liba do app to masz cykliczne zaleznosci a to nigdy nie jest dobre. Pomysl: zeby skompilowac aplikacje potrzebujesz biblioteke, ale zeby skompilowac biblioteke potrzebujesz aplikacje? Nawet jak przeczytasz druga polowe tego zdania to wyjdzie ze to bez sensu - nigdy biblioteka nie moze wymagac aplikacji do kompilacji. Biblioteka nie moze wiedziec jak i dokad, w jakim formacie chcesz zapisac dane, i powinna byc na tyle elastyczna zeby pozwalac na dowolnosc. Jak? Pokaze nizej.
Jesli biblioteka nie upublicznia zadnych interfejsow ktore ty mozesz w twojej aplikacji implementowac i jakos zarejestrowac w klasach liba, to jedynym sposobem bedzie modyfikacja kodu liba. Albo dodasz do niego odpowiednie interfejsy, on bedzie wolal metody z tych interfejsow, a aplikacja dostarczy ich implementacje (wariant standardowy) lub skopiujesz kod liba do app (tak ze bedziesz mial tylko jeden modul) i tam na zywca mozesz robic co chcesz (wariant *ujowy).
Pokaze ci w prosty sposob o co chodzi z tymi interfejsami, to jest pseudokod ale powinienes zrozumiec:
lib - zbiera powiadomienia z jakichstam zrodel i jak przyjdzie nowe to wywoluje jakas metode gdzie je przekazuje
interface NotificationReceivedListener { void notificationReceived(Notification n); }
class Library {
// a lot of code
public void addDataGenerationListener(DataGeneratedListener l) {...}
}
app - chce wiedziec kiedy przychodza nowe powiadomienia, filtrowac je i zapisac do bazy danych
<code lang=java>
class PersistingNotificationReceivedListener implements NotificationReceivedListener {
public void notificationReceived(Notification n) {
if (shouldSaveNotification(n)) {
save(n);
}
}
private boolean shouldSaveNotification(Notification n) { ... }
private void save(Notification n) { SQLite.save(n); }
}
To jest typowa struktura wzorca observer - biblioteka definiuje interfejs dla obserwatora, aplikacja dostarcza jego implementacje i robi w nim co jej sie podoba. Praktycznie kazda aplikacja ma jakos gdzies ten wzorzec zaimplementowany - a to jakies callbacki/listenery na klikniecia guzika, a to callback ze telefon zostal odwrocony do portrait, a to callback ze jest malo pamieci (przyklad z iOS)... To jest tez absolutna podstawa, musisz to umiec i rozumiec bo inaczej lipa.
Ale przeciez juz to umiesz - Button.setOnClickListener(new OnClickListener() { ... }); na pewno widziales i pisales? Przez analogie:
lib ktorego uzywasz to API androida
NotificationReceivedListener to OnClickListener z androida
twoja implementacja ktora costam gdziestam zapisuje to tak jakby twoja implementacja zdarzenia klikniecia
Notification to tak jakby TouchEvent z Androida
Mam nadzieje ze przez ta analogie bedzie latwiej zrozumiec, i rowniez dojdziesz do wniosku, ze bez sensu jest oczekiwac zeby biblioteka uzywala jakichs klas aplikacji do zapisywania czegos.
Mozesz powiedziec jaka biblioteke uzywasz, co chcesz zrobic, ktos moze tam zajrzy i podpowie czy sie da i co masz zaimplementowac i gdzie zarejestrowac.