0

我有以下Android场景:

我的活动启动一个异步任务来执行后台活动(AsyncTask类),然后搜索帐户。AbstractAuthenticator如果不存在帐户,则在前一个 AsyncTask 仍在运行时,会通过调用 UI 来创建新帐户。

该任务最终将在我之前活动的主线程上完成并运行 onPostExecute。

我的问题如下:如果任务在我的活动处于顶部时完成,AlertDialog则正确显示;相反,如果在用户输入新帐户的用户名/密码时任务完成,我会InvocationTargetException在尝试显示警报时收到一个。

实际上,AlertDialog 必须仅在活动处于活动状态时才显示。我可以修改我的代码并利用onStart以下伪代码的方法:

public class MyActivity {
    private boolean displayAlertOnStart = false;

    protected void onStart(){
        super.onStart();
        if (displayAlertOnStart){
            displayAlert();
            displayAlertOnStart = false;
        }
    }


    private void handleTaskCallback() {
        if (activityIsOnTop()) //How do I get this???
           displayAlert();
        else
           displayAlertOnStart = true;
    }

我想以编程方式知道当前活动是“在顶部”还是另一个活动是前台。这样我会在下次运行 onStart 时执行我的逻辑。

欢迎任何其他(和更简单的)解决方案。开发工具包 7。

谢谢

4

2 回答 2

1

为什么不能在 onStart() 和 onStop() 方法中使用状态变量来维护 Activity 的状态?

public class MyActivity {
    private boolean displayAlertOnStart = false;
    private boolean activityInAStartedState = false;

    protected void onStart(){
        super.onStart();
        activityInAStartedState = true;

        if (displayAlertOnStart){
            displayAlert();
            displayAlertOnStart = false;
        }
    }

    public void onStop(){
       super.onStop();
       activityInAStartedState = false;
    }


    private void handleTaskCallback() {
        if (activityInAStartedState) 
           displayAlert();
        else
           displayAlertOnStart = true;
      }    
}
于 2012-05-04T16:53:56.073 回答
0

据我所知,没有任何方法可以让您知道活动是否可见。

解决此问题的一种方法是在您的 Application 类中保留一个变量,该变量表示此 Activity 是否位于顶部。要实现这一点,您需要在 ActivityonPause()onResume()方法中对其进行管理。创建一个变量,类似于private boolean myActivityOnTop = false静态 getter 和 setter 方法。在onPause()中,将此变量设置为 false,并在 中再次使其为 true onResume。然后isActivityOnTop()用getter方法替换。onResume如果您想通过将其设为 int、string 或 enum 并在任何活动被调用时设置它来知道多个活动中的哪一个在顶部,您可以做同样的事情。

另外,提示一下,每当一个 Activity 被推送到后台时,都不能保证 Android 不会破坏它。有可能您设置displayAlertOnStart为 true,但随后 Activity 被销毁。当它被带回到前面重新启动时,Activity 将被重新创建,并且不知道要显示 Dialog。开始新活动后您想要维护的任何变量都应该在or中捆绑onSaveInstanceState()并重新初始化。onCreate()onRestoreInstanceState()

于 2012-05-04T17:09:11.413 回答