我开始在后台线程中下载/上传文件,并在操作失败时最终显示一个对话框。
对于正在下载/上传的情况,可以将应用转到后台,网络可能会关闭或可能会暂时断开连接。如果我在应用程序处于后台时尝试显示对话框,我将收到以下崩溃。
W/System.err(10235): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
E/ConnectivityService( 455): EVENT_NETWORK_INFO_CHANGED from unknown NetworkAgent
D/ConnectivityService( 455): setProvNotificationVisibleIntent: E visible=false networkType=0 extraInfo=null
W/System.err(10235): at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1842)
W/System.err(10235): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1860)
W/System.err(10235): at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:650)
W/System.err(10235): at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:609)
W/System.err(10235): at android.support.v4.app.DialogFragment.show(DialogFragment.java:143)
W/System.err(10235): at android.os.AsyncTask.finish(AsyncTask.java:636)
W/System.err(10235): at android.os.AsyncTask.access$500(AsyncTask.java:177)
W/System.err(10235): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask)
我当然希望避免这种情况在应用程序处于后台时显示对话框。该对话框应显示应用程序何时恢复。如何在不需要设置布尔标志的情况下优雅地执行此操作。
我不想检查应用当前是否处于后台。当应用再次登陆后台时,我只打算自动显示对话框。
答案 0 :(得分:0)
...... 以前在后台检查应用程序的代码(已被删除).....
如果app在后台,此方法将返回true 显示您可以使用此结果显示对话框
if(!isAppIsInBackground(context)){
//show the dialog
}else{
//Do as you need
}
您可以使用活动作为对话框显示这样的对话框
public class DialogActivity extends Activity {
String message = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_dialog);
message = getIntent().getStringExtra("message");
if(message!=null) {
displayAlert(message);
}
}
private void displayAlert(String msg)
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Network alert!");
builder.setMessage(msg)
.setCancelable(false)
.setPositiveButton("OK",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
finish();
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
<activity android:name=".DialogActivity"
android:theme="@android:style/Theme.Holo.Light.Dialog">
</activity>
private void showDialog(String your_message){
Intent intent=new Intent(this,DialogActivity.class);
intent.putExtra("message",message);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
此方式对话框将自动显示。 如果应用程序在后台,它将阻止显示对话框。 如果应用程序不在任何活动的后台,它可以显示对话框。