安卓 - 如何在活动结束后显示对话框

9
假设我们有两个活动,Activity1和Activity2。
在Activity1的onClick()方法中,如果某个按钮被按下,我们会调用启动Activity 2:
Intent myIntent = new Intent(Activity1.this, Activity2.class);
Activity1.this.startActivity(myIntent);

在Activity2中调用finish()后,Activity1将恢复,我需要在Activity1恢复后立即显示一个对话框。
之前,我只是在Activity1的onClick()方法的同一块中调用showDialog(id)。
public void onClick(View v) {
     if(v == addHole){
     //...
     Intent myIntent = new Intent(Activity1.this, Activity2.class);
     Activity1.this.startActivity(myIntent);
     showDialog(END_DIALOG_ID);
     }
}

问题在于,在Activity1恢复后,与END_DIALOG_ID相对应的对话框不可见,但屏幕变暗且无响应(就像对话框存在一样),直到按下返回键。
我尝试将showDialog()方法放置在Activity1的onResume()和onRestart()方法中,但这两者都会使程序崩溃。
我还尝试在Activity2中创建一个AsyncTask方法,并在其onPostExecute()中调用showDialog()方法,但对话框在Activity2中不可见。
private class ShowDialogTask extends AsyncTask<Void, Void, Integer> {
    /** The system calls this to perform work in a worker thread and
     * delivers it the parameters given to AsyncTask.execute() */
    protected Integer doInBackground(Void... id) {
        //do nothing
        return END_DIALOG_ID;
    }

    /** The system calls this to perform work in the UI thread and delivers
     * the result from doInBackground() */
    protected void onPostExecute(Integer id) {
        super.onPostExecute(id);
        showDialog(id);

    }
}

我现在正在尝试通过调用

来实现这一点


Activity1.this.startActivityForResult(myIntent, END_DIALOG_REQUEST);

通过Activity1中的setResult()和onActivityResult()方法与之对应,可以实现这一功能。但是,似乎有更好的实现方式。我只需要在Activity2结束时显示一个对话框即可。
非常感谢您所提供的任何帮助。

1
我本来想建议使用startActivityForResult和onActivityResult,但你似乎已经自己发现了。对我来说,这是实现你想要的最直接的方法。 - mportuesisf
3个回答

9

像您建议的那样,在启动Activity2时调用startActivityForResult。然后,重写onActivityResult并检查RESULT_OK,然后显示对话框。这是实现您想要做的事情的完全可接受的做法。


谢谢。这似乎是最好的答案,因为覆盖onResume()会导致对话框在第一次启动Activity1时显示,而onRestart()会在应用程序失去焦点时导致对话框显示。使用startActivityForResult似乎更好,因为仅会在Activity2完成(或通过BACK键取消)时显示对话框。再次感谢! - avoyles
不用客气。还有一件需要记住的事情是,如果用户导航到另一个应用程序(电话、短信等),然后返回到您的活动,则会调用onResume() - wsanville
嗯,是的。那是个好点子。但我认为startActivityForResult会更好,因为我只想在Activity2完成并Activity1重新获得焦点后才显示对话框。该对话框用于获取时间戳,并且需要在Activity2返回到Activity1时进行。 - avoyles

0

如果您不需要从Activity2中获取任何内容,可以使用onResume方法。

@Override
public void onResume(){
    super.onResume();
    //do something
}

在onResume()中使用showDialog()也会导致在Activity1首次创建时显示对话框。 - avoyles
然而,使用onRestart而不是onResume似乎能够按预期工作。我之前尝试过这样做,但忘记调用super.onRestart()。除了Activity2完成后之外,还有哪些情况可能会导致调用onRestart()需要担心? - avoyles
你需要确保在onRestart()中使用的每个变量都已经被初始化/重新初始化,否则它会抛出NullPointerException异常。 - Hein

0

我必须返回到根活动 - MainActivity,可能关闭多个活动,然后显示对话框。因此,我选择了另一种方式。

MyDialog {
    public static synchronized void planToShowDialog(String info) {
        if (info != null) {
            saveInfoToPreferences(info);
        }
    }

    public static synchronized void showDialogIfNecessary(Context context) {
        String info = readInfoFromPreferences(); 
        if (info != null) {
            saveInfoToPreferences(null); // Show dialog once for given info.
            new MyDialog(context, info).show();
        }
    }

    private static String readInfoFromPreferences() {
        //...
    }

    private static void saveInfoToPreferences(String info) {
        //...
    }
}

我在MainActivity.onPostResume()方法中调用MyDialog.showDialogIfNecessary()。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接