# Zeitstopp-App, immer dann aktiv, wenn Handy an - wie vorgehen?



## kuzdu (3. Dez 2012)

Hallo,

ich plane gerade eine App. An einigen Ecken und Kanten hakt es noch in meiner Planung bzw. würde ich mich über einen Rat freuen.

Das Grundprinzip meiner App ist: Sie läuft dauerhaft im Hintergrund und speichert die Zeit, die man am Handy aktiv (also nicht Standby) an einem Tag (24h von 0 bis 0 Uhr) verbracht hat.  

1. Ist das Prinzip so überhaupt möglich?

2. Mein Hauptproblem: Die Stoppuhr soll immer nur dann aktiv sein, wenn der User wirklich etwas am Handy macht, das Handy also *nicht* im Standby ist. Ich habe schon danach gegoogelt, aber ich konnte einfach nicht finden, wie man das bewerkstelligt. Hat jmd. dazu vllt ein hilfreiches Schlagwort oder kennt ein ähnliches Szenario?

3. Ansonsten wollte ich einfach ein Menu schreiben mit Punkten wie: "Zeit starten", "Zeiten ansehen" usw. Eine Stoppuhr sollte auch kein Problem sein und mit Datenbankspeicherung habe ich mich auhc schon mal erfolgreich auseinandergesetzt.

Es hakt also mehr an Punkt 1 und 2.  
Hat sonst noch jmd. Anmerkungen, Ideen oder Tipps für mich? Nehme alles gerne an. 

Gruß

PS: ich selbst besitze zur Zeit noch kein Smartphone (Weihnachten kommt bald hohoho). Also falls ich iwas essentielles übersehen habe, bitte sagen!


----------



## kuzdu (7. Dez 2012)

Also, nach drei Tagen habe ich endlich etwas geeignetes gefunden:

Und zwar heißt das Zauberwort KeyguardManager und die benötigte Methode keyguardManager.isKeyguardLocked()

KeyguardManager | Android Developers

implementieren tut man das wie folgt:


```
import android.app.KeyguardManager;

............

// in die Main:
 KeyguardManager keyguardManager = (KeyguardManager)getSystemService(Activity.KEYGUARD_SERVICE); 

 if(keyguardManager.isKeyguardLocked()) {
         	System.out.println("GELOCKT");
         } else {
         	System.out.println("NICHT GELOCKT");
         }
```

Das Ganze geht aber erst seit Api16, scheint also noch n' ganz frisches Ding zu sein. Vielleicht hilft es ja irgendwann irgendwem


----------



## The_S (7. Dez 2012)

Immer im Hintergrund ist schlecht da hoher Akkuverbrauch. Registriere am Besten einen Receiver für SCREEN_ON und SCREEN_OFF. Bei SCREEN_ON speicherst du die aktuelle Zeit weg. Bei SCREEN_OFF errechnest du die Differenz und zählst diese auf die bereits gezählte Differenz drauf.


----------



## kuzdu (12. Dez 2012)

Hi,
habe hier noch mal ein Problem, bzw. einige Verständnisprobleme. :bahnhof:

Habe nun einen Receiver geschrieben und zusätzlich noch einen Service, damit die App auch immer im Hintergrund weiterlaufen und die Zeit hochzählen kann.

Wenn nun SCREEN_OFF aktiv wird (der Bildschirm also aus ist), werden alle Variablenwerte gelöscht. Allerdings brauche ich, um die Zeit-Differenz zu errechnen, meinen System.currentTimeMillis()-Start-Wert.

Meine Hauptfrage ist, also: wie speicher ich meinen System.currentTimeMillis()-Start-Wert?


Ich habe auch schon länger danach gegoogelt und anscheinend verwendet man dafür folgende Methoden: 


```
//Main-Klasse

@Override
	public void onSaveInstanceState(Bundle savedInstanceState) {
		super.onSaveInstanceState(savedInstanceState);
		 
	savedInstanceState.putLong("startZeitSave", startZeit); 
	
	}
    
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
    	    super.onRestoreInstanceState(savedInstanceState);

    		  long startZeitReloaded= savedInstanceState.getLong("startZeitSave");
                  //der gespeicherte Wert in startZeitReloaded
    		}
```

So weit so gut. Nun finden aber meine Hauptrechnungen in meiner ScreenOnScreenOffReceiver.class statt, die grob so aussieht: 


```
public class ScreenOnScreenOffReceiver extends BroadcastReceiver {

	@Override
    public void onReceive(Context context, Intent intent) {
          
         if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {    
        	  
        	 //Berechnung der Differenz. Z.B. das Handy war 5 Sekunden an, bis der SCREEN OFF war
        	  
          }
      
}
	//Startzeit wird uebergeben von der Main
	public void startTime(long startZeit) {
		   this.startZeit = startZeit;
	   }
	
	
	   public long getTimeDifference() {

               //Endgueltige Ausgabe der Differenz, wenn die App gestoppt und nicht nur der Bildschirm ausgemacht wird
	   }
	
}
```

Ich blicke gerade gar nicht mehr durch mit der Kommunikation zwischen den Klassen.

1. Wie komme ich allgemein in der Main-Klasse an meine startZeitReloaded aus der Methode "onRestoreInstanceState"? (Wann genau wird diese Methode überhaupt aktiv?)

2. Wie bekomme ich die startZeitReloaded wieder in meine ScreenOnScreenOffReceiver.class, wo sie für weitere Berechnungen benötigt wird? Arbeite ich mit dem Prinzip von Settern und Gettern? (Ich meine mal gelesen zu haben, dass man das in Android eign. gar nicht macht?)

3. Aus meiner Sicht wäre es viel einfacher, wenn ich die Methoden "onRestoreInstanceState" und "onSaveInstanceState" direkt in der ScreenOnScreenOffReceiver.class implementieren könnte, aber das habe ich nicht hinbekommen. (The method onRestoreInstanceState(Bundle) is undefined for the type BroadcastReceiver).

4. Ist das überhaupt der richtige Weg oder verfahre ich mich hier gerade richtig? Mein Vorgehen kommt mir gerade ziemlich kompliziert vor, weil ich die Werte ja hin und herschubse. Sind die Alternativen ArrayListen oder direkt die Datenbank?

Freue mich über kurze (oder lange ) Hilfe

Gruß


----------



## The_S (13. Dez 2012)

Speicher den Startwert einfach so zwischen: SharedPreferences | Android Developers . Sparste dir viel hick-hack


----------

