我正在做一个Android项目。我有扩展AppCompatActivity
的BaseActivity
,然后我有另一个扩展BaseActivity
的activity StartActivity
。我在BaseActivity中有我要调用的AlertDialog。
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.setCancelable(false);
alertDialog.setTitle(getResources().getString(R.string.title_attention));
alertDialog.setMessage(getResources().getString(R.string.message_permission_denied));
alertDialog.setPositiveButton(getResources().getString(R.string.button_settings), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent myAppSettings = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.parse("package:" + getApplicationContext().getPackageName()));
myAppSettings.addCategory(Intent.CATEGORY_DEFAULT);
myAppSettings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplicationContext().startActivity(myAppSettings);
}
});
alertDialog.setNegativeButton(getResources().getString(R.string.button_exit),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
aDialog.dismiss();
finish();
}
});
aDialog = alertDialog.create();
aDialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
aDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.colorButtonPositive));
aDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.colorButtonNegative));
}
});
if (!aDialog.isShowing())
aDialog.show();
而且我还覆盖了BaseActivity中的onDestroy
方法,
@Override
protected void onDestroy() {
super.onDestroy();
try{
runOnUiThread(new Runnable() {
@Override
public void run() {
if (aDialog != null && aDialog.isShowing()) {
aDialog.dismiss();
}
}
});
}catch (Exception e){
new ErrorPrinter(e.toString());
}
}
StackTrace/错误日志,
01-13 08:38:59.928 5501-5501/com.company.android E/WindowManager: android.view.WindowLeaked: Activity com.company.android.activities.StartActivity has leaked window com.android.internal.policy.PhoneWindow$DecorView{7a59bc1 V.E...... R......D 0,0-1160,413} that was originally added here
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:368)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:299)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
at android.app.Dialog.show(Dialog.java:319)
at com.company.android.activities.BaseActivity.permissionDenied(BaseActivity.java:216)
at com.company.android.activities.BaseActivity.onRequestPermissionsResult(BaseActivity.java:160)
at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:6582)
at android.app.Activity.dispatchActivityResult(Activity.java:6460)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3695)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3742)
at android.app.ActivityThread.-wrap16(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
但是我在安卓监视器中得到了异常,StartActivity已经泄漏了最初添加在这里的窗口。谁能告诉我怎样才能解决这个错误?
我扩展到BaseActivity的原因是我想为所有的活动使用一些功能,这样我就可以一次编写或删除代码,它将在所有的活动中使用。
谢谢。
发布于 2017-01-13 14:18:45
这是因为当活动暂停时,它将被垃圾回收,但由于对话框仍未关闭,警报对话框仍有对该活动的引用。
您需要在BaseActivity中覆盖onPause()和onStop():
@Override
public void onPause() {
super.onPause();
if(aDialog != null)
aDialog.dismiss();
}
@Override
protected void onStop() {
super.onStop();
if(aDialog != null)
aDialog.dismiss();
}
在启动另一个活动时,还要在alertDialog.setPositiveButton()
中的此行之后关闭对话框并完成活动:
getApplicationContext().startActivity(myAppSettings);
aDialog.dismiss();
finish();
发布于 2017-01-13 15:02:11
我必须重写finish()
方法,并通过获取进程id来终止我的进程。
@Override
public void finish() {
super.finish();
android.os.Process.killProcess(android.os.Process.myPid());
}
感谢大家的帮助和支持!
https://stackoverflow.com/questions/41636442
复制相似问题