Megoldottam. Hátha segít valaki másnak is...
Szituáció:
Van egy preference activity/fragment és van egy service, ami olvassa a preferences-t. (A service "védett", semmilyen módon nem lehet hozzáférni a rendszer által támogatott módok közül.)
A gond:
A preference változásait az activity (is) kell, hogy figyelje; részben a feliratok módosítása, részben viszont ellenőrzés miatt (nem biztos, hogy a service fut...)
Ha az ellenőrzés miatt módosul az érték, akkor a változást figyelő onSharedPreferenceChanged() újra meghívásra kerül.
A service is kell figyelje a változást, mert néha reagálnia kellene rá. De az előző esetben a rekació akár kétszer is megtörténhet, is megtörténhet. Ez az adott megoldásban több szempontból is gond, mert pl. nem szabad a nem ellenőrzött értékekkel dolgozni, sok idő stb.
Megoldás:
Pofonegyszerű. Bevezettem egy preference-t "counter" kulccsal. Ha a preference ellenőrzése elegédett, akkor növeli a "counter"-t. Service meg csak ezt a countert figyeli.
És a service nem kell kommunikáljon semmilyen megbízhatatlan activity-vel. Csak reagál a változásokra.
Semmi mást nem találtam, ahogy egy InputMethodService-t el lehetne érni Android által adott megoldásokkal.