我有以下Android方案:
我的活动启动异步任务以执行后台活动(AsyncTask
类),然后搜索帐户。如果没有帐户,则在前一个AsyncTask仍在运行时,通过AbstractAuthenticator
调用创建新帐户的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时就会做我的逻辑。
欢迎任何其他(和更简单)的解决方案。 SDK 7。
谢谢
答案 0 :(得分: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;
}
}
答案 1 :(得分:0)
据我所知,没有方法可以让您知道活动是否可见。
解决此问题的一种方法是在Application类中保留一个变量,表示此Activity是否位于顶部。要实现此功能,您需要在Activity的onPause()
和onResume()
方法中对其进行管理。使用静态getter和setter方法创建一个变量,例如private boolean myActivityOnTop = false
。在onPause()
中,将此变量设置为false,并在onResume
中再次将其设置为true。然后用getter方法替换isActivityOnTop()
。如果你想通过将这个活动设置为int,string或enum并在调用任何活动'onResume
时设置它,你可以做同样的事情。
另外,只是一个提示,每当一个Activity被推到后台时,都不能保证Android不会破坏它。您可以将displayAlertOnStart
设置为true,但随后会销毁Activity。当它在返回到前面时重新启动时,将重新创建活动,并且不会知道显示对话框。在开始新活动后您想要维护的任何变量应该在onSaveInstanceState()
中捆绑,并在onCreate()
或onRestoreInstanceState()
中重新初始化。