2017-01-28 1 views
1

Ich entwickle eine App, die zählt, wie oft die App in den Hintergrund geht. Es behält auch die Werte bei, wenn die Ausrichtung geändert wird. Obwohl ich alle Anwendungsfälle funktioniere, habe ich einen Anwendungsfall, der nicht funktioniert.Zählen, wie oft Android-App in den Hintergrund geht

Fall: Wenn ich die Home-Taste drücke, ändere die Ausrichtung des Telefons und öffne die App erneut. Es öffnet sich im Querformat, aber die Hintergrundzählung erhöht sich nicht. Ich habe versucht, Werte in allen Lebenszyklusmethoden zu setzen. Es funktioniert nicht. Hoffe jemand kann mir dabei helfen. `

public class MainActivity extends AppCompatActivity { 

    private int clickCount =0, backgroundCount = 0; 
    TextView tvClickCountValue, tvBackgroundCountValue; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if(savedInstanceState != null){ 
      clickCount = savedInstanceState.getInt("COUNT"); 
      backgroundCount = savedInstanceState.getInt("BGCOUNT"); 
     } 
     setContentView(R.layout.activity_main); 
     tvClickCountValue = (TextView) this.findViewById(R.id.tvClickCountValue); 
     tvBackgroundCountValue = (TextView) this.findViewById(R.id.tvBackgroundCountValue); 
     setView(MainActivity.this); 

    } 

    public void onClick(View v){ 

     clickCount += 1; 
     tvClickCountValue.setText(Integer.toString(clickCount)); 

    } 

    public void setView(Context ctx){ 

     tvClickCountValue.setText(Integer.toString(clickCount)); 
     tvBackgroundCountValue.setText(Integer.toString(backgroundCount)); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     backgroundCount += 1; 

    } 


    @Override 
    protected void onResume() { 
     super.onResume(); 
     tvClickCountValue.setText(Integer.toString(clickCount)); 
     tvBackgroundCountValue.setText(Integer.toString(backgroundCount)); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt("COUNT", clickCount); 
     outState.putInt("BGCOUNT", backgroundCount); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     super.onRestoreInstanceState(savedInstanceState); 
     clickCount = savedInstanceState.getInt("COUNT"); 
     backgroundCount = savedInstanceState.getInt("BGCOUNT"); 
    } 
} 
+0

'onPause()' Methode wird aufgerufen, wenn App in den Hintergrund geht oder geschlossen wird (oder getötet wird), Zähler in 'onPause()' inkrementieren und in 'onDestroy' dekrementieren, um Schließen zu berücksichtigen. –

+0

Dies ist ein interessanter Artikel: http://stackoverflow.com/questions/4414171/how-to-detect-when-an-android-app-goes-to-the-background-and-come-back-to-the- fo? rq = 1 – Stanojkovic

+0

Sie können Sharedreference verwenden. – Tauqir

Antwort

1

Dieser Artikel enthält nützliche Informationen: https://developer.android.com/guide/topics/resources/runtime-changes.html vor allem im Abschnitt über die Änderung Handhabung.

Versuchen Sie, es unter von Ihnen zu bearbeiten. Die Aktivität wurde bei Orientierungsänderungen neu gestartet. Ansonsten finden Sie wahrscheinlich in diesem Artikel, welcher Fall für Ihr Szenario zutrifft.

Wenn ich die Problembeschreibung lese, gehe ich davon aus, dass die Anwendung wie vorgesehen funktioniert, wenn Sie das Gerät nicht drehen.

+0

Das ist richtig. Wenn ich das Gerät nicht drehe, funktioniert die Hintergrundzählung gut. Das Problem tritt nur auf, wenn ich die App in den Hintergrund verschiebe, den Startbildschirm rotiere und die Anwendung zurück in den Vordergrund ziehe. Es bleibt gleich. Im Idealfall sollte es den Zähler erhöhen. – Pavan

+1

Meine Vermutung ist was ich oben erwähnt habe. Hattest du Glück dabei? Spielen Sie herum, indem Sie in Ihrer Aktivitätsdeklaration in der Manifest-Datei "android: configChanges =" orientation | keyboardHidden "' hinzufügen/entfernen und setzen Sie Breakpoints auf Lifecycle-Methoden, um zu sehen, wohin es beim nächsten Mal geht. 'onConfigurationChanged()' ist eine gute Wette, und es war nicht in Ihrem Code. – jackgu1988

0

Sie benötigen die Zählung in den SharedPreferences bestehen bleiben. Jedes Mal, wenn Sie die App erneut öffnen, lesen Sie den letzten Wert aus den SharedPreferences. Und jedes Mal, wenn die App ausgeblendet wird, inkrementieren und in SharedPreferences speichern.

Dann können Sie die mit @kiran code zählen:

public class BaseActivity extends Activity { 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    } 

    public static boolean isAppInFg = false; 
    public static boolean isScrInFg = false; 
    public static boolean isChangeScrFg = false; 

    @Override 
    protected void onStart() { 
     if (!isAppInFg) { 
      isAppInFg = true; 
      isChangeScrFg = false; 
      onAppStart(); 
     } 
     else { 
      isChangeScrFg = true; 
     } 
     isScrInFg = true; 

     super.onStart(); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 

     if (!isScrInFg || !isChangeScrFg) { 
      isAppInFg = false; 
      onAppPause(); 
     } 
     isScrInFg = false; 
    } 

    public void onAppStart() { 
     // app in the foreground 
     // show the count here. 

    } 

    public void onAppPause() { 
     // app in the background 
     // start counting here. 
    } 
} 
+0

Nun, ich speichere die Instanz und stelle sie wieder her. Es funktioniert also gut, wenn ich die Ausrichtung nicht ändere. Aber wenn ich das Gerät rotiere, bleiben die Werte bestehen, aber es erhöht den Zähler nicht. – Pavan

Verwandte Themen