【问题标题】:Android ProgressDialog no longer visible after another application pushes my activity away在另一个应用程序将我的活动推开后,Android ProgressDialog 不再可见
【发布时间】:2016-10-17 16:21:33
【问题描述】:

假设我有 2 个在 API 级别 8 设备上运行的应用程序 A 和 B。

从 A 开始,我开始一个活动,该活动开始一个长时间运行的解压缩过程(假设大约 4 个演出)。我在 ProgressDialog 中显示此进度。

与此同时,通过手动操作,操作会导致 B 响应并将带有 ProgressDialog 的 Activity 推离屏幕(调用 onStop)。 我执行了一些操作,完成后我隐藏了 B 的活动。 让 A 的活动重新出现在屏幕上(调用 onResume)。

但是 ProgressDialog 消失了,即使长时间运行的进程仍在运行。调用 OnStop 后,我的 ProgressDialog 是如何消失的,为什么它没有在我的 OnResume 中返回?


可能活动的上下文已经改变,因此使用活动上下文调用的 ProgressDialog 也消失了。但由于长时间运行的进程仍在运行并且处于工作状态,我应该也能够获得相同的 ProgressDialog 实例。 但是仅仅调用 .show() 是行不通的。

请注意,该功能在单个应用程序中运行良好。当 2 个应用程序相互竞争时,这纯粹是有问题的。

【问题讨论】:

    标签: android progressdialog


    【解决方案1】:

    在状态恢复之间不会单独保留对话框,如果您希望系统恢复对话框,则需要使用 DialogFragment。

    【讨论】:

    • 问题在于我们不能允许它们,因为我们仍然接受 API 8 级设备(不要问我为什么......)。调整了问题。
    • 然后您需要在 OnSaveInstanceState 中检查您的对话框是否显示,如果是,则将该布尔值保存在包中,然后 OnCreate/onRestoreInstanceState 读取该布尔值并重新创建对话框。另外为了避免内存泄漏,在 onPause 中隐藏对话框并在 onResume 中显示它
    • 那行不通,因为 OnCreate/onRestoreInstanceState 没有被触发。该活动不是从头开始构建的。
    【解决方案2】:

    您可以从解压缩过程中发送广播,并在活动中注册一个广播接收器,该接收器显示一个带有进度的对话框。

    如果您想使用对话框片段方法,可以使用向后兼容早期 Android 版本的support library

    或者只是根据活动生命周期显示隐藏对话框:

    public class MainActivity extends Activity {
    
    private ProgressDialog mDialog;
    
     @Override
        protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    mDialog=new ProgressDialog(this);
    
    }
    @Override
        protected void onResume() {
            super.onResume();
            mDialog.show();
        }
    @Override
        protected void onStop() {
            super.onStop();
            mDialog.hide();
        }
    @Override
        protected void onDestroy() {
            super.onDestroy();
            if(mDialog!=null){
                mDialog.dismiss();
            }
        }
    }
    

    【讨论】:

    • mm,我还没有想到。本地广播可以提供我需要的进度。我会试一试的。
    • 我遇到了与此解决方案类似的问题。 progressDialog 仍然声称存在并声称它在屏幕上显示为 isShowing()。添加支持库也不是一种选择,因为我必须保持当前解决方案的旧的邪恶丑陋的编程风格(我很遗憾)。进度对话框的上下文似乎与我要与之比较的上下文不匹配。由于进度对话框似乎正在显示,但已被旧的重新启动活动覆盖。我不应该尝试让它再次出现在前台吗?到目前为止我无法做到,但仍然......
    • 这是显示对话框的标准方式。不幸的是,这也不适用于这种情况。问题是 ProgressDialog 的上下文在 OnStop -> OnRestart -> OnStart -> OnResume 循环之后没有更新到正确的上下文。因此,当活动重新弹出并更新其上下文时,ProgressDialog 仍保留在下方。也许我应该只编写 ProgressDialog 的自定义扩展,并添加一个更新上下文的功能,但我不确定这是否会起作用。
    • 你只需要跟踪你的进度值,要么通过广播发送它,要么将它存储在某个地方并在你的活动的 onResume 中检索它
    • progressvalue 不是问题,因为解压缩过程是计算这个值的过程。如果我的带有progressdialog 的应用程序进入后台(主屏幕)并通过通知栏访问它返回,则progressdialog 没有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多