Sie können eine Methode in Ihrem Dienst erstellen, die eine beliebige Systemproperty abrufen sollte, und diese Methode sollte Looper.loop() aufrufen; so dass die Schleife für SystemProperty Zeit zu Zeit abfragt Diese Implementierung kann nicht optimiert werden, dies zu tun, aber es wird verwendet in Android 4.4.2 können Sie sehen, hier http://androidxref.com/4.4.2_r2/xref/frameworks/base/services/java/com/android/server/SystemServer.java Sie auf Link oben sehen können:
boolean disableStorage = SystemProperties.getBoolean("config.disable_storage", false);
boolean disableMedia = SystemProperties.getBoolean("config.disable_media", false);
boolean disableBluetooth = SystemProperties.getBoolean("config.disable_bluetooth", false);
boolean disableTelephony = SystemProperties.getBoolean("config.disable_telephony", false);
boolean disableLocation = SystemProperties.getBoolean("config.disable_location", false);
boolean disableSystemUI = SystemProperties.getBoolean("config.disable_systemui", false);
boolean disableNonCoreServices = SystemProperties.getBoolean("config.disable_noncore", false);
boolean disableNetwork = SystemProperties.getBoolean("config.disable_network", false);
Diese booleschen Variablen werden in der Methode initAndLoop() mit Hilfe von Looper.loop() überprüft; Hier können Sie Ihre anderen Komponenten über Änderungen in einer einzigen SystemProperty informieren.
Eine andere Möglichkeit ist statisch Rückruf zu erstellen und für jede Änderung in einem der SystemProperty Anruf erhalten, sehen Sie den Code des Master-Zweig für Systemservice hier: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/os/SystemService.java
Sie obigen Link sehen in, was Code folgendes tun:
private static Object sPropertyLock = new Object();
static {
SystemProperties.addChangeCallback(new Runnable() {
@Override
public void run() {
synchronized (sPropertyLock) {
sPropertyLock.notifyAll();
}
}
});
}
/**
* Wait until given service has entered specific state.
*/
public static void waitForState(String service, State state, long timeoutMillis)
throws TimeoutException {
final long endMillis = SystemClock.elapsedRealtime() + timeoutMillis;
while (true) {
synchronized (sPropertyLock) {
final State currentState = getState(service);
if (state.equals(currentState)) {
return;
}
if (SystemClock.elapsedRealtime() >= endMillis) {
throw new TimeoutException("Service " + service + " currently " + currentState
+ "; waited " + timeoutMillis + "ms for " + state);
}
try {
sPropertyLock.wait(timeoutMillis);
} catch (InterruptedException e) {
}
}
}
}
/**
* Wait until any of given services enters {@link State#STOPPED}.
*/
public static void waitForAnyStopped(String... services) {
while (true) {
synchronized (sPropertyLock) {
for (String service : services) {
if (State.STOPPED.equals(getState(service))) {
return;
}
}
try {
sPropertyLock.wait();
} catch (InterruptedException e) {
}
}
}
}
Diese Information stammt von Shridutt Kothari. Überprüfen Sie this Google Post über das Abhören einzelner SystemProperty Änderungen