# 2x auf Zurück-Taste zum Schließen



## Lucaaa (14. Feb 2017)

Hallo!
Ich habe eine kleine Taschenlampe programmiert. Die Lampe an sich funktioniert auch so wie sie soll aber jetzt wollte ich noch eine Funktion einbauen, dass wenn man auf die Züruck-Taste drückt sich die App nicht gleich schließt, sondern erst eine Nachricht angezeigt wird dass man zum schließen nochmal auf zurück drücken muss. 
Aber irgendwie funktioniert das nicht. 
Hier der Code:


```
package com.example.androlamp;

import android.app.Activity;
import android.content.pm.PackageManager;

import android.hardware.Camera.Parameters;
import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.Toast;

   
public class MainActivity extends Activity {

    Switch s1;
    android.hardware.Camera cam; 
    Parameters param; 
    boolean licht;
   
    boolean pressedBackKey;
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
   
    s1 = (Switch) findViewById(R.id.switch1);
    s1.setOnCheckedChangeListener(new OnCheckedChangeListener() {
       
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
           
            if(isChecked == true) {
                if(getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) {
                    if(cam == null) {
                        cam = android.hardware.Camera.open();
                    }
                   
                    param = cam.getParameters();
                    param.setFlashMode(Parameters.FLASH_MODE_TORCH);
                    cam.setParameters(param);
                    cam.startPreview();
                   
                    licht = true;
                   
                } else {
                    Toast.makeText(getApplicationContext(), "your cellphone do not have a flash!", Toast.LENGTH_SHORT).show();
                }
            }
            if(isChecked == false) {
                lichtaus();
            }
           
        }
        });
    }


public void lichtaus() {
    if(licht == false) {
        cam = android.hardware.Camera.open();
    }
   
    param = cam.getParameters();
    param.setFlashMode(Parameters.FLASH_MODE_OFF);
    cam.setParameters(param);
    cam.stopPreview();
   
    licht = false;
   
   
   
}


@Override
protected void onPause() {
    if (licht == true) {
    lichtaus();
    cam.release();
}
    super.onPause();
}

    @Override
    protected void onResume() {
        s1.setChecked(false);
        super.onResume();
    }


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK )    {
            if (pressedBackKey = false) {
                pressedBackKey = true; 
                Toast.makeText(getApplicationContext(), "Zurücktaste doppelt drücken um App zu schließen", Toast.LENGTH_SHORT).show();
               
                new Handler().postDelayed(new Runnable() {
                   
                    @Override
                    public void run() {
                        pressedBackKey = false;
                    }
                } , 3000); 
            } else if (pressedBackKey = true) {
                onBackPressed();
            }
           
           

 
 
   
   



   
}
        return true;
    }
}
```


----------



## Robat (14. Feb 2017)

Ich würde es nicht mit der `onKeyDown(int, KeyEvent);` Methode machen sondern gleich die `onBackPressed()` Methode überschreiben.

Hier mal ein kleines Beispiel wie ich es machen würde:



Spoiler: Mögliche Lösung





```
boolean backPressedOnce= false;
@Override
public void onBackPressed()
{
    if(backPressedOnce)
    {
         super.onBackPressed();
         return;
    }
 
    this.backPressedOnce = true;
    Toast.makeText(this, "Press back again to exit.", Toast.LENGTH_LONG).show();

    new Handler().postDelayed(new Runnable()
    {
          @Override
          public void run()
          {
               backPressedOnce = false;
          }
    }, 3000);
}
```




*Anmerkungen zu deinem Code:*
(1)
Achte darauf, dass du zum vergleichen `==` nimmst. Du hast einige IFs drinne wo du in der Bedingung einer Variable mittels `=` einen Wert zuweißt. Daher geht dein Code auch nicht.

(2)
Die `onBackPressed()` Methode solltest du über `super.onBackPressed()` aufrufen.

Lg


----------



## Lucaaa (14. Feb 2017)

ok. Danke jetzt geht auch alles. 
Macht es denn einen Unterschied ob ich es mit 
	
	
	
	





```
super.onBackPressed()
```
 mache?


----------



## Robat (14. Feb 2017)

Ja macht es! 

Nimm dir noch mal 5 Minuten Zeit und lies dir einen Artikel über das Schlüsselwort `super` durch. 
Dann sollte alles klarer werden 

Orcale Docs super and super()

Gruß Robert


----------

