Schließen Sie die aktuelle Aktivität, wenn Sie nur einen Verweis auf Kontext haben

Antworten:

233

ja, mit einer Besetzung:

((Activity) ctx).finish();
2red13
quelle
2
Nur wenn es die aktuelle Aktivität ist, sonst wird die nicht aktuelle Aktivität beendet :)
ernazm
3
Dies kann zu Problemen führen, wenn Contextes sich tatsächlich um einen Anwendungskontext handelt.
user634618
1
Wie mache ich das, wenn der Kontext ein Anwendungskontext ist? Ich führe einen Timer-Thread in einer Klasse aus und wenn die Zeit abgelaufen ist, möchte ich die aktuelle Aktivität dieser Klasse schließen.
Sando
Ich habe dasselbe in meinem onPostExecute () verwendet. Ich möchte die aktuelle Aktivität schließen, aber sie wird dynamisch sein. Ich rufe AsyncTask von einer der Aktivitäten aus auf und erhalte eine Classcast-Ausnahme. irgendeine Hilfe.
Chandra Kiran
2
Ich sehe keine Probleme. Wenn es sich um einen Anwendungskontext handelt, erzwingt eine Klassenkastenausnahme das Schließen Ihrer App und beendet alle Aktivitäten damit!
Dmiters
13

In meinem Fall hat folgendes funktioniert,

Ich muss meine Aktivität in einer AsyncTask onPostExcute () beenden.

Wobei meine AsyncTask-Klasse eine separate öffentliche Klasse ist, die einen Konstruktor mit dem Parameter Context hat.

((Activity)(mContext)).finish();

Nur das oben Genannte hat bei mir funktioniert ... Wie auch immer, ich habe diese Idee von @ 2red13 und @lucy Antworten bekommen ... Danke an alle ...

Kartihkraj Duraisamy
quelle
Dies ist jetzt in einer anderen Form ((Activity) mContext).finish().
XYZ
13

Ich weiß, dass es ein alter Beitrag ist, aber vielleicht könnte es eine gute Idee sein, ihn so zu nennen:

if(context instanceof Activity){
                ((Activity)context).finish(); }

Auf diese Weise stellen wir sicher, dass wir keine unnötigen ClassCastExceptions erhalten

Alan Poggetti
quelle
2

Wenn Sie Zugriff auf die laufende Ansicht der Aktivität haben, die Sie beenden möchten (z. B. befinden Sie sich in einem Klick-Listener), können Sie Folgendes tun:

((Activity)getContext()).finish();

(Danke an 2red13, um mich hierher zu bringen).

Lucy
quelle
1

Wenn Sie die Aktivität starten mit:

startActivityForResult(i, 1);

Sie können finishActivity (1) aufrufen, um alle mit diesem Anforderungscode gestarteten Aktivitäten wie folgt abzuschließen:

((Activity)getContext()).finishActivity(1);

In meinem Fall muss ich einen in einem Handler postDelayed verwenden. Auf diese Weise können Sie sicher sein, welche Aktivität Sie beenden. Ich hoffe es hilft!

Casey Murray
quelle
-1

Ich hatte das gleiche Problem beim Schließen einer Präferenzaktivität. Folgendes habe ich getan:

public class T2DPreferenceActivity extends PreferenceActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
          getFragmentManager().beginTransaction().replace(android.R.id.content,
                new T2DPreferenceFragment()).commit();
    }

    public static class T2DPreferenceFragment extends PreferenceFragment {
        @Override
        public void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.server_screen_preference);
            Preference testServicePreference = getPreferenceScreen().findPreference("PREFERRED SERVER");
            testServicePreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                    T2DPreferenceActivity.closeActivity(getActivity());
                    return true; //returning true still makes the activity handle the change to preferences
                }
            });
        }

        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            ListView lv = (ListView)view.findViewById(android.R.id.list);
            ViewGroup parent = (ViewGroup)lv.getParent();
            parent.setPadding(0, 100, 0, 0);
        }
    }

    protected static void closeActivity(Activity activity) {
        activity.finish();
    }
}
Droide Chris
quelle
-3

Versuchen:

((Activity) context.getApplicationContext()).finish();
Paolo Loconsole
quelle
7
Verwenden Sie diese "Lösung" nicht! Sie können nicht erraten (und wahrscheinlich liegen Sie immer falsch), dass Ihr Anwendungskontext mit Ihrer Aktivität identisch ist.
Marciowb