finish activity from non activity

2019-05-07 14:11发布

问题:

I am developing an app. I want to call a alert dialog from 1st activity. The alert dialog is written in another class which is a non activity class. The need of application is that the calling activity should finish from alert which is written in non activity class. The code of calling the alert is as below.

Calling the alert from 1st activity:

public class Activity1 extends Activity {
    /** Called when the activity is first created. */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_layout);
    }// End of onCreate.

        /** Back Button. */
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            String message = "Do you Want to Exit.";
            Utility.callAlert(message, getApplicationContext());
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }   
}

And the called class having alert dialog is :

public class Utility {
    // callAlert method to display alert, when exception occur.
    public static void callAlert(String message, final Context context){
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
        alertDialogBuilder.setTitle("MyApplication.");
        alertDialogBuilder.setMessage(message);
        alertDialogBuilder.setNeutralButton("Ok", new DialogInterface.OnClickListener() {                   

            public void onClick(DialogInterface dialog, int which) {
                ((Activity1)context.getApplicationContext()).finish();
            } //end onClick.
        }); // end alertDialog.setButton.
        alertDialogBuilder.show();  
    }
}

But this gives me the error as :

02-25 17:00:45.961: D/AndroidRuntime(444): Shutting down VM
02-25 17:00:45.961: W/dalvikvm(444): threadid=1: thread exiting with uncaught exception (group=0x40015560)
02-25 17:00:45.971: E/AndroidRuntime(444): FATAL EXCEPTION: main
02-25 17:00:45.971: E/AndroidRuntime(444): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.view.ViewRoot.setView(ViewRoot.java:531)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.app.Dialog.show(Dialog.java:241)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.app.AlertDialog$Builder.show(AlertDialog.java:802)
02-25 17:00:45.971: E/AndroidRuntime(444):  at com.xxx.myapp.specialclasses.Utility.callAlert(Utility.java:25)
02-25 17:00:45.971: E/AndroidRuntime(444):  at com.xxx.myapp.activities.Activity1.onKeyDown(Activity1.java:149)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.view.KeyEvent.dispatch(KeyEvent.java:1256)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.app.Activity.dispatchKeyEvent(Activity.java:2078)
02-25 17:00:45.971: E/AndroidRuntime(444):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1663)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2560)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2535)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1867)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.os.Handler.dispatchMessage(Handler.java:99)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.os.Looper.loop(Looper.java:123)
02-25 17:00:45.971: E/AndroidRuntime(444):  at android.app.ActivityThread.main(ActivityThread.java:3683)
02-25 17:00:45.971: E/AndroidRuntime(444):  at java.lang.reflect.Method.invokeNative(Native Method)
02-25 17:00:45.971: E/AndroidRuntime(444):  at java.lang.reflect.Method.invoke(Method.java:507)
02-25 17:00:45.971: E/AndroidRuntime(444):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-25 17:00:45.971: E/AndroidRuntime(444):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-25 17:00:45.971: E/AndroidRuntime(444):  at dalvik.system.NativeStart.main(Native Method)
02-25 17:05:46.061: I/Process(444): Sending signal. PID: 444 SIG: 9

回答1:

instead of:

Utility.callAlert(message, getApplicationContext());

use:

Utility.callAlert(message, Activity1.this);

and

public void onClick(DialogInterface dialog, int which) {
                ((Activity)context).finish();
}


回答2:

try this:

public class Utility {
  // callAlert method to display alert, when exception occur.
  public static void callAlert(String message, final Activity activity){
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity);
    alertDialogBuilder.setTitle("MyApplication.");
    alertDialogBuilder.setMessage(message);
    alertDialogBuilder.setNeutralButton("Ok", new DialogInterface.OnClickListener() {                   

        public void onClick(DialogInterface dialog, int which) {
            activity.finish();
        } //end onClick.
    }); // end alertDialog.setButton.
    alertDialogBuilder.show();  
  }
}


回答3:

Try this, You are not creating Dialog

AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context).create();


回答4:

I think I know your answer because I've done it myself once. Here's my code and it works well!

((Activity)context) can be used to call your Activity.

NonActivityClass nonActivityClass = new NonActivityClass(YourActivityClass.this);
nonActivityClass.finishIt();

Here's NonActivityClass.

public class NonActivityClass() {
    private Context context;

    public NonActivityClass(Context context) {
        this.context=context;
    }

    public void finishIt() {
        //Remember to import android.app.Activity; in this class!
        ((Activity)context).finish(); //This destroy the your activity class
    }
}

Also, it can be used to run your UI thread from non-Activity class. For example,

((Activity)context).runOnUiThread() {
    //Your stuff here!
}

Hope it helps you!



回答5:

In the activity, create a new class

static public void finishThisActivity() {
    finish();
}

and call it from your dialog class

YourActivityName.finishThisActivity();

or try

YourActivityName.finish();