当只有对 Context 的引用时,关闭当前活动

如果我有一个参考 Context,是否有可能完成当前的活动?

我没有当前活动的参考资料。

73816 次浏览

yes, with a cast:

((Activity) ctx).finish();

If you have access to the running view of the Activity you want to finish (for example, you are in a click listener), you could do:

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

(With thanks to 2red13 to get me here).

In my Case following worked,

I need to finish my activity in a AsyncTask onPostExcute().

Where my AsyncTask class is separate public class , which has a constructor with param of Context.

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

Only the above worked for me... Anyway I got this idea from @2red13 and @lucy answers... Thanks to all...

Try:

((Activity) context.getApplicationContext()).finish();

I know it's an old post but, perhaps it could be a good idea to call it this way:

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

This way we make sure we don't get any unnecesary ClassCastExceptions

If you start the activity using:

startActivityForResult(i, 1);

you can call finishActivity(1) to finish any activities started with that request code, like this:

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

In my case I need to use one in a handler postDelayed. Using this you can be sure of which activity you are finishing. Hope it helps!

I had the same problem when closing a preference activity. Here is what I did:

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();
}
}