2016-04-27 7 views
2

Haben Sie eine Systemeigenschaft in android mit dem Befehl setprop (über adb) festgelegt, gibt es eine Möglichkeit, diese Änderung in meinem eigenen Dienst zu hören?Kann ich einen Systemeigenschaftslistener in Android schreiben?

Ich versuchte mit SystemProperties.addChangeCallback und wurde nicht benachrichtigt. Gab es etwas, das ich vermisste?

Antwort

0

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