对话片段抛出异常

时间:2014-06-06 21:33:17

标签: android android-fragments dialog android-service android-dialogfragment

我有一个从服务接收一些整数的活动。收到某个Integer时,Activity会调用一个对话框片段并显示一个对话框。我的应用程序在活动处于前台时工作得很好。当它在后台时,例如暂停,并且服务发送一个整数,导致出现对话框片段,我得到一个异常

IllegalStateException: Can not perform this action after onSaveInstanceState 

我知道这是因为活动暂停并且尝试调用对话框片段会导致状态丢失。如何让我的应用程序不崩溃,但在重新打开时仍显示活动和对话框?

我使用处理程序来接收服务的整数形式

if (msg.arg1 > 7) 
                {
                    DialogFragment dialog = new YesNoDialog();
                    Bundle args = new Bundle();
                    args.putString("title", "Warning");
                    args.putString("message", "Threshold has been reached");
                    dialog.setArguments(args);
                    //dialog.setTargetFragment(this, YES_NO_CALL);
                    dialog.show(getFragmentManager(), "tag");
                }

所以我希望这段代码能够执行并让用户知道即使应用程序暂停也会发生这种情况,并且当应用程序重新打开时,会出现一个对话框。我的alertdialog应该从主要活动中调用一些方法,例如

.setNegativeButton("Continue", new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                //getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, null);
                ((MyActivity)getActivity()).onContinueClick();
            }
        })
        .setPositiveButton("Stop", new DialogInterface.OnClickListener()
        {
            @Override
            public void onClick(DialogInterface dialog, int which)
            {
                //getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_CANCELED, null);
                ((MyActivity)getActivity()).onStopClick();
            }
        })

除了MyActivity活动在后台时,一切都很完美。

1 个答案:

答案 0 :(得分:0)

由于无法保证当服务发回消息时您的活动仍然存在,因为它可能已被销毁,您最好让服务创建notification,当点击该服务时会启动显示的活动你的对话。

另一种方法是服务将消息存储在共享首选项中,然后广播指示消息准备就绪的意图。活动将在正在运行时监听这些广播,显示对话框并从共享首选项中删除消息。每次创建或恢复活动时,您都会检查消息并执行相同操作(因为如果没有侦听器,广播意图就会丢失)。

相关问题