检查活动是否有效

Vin*_*ent 44 android

我在某个活动中遇到了监听器的问题.

问题是这个监听器包含一个alert.show(); 在我们尝试推送新活动(然后给出例外)之后可以调用它.

例如:我正在通过活动A收听来自其他电话的信号.我按下然后尝试运行一个新的活动B,但程序因为alert.show()A的监听器而崩溃.

ERROR/AndroidRuntime(3573): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@476c21c0 is not valid; is your activity running?
Run Code Online (Sandbox Code Playgroud)

我是否可以在A的监听器中检查此活动是否处于活动状态,然后根据此值显示警告?

har*_*ism 65

可能有一种我无法想到的更简单的方法,但一种方法是自己实现它.在onResume()您将成员变量设置mIsRunning为true并onPause()返回false时.使用此布尔值,您应该知道不要调用alert.show()回调.

  • 为什么没有这种检查的内置方法? (21认同)
  • 我只想检查您的活动是否可见,您可以使用`hasWindowFocus()`。我在检查展示广告是否安全时使用了它。 (2认同)

Sam*_*met 17

ArrayList<String> runningactivities = new ArrayList<String>();

ActivityManager activityManager = (ActivityManager)getBaseContext().getSystemService (Context.ACTIVITY_SERVICE); 

List<RunningTaskInfo> services = activityManager.getRunningTasks(Integer.MAX_VALUE); 

    for (int i1 = 0; i1 < services.size(); i1++) { 
        runningactivities.add(0,services.get(i1).topActivity.toString());  
    } 

    if(runningactivities.contains("ComponentInfo{com.app/com.app.main.MyActivity}")==true){
        Toast.makeText(getBaseContext(),"Activity is in foreground, active",1000).show(); 

        alert.show()
    }
Run Code Online (Sandbox Code Playgroud)

这样,您将知道指向的活动是否是当前可见活动,否则您的警报将不会显示.

这仅在我们在没有完成的两个活动之间导航时才有效.

  • 要使上面的代码工作,你需要在你的清单文件中添加`android.permission.GET_TASKS`,否则应用程序崩溃..! (5认同)
  • "注意:此方法仅用于调试和呈现任务管理用户界面.这绝不应该用于应用程序中的核心逻辑,例如根据此处找到的信息在不同行为之间做出决定.不支持这样的用法,并且例如,如果多个应用程序可以同时主动运行,那么为控制流程而对此处数据含义的假设将是不正确的." 来自:http://developer.android.com/reference/android/app/ActivityManager.html#getRecentTasks(int,int) (4认同)

Ali*_*raf 11

当后台线程完成其工作并尝试显示Dialog时,Activity将在其销毁时发生这种情况.

这个例子很少能够重现,但是当我们做一些异步任务/后台操作并想要显示一个带有Activity上下文的对话框时,这意味着我们的活动由于某种原因而破坏了自己.

Android操作系统应该处理这种情况,但截至目前它还没有.

所以在调用对话框之前,只需检查活动是否正在运行而不是在销毁阶段.

if(!isFinishing()){
 callDialog();
}
Run Code Online (Sandbox Code Playgroud)

  • 我完全理解问题是什么,我想告诉你的是`isFinishing()`即使在活动进入后台之后也可以返回false,这意味着活动还没有完成,你仍然会得到发生这种情况时出错. (4认同)

Ric*_*cha 5

完成网络任务后的后台线程在主线程上调用onSuccess()/ onFailure()回调.如果在那时,启动此后台线程任务的活动不在前台,并且您尝试在onSuccess()/ onFailure()中使用getActivity(),它将为您提供异常.因此,在进行任何UI操作之前,请尝试添加此检查.

if(!((Activity) context).isFinishing())
{
    //show alert
}
Run Code Online (Sandbox Code Playgroud)