it-swarm.com.de

Android - Wie überschreibe ich die Schaltfläche "Zurück", damit meine Aktivität nicht beendet wird?

Ich habe derzeit eine Aktivität, bei der eine Benachrichtigung auch in der Benachrichtigungsleiste angezeigt wird, wenn sie angezeigt wird.

Wenn der Benutzer nach Hause drückt und die Aktivität in den Hintergrund gedrängt wird, können sie über die Benachrichtigung zur Aktivität zurückkehren.

Das Problem tritt auf, wenn ein Benutzer die Zurück-Taste drückt, meine Aktivität wird zerstört, die Benachrichtigung bleibt jedoch so, wie ich möchte, dass der Benutzer zurückdrücken kann, aber trotzdem über die Benachrichtigung zur Aktivität gelangen kann. Wenn ein USER dies versucht, bekomme ich Null-Zeiger, weil er versucht, eine neue Aktivität zu starten, anstatt die alte zurückzubringen.

Im Grunde möchte ich, dass die Schaltfläche "Zurück" genauso wie die Schaltfläche "Home" fungiert. So habe ich es bisher versucht:


        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event)  {
            if (Integer.parseInt(Android.os.Build.VERSION.SDK) < 5
                    && keyCode == KeyEvent.KEYCODE_BACK
                    && event.getRepeatCount() == 0) {
                Log.d("CDA", "onKeyDown Called");
                onBackPressed();
            }

            return super.onKeyDown(keyCode, event);
        }

        public void onBackPressed() {
            Log.d("CDA", "onBackPressed Called");
            Intent setIntent = new Intent(Intent.ACTION_MAIN);
            setIntent.addCategory(Intent.CATEGORY_HOME);
            setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(setIntent); 

            return;
        }   

Der obige Code scheint jedoch immer noch zu erlauben, dass meine Aktivität zerstört wird. Wie kann ich verhindern, dass meine Aktivität zerstört wird, wenn die Zurück-Taste gedrückt wird?

178
Donal Rafferty

Entfernen Sie Ihren Schlüssellistener oder geben Sie true zurück, wenn Sie KEY_BACK haben.

Sie brauchen nur die folgenden Informationen, um die Zurück-Taste zu fangen (Achten Sie darauf, super in onBackPressed() nicht aufzurufen).

Wenn Sie vorhaben, einen Dienst im Hintergrund auszuführen, sollten Sie unter startForeground() nachsehen, ob eine laufende Benachrichtigung vorhanden ist. Andernfalls bricht Android Ihren Dienst ab, wenn Speicherplatz freigegeben werden muss.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (Integer.parseInt(Android.os.Build.VERSION.SDK) > 5
            && keyCode == KeyEvent.KEYCODE_BACK
            && event.getRepeatCount() == 0) {
        Log.d("CDA", "onKeyDown Called");
        onBackPressed();
        return true; 
    }
    return super.onKeyDown(keyCode, event);
}


@Override
public void onBackPressed() {
   Log.d("CDA", "onBackPressed Called");
   Intent setIntent = new Intent(Intent.ACTION_MAIN);
   setIntent.addCategory(Intent.CATEGORY_HOME);
   setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   startActivity(setIntent);
}
248
ekawas

Es war einfacher, es nur mit einer Codezeile zu implementieren:

@Override
public void onBackPressed() {
   moveTaskToBack(true);
}
60
Teo Inke

Ich denke, Sie wollen nicht den Zurück-Button überschreiben (das scheint keine gute Idee zu sein - Android OS definiert dieses Verhalten, warum ändern?), Sondern den Activity Lifecycle verwenden und Ihre Einstellungen beibehalten/data im onSaveInstanceState (Bundle) Ereignis.

@Override
onSaveInstanceState(Bundle frozenState) {
    frozenState.putSerializable("object_key",
        someSerializableClassYouWantToPersist);
    // etc. until you have everything important stored in the bundle
}

Dann verwenden Sie onCreate (Bundle) , um alles aus diesem persistenten Bundle herauszuholen und Ihren Zustand neu zu erstellen.

@Override
onCreate(Bundle savedInstanceState) {
    if(savedInstanceState!=null){ //It could be null if starting the app.
        mCustomObject = savedInstanceState.getSerializable("object_key");
    }
    // etc. until you have reloaded everything you stored
}

Betrachten Sie den obigen Pseudo-Code, um Sie in die richtige Richtung zu weisen. Nachlesen des Aktivitätslebenszyklus soll Ihnen helfen, den besten Weg zu finden, um das zu erreichen, wonach Sie suchen.

12
kiswa

mach einfach das ..

@Override
public void onBackPressed() {
    //super.onBackPressed();
}

auskommentieren des //super.onBackPressed (); wird den Trick tun

10
androCoder-BD

Versuche dies:

@Override
public void onBackPressed() {
    finish();
}
3
Thakur

Nur für den Fall, dass Sie mit dem Zurück-Button (am unteren Rand des Telefons) und dem Home-Button (links neben der Aktionsleiste) umgehen möchten, kann Ihnen diese benutzerdefinierte Aktivität, die ich in meinem Projekt verwende, helfen .

import Android.os.Bundle;
import Android.support.v7.app.ActionBar;
import Android.support.v7.app.AppCompatActivity;
import Android.view.MenuItem;

/**
 * Activity where the home action bar button behaves like back by default
 */
public class BackActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setupHomeButton();
    }

    private void setupHomeButton() {
        final ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setHomeButtonEnabled(true);
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case Android.R.id.home:
                onMenuHomePressed();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    protected void onMenuHomePressed() {
        onBackPressed();
    }
}

Anwendungsbeispiel in Ihrer Aktivität:

public class SomeActivity extends BackActivity {

    // ....

    @Override
    public void onBackPressed()
    {
        // Example of logic
        if ( yourConditionToOverride ) {
            // ... do your logic ...
        } else {
            super.onBackPressed();
        }
    }    
}
1
Ferran Maylinch
@Override
public void onBackPressed() {
// Put your code here.
}

//I had to go back to the dashboard. Hence,

@Override
public void onBackPressed() {
    Intent intent = new Intent(this,Dashboard.class);
    startActivity(intent);
}
Just write this above or below the onCreate Method(within the class)
0
user3156040