java.lang.IllegalArgumentException: Tampilan tidak terlampir pada window manager

148

Saya memiliki aktivitas yang memulai AsyncTask dan menampilkan dialog progres selama operasi. Aktivitas ini dinyatakan TIDAK diciptakan kembali oleh rotasi atau slide keyboard.

    <activity android:name=".MyActivity" 
              android:label="@string/app_name"
              android:configChanges="keyboardHidden|orientation"
              >
        <intent-filter>
        </intent-filter>
    </activity>

Setelah tugas selesai, saya menolak dialog, tetapi pada beberapa ponsel (kerangka kerja: 1,5, 1,6) kesalahan tersebut dilemparkan:

java.lang.IllegalArgumentException: View not attached to window manager
    at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:356)
    at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:201)
    at android.view.Window$LocalWindowManager.removeView(Window.java:400)
    at android.app.Dialog.dismissDialog(Dialog.java:268)
    at android.app.Dialog.access$000(Dialog.java:69)
    at android.app.Dialog$1.run(Dialog.java:103)
    at android.app.Dialog.dismiss(Dialog.java:252)
    at xxx.onPostExecute(xxx$1.java:xxx)

Kode saya adalah:

final Dialog dialog = new AlertDialog.Builder(context)
    .setTitle("Processing...")
    .setCancelable(true)
    .create();

final AsyncTask<MyParams, Object, MyResult> task = new AsyncTask<MyParams, Object, MyResult>() {

    @Override
    protected MyResult doInBackground(MyParams... params) {
        // Long operation goes here
    }

    @Override
    protected void onPostExecute(MyResult result) {
        dialog.dismiss();
        onCompletion(result);
    }
};

task.execute(...);

dialog.setOnCancelListener(new OnCancelListener() {
    @Override
    public void onCancel(DialogInterface arg0) {
        task.cancel(false);
    }
});

dialog.show();

Dari apa yang saya baca ( http://bend-ing.blogspot.com/2008/11/properly-handle-progress-dialog-in.html ) dan terlihat di sumber Android, sepertinya satu-satunya situasi yang mungkin untuk mendapatkan itu pengecualian adalah saat aktivitas dihancurkan. Tetapi seperti yang telah saya sebutkan, saya melarang kegiatan rekreasi untuk acara-acara dasar.

Jadi setiap saran sangat dihargai.

alex2k8
sumber
1
Pertanyaan ini telah mendapat banyak jawaban, jika ada di antara mereka yang membantu Anda, silakan pilih sebagai jawaban yang tepat.
Parag Kadam

Jawaban:

228

Saya juga mendapatkan kesalahan ini kadang-kadang ketika saya mengabaikan dialog dan menyelesaikan aktivitas dari metode onPostExecute. Saya kira terkadang kegiatan selesai sebelum dialog berhasil ditolak.

Solusi sederhana namun efektif yang bekerja untuk saya

@Override
protected void onPostExecute(MyResult result) {
    try {
        if ((this.mDialog != null) && this.mDialog.isShowing()) {
            this.mDialog.dismiss();
        }
    } catch (final IllegalArgumentException e) {
        // Handle or log or ignore
    } catch (final Exception e) {
        // Handle or log or ignore
    } finally {
        this.mDialog = null;
    }  
}
Damjan
sumber
44
Solusi sederhana? Iya. Efektif? Mungkin dalam hal ini. Apakah saya merekomendasikannya? TIDAK! Jangan menelan SEMUA pengecualian seperti itu! Saya bahkan tidak akan menangkap IllegalArgumentException, tetapi mencari solusi lain.
Simon Forsberg
6
Karena biasanya try-catchs yang kosong adalah ide yang buruk ... Meskipun terkadang bisa menjadi hal yang tepat untuk dilakukan.
Thomas
3
@ Damjan Dengan tanggapan Anda, Anda sarankan jenis tangkapan Exception. Ya, ini praktik buruk oleh Google. Anda dapat membacanya di sini: Jangan Menangkap Pengecualian Generik .
Yaniv
17
Saya percaya ini perbaikan yang efektif. Dalam kasus umum, kita tidak boleh melakukan ini, tetapi karena Kerangka Android tidak memberikan pemeriksaan yang mudah bagi kita, kita harus menggunakan cara yang tidak biasa. Juga, jika panggilan dialog isShowing () berfungsi seperti yang kita harapkan, kita tidak perlu peretasan seperti ini.
SXC
1
perbaikan cepat sampai sesuatu yang lebih baik ditemukan
Rohit Tigga
13

Inilah solusi "bukti peluru" saya, yang merupakan kompilasi dari semua jawaban bagus yang saya temukan pada topik ini (terima kasih kepada @Damjan dan @Kachi). Di sini pengecualian ditelan hanya jika semua cara deteksi lainnya tidak berhasil. Dalam kasus saya, saya perlu menutup dialog secara otomatis dan ini adalah satu-satunya cara untuk melindungi aplikasi dari kerusakan. Saya harap ini akan membantu Anda! Silakan, beri suara dan tinggalkan komentar jika Anda memiliki komentar atau solusi yang lebih baik. Terima kasih!

public void dismissWithCheck(Dialog dialog) {
        if (dialog != null) {
            if (dialog.isShowing()) {

                //get the Context object that was used to great the dialog
                Context context = ((ContextWrapper) dialog.getContext()).getBaseContext();

                // if the Context used here was an activity AND it hasn't been finished or destroyed
                // then dismiss it
                if (context instanceof Activity) {

                    // Api >=17
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                        if (!((Activity) context).isFinishing() && !((Activity) context).isDestroyed()) {
                            dismissWithTryCatch(dialog);
                        }
                    } else {

                        // Api < 17. Unfortunately cannot check for isDestroyed()
                        if (!((Activity) context).isFinishing()) {
                            dismissWithTryCatch(dialog);
                        }
                    }
                } else
                    // if the Context used wasn't an Activity, then dismiss it too
                    dismissWithTryCatch(dialog);
            }
            dialog = null;
        }
    }

    public void dismissWithTryCatch(Dialog dialog) {
        try {
            dialog.dismiss();
        } catch (final IllegalArgumentException e) {
            // Do nothing.
        } catch (final Exception e) {
            // Do nothing.
        } finally {
            dialog = null;
        }
    }
Ivo Stoyanov
sumber
1
solusi yang sangat bagus! Pengaturan dialog = nulltidak memiliki efek apa pun. Dan StatusEventDialogharus dibaca saja Dialog.
hgoebl
1
StatusEventDialog harus diubah menjadi dialog.
Sreekanth Karumanaghat
Jawaban ini harus diterima, ditangani dengan sangat baik
blueware
Saya mengerti Anda ingin menjadi "benar" dan hanya menggunakan try / catch jika isDestroyed()tidak tersedia, tetapi untuk tujuan praktis bukankah sama saja dengan menggunakan try / catch selalu?
zundi
11

Saya mungkin punya solusi.

Sedang mengalami masalah yang sama, di mana saya memuat banyak item (melalui sistem file) ke ListViewmelalui AsyncTask. Seandainya onPreExecute()firing up ProgressDialog, dan kemudian keduanya onPostExecute()dan onCancelled()(dipanggil ketika tugas dibatalkan secara eksplisit melalui AsyncTask.cancel()) menutup via .cancel().

Mendapat kesalahan "java.lang.IllegalArgumentException yang sama: View tidak terlampir ke window manager" ketika saya mematikan dialog dalam onCancelled()metode AsyncTask(saya pernah melihat ini dilakukan di aplikasi Shelves yang sangat baik ).

Solusinya adalah membuat bidang publik di AsyncTaskyang berisi ProgressDialog:

public ProgressDialog mDialog;

Lalu, onDestroy()ketika saya membatalkan AsyncTask, saya juga dapat mematikan dialog terkait melalui:

AsyncTask.mDialog.cancel();

Memanggil AsyncTask.cancel()memicu TIDAK onCancelled()di AsyncTask, tetapi untuk beberapa alasan pada saat metode dipanggil, tampilan telah dihancurkan dan dengan demikian membatalkan dialog gagal.

Paul Mennega
sumber
Saya menemukan implementasi UserTask hanya sangat baik sebagai @ Paul disebutkan. Kode sumber ada di sini: code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/…
Evi Song
Sementara kasus penggunaan dapat ditemukan di proyek yang sama: code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/…
Evi Song
9

Inilah solusi yang tepat untuk menyelesaikan masalah ini:

public void hideProgress() {
    if(mProgressDialog != null) {
        if(mProgressDialog.isShowing()) { //check if dialog is showing.

            //get the Context object that was used to great the dialog
            Context context = ((ContextWrapper)mProgressDialog.getContext()).getBaseContext();

            //if the Context used here was an activity AND it hasn't been finished or destroyed
            //then dismiss it
            if(context instanceof Activity) { 
                if(!((Activity)context).isFinishing() && !((Activity)context).isDestroyed()) 
                    mProgressDialog.dismiss();
            } else //if the Context used wasnt an Activity, then dismiss it too
                mProgressDialog.dismiss();
        }
        mProgressDialog = null;
    }
}

Alih-alih secara membabi buta menangkap semua pengecualian, solusi ini membahas akar masalah: mencoba mengabaikan dialog ketika aktivitas yang digunakan untuk menginisialisasi dialog telah selesai. Bekerja pada Nexus 4 saya menjalankan KitKat, tetapi harus bekerja untuk semua versi Android.

Kachi
sumber
3
isDestroyedmembutuhkan API 17+
Androiderson
Mengapa Anda perlu mengatur mProgressDialog ke nol? Apakah itu terkait dengan kebocoran memori? Bisakah Anda jelaskan?
Pawan
@Pawan, ini adalah detail implementasi di pihak saya. Itu tidak diperlukan, itu hanya cara fungsi di kelas ini bekerja. Setelah dialog progres disembunyikan, saya mengaturnya ke nol. Saat pengguna ingin menampilkan dialog progres lain, instance baru akan dipakai.
Kachi
Tentunya! ((Aktivitas) konteks) .isFinishing () diperlukan, terima kasih! :)
Daniel Krzyczkowski
5

Saya setuju pendapat 'Damjan'.
jika Anda menggunakan banyak dialog, tutup semua dialog di onDestroy () atau onStop ().
maka Anda mungkin dapat mengurangi frekuensi 'java.lang.IllegalArgumentException: Tampilan tidak terlampir pada window manager' terjadi.

@Override
protected void onDestroy() {
    Log.d(TAG, "called onDestroy");
    mDialog.dismiss();
    super.onDestroy();
}



tetapi sedikit melebihi ...
untuk membuatnya lebih jelas, Anda mencegah untuk menampilkan dialog apa pun setelah onDestroy dipanggil.
saya tidak menggunakan seperti di bawah ini. tapi jelas.

private boolean mIsDestroyed = false;

private void showDialog() {
    closeDialog();

    if (mIsDestroyed) {
        Log.d(TAG, "called onDestroy() already.");
        return;
    }

    mDialog = new AlertDialog(this)
        .setTitle("title")
        .setMessage("This is DialogTest")
        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        })
        .create();
    mDialog.show();
}

private void closeDialog() {
    if (mDialog != null) {
        mDialog.dismiss();
    }
}

@Override
protected void onDestroy() {
    Log.d(TAG, "called onDestroy");
    mIsDestroyed = true;
    closeDialog();
    super.onDestroy();
}


semoga berhasil!

Hogun
sumber
Saya selalu lebih suka menghindari blok tangkapan kosong. patut dicoba, tetapi karena kesalahan ini sulit untuk diproduksi - hanya waktu yang akan mengatakan apakah itu benar-benar berfungsi. terima kasih.
Dror Fichman
apa itu blok penangkap kosong? saya tidak menggunakan try / catch. variabel mIsDestroyed terlampaui bekerja. tetapi jika Anda menulis ke kode acara dialog setelah beberapa bekerja di utas lainnya, Anda mungkin perlu variabel ini. saat utas lainnya berfungsi, jika aktivitas selesai, Anda dapat melihat pengecualian ini.
Hogun
Saya memiliki masalah yang sama dan ketika saya menambahkan @Override public void onPause () {if (dialog! = Null) dialog.dismiss (); super.onPause (); } sampai sekarang saya tidak punya kesalahan ini ... jadi saya pikir ini sama dengan jawaban Anda dan itu sangat berguna
Chris Sim
@ ChrisSim halo! onPuase () dan onDestroy () adalah defference. saat Activity onPuase, Dialog ditutup. dan ketika Anda menjalankan aplikasi, Dialog tidak ditampilkan. apakah kamu mau itu
Hogun
@ Hogun Ya tentu saja, maksud saya ide yang sama, saya menutup dialog pada jeda alih-alih menghancurkan karena saya membutuhkannya pada jeda, bukan pada menghancurkan. Kedua, saya menutupnya saat itu bukan nol. Terima kasih telah menjelaskan ini untuk orang lain.
Chris Sim
4

Gunakan ini.

if(_dialog!=null && _dialog.isShowing())
_dialog.dismiss();
Pralabh Jain
sumber
2
Ini hampir solusi yang sama yang diusulkan @Djanjan.
Yury
28
Ini tidak cukup, IllegalArgumentException masih terjadi dengan pemeriksaan ini.
Murphy
Saya melakukan solusi yang sama, tetapi masih belum tahu apakah itu efektif. Hanya bedanya, saya bersarang dua jika untuk memastikan bahwa bagian kedua .isShowing () tidak akan dievaluasi jika nol.
Nick
2
Ini tidak cukup.
trante
1
@Nick: Tidak perlu bersarang banyak ifdalam kasus seperti ini, &&operator Java memiliki evaluasi malas (juga disebut hubungan arus pendek), yang berarti operan ke-2 tidak dievaluasi jika yang pertama dievaluasi false(yang berarti hasil dari bagaimanapun &&akan selalu false, karenanya evaluasi "malas"). Demikian pula ||tidak akan mengevaluasi operan ke-2 jika yang pertama mengevaluasi true. Catatan: operator &dan |tidak memiliki perilaku ini dan dengan demikian selalu mengevaluasi kedua operan.
Matthias
3

Saya memiliki masalah yang sama, Anda dapat menyelesaikannya dengan:

@Override
protected void onPostExecute(MyResult result) {
    try {
        if ((this.mDialog != null) && this.mDialog.isShowing()) {
            this.mDialog.dismiss();
        }
    } catch (final IllegalArgumentException e) {
        // Handle or log or ignore
    } catch (final Exception e) {
        // Handle or log or ignore
    } finally {
        this.mDialog = null;
    }  
}
spacebiker
sumber
2

Saya pikir kode Anda benar tidak seperti jawaban lain yang disarankan. onPostExecute akan berjalan di utas UI. Itulah inti dari AsyncTask - Anda tidak perlu khawatir tentang memanggil runOnUiThread atau berurusan dengan penangan. Lebih lanjut, menurut dokumen, dismiss () dapat dengan aman dipanggil dari utas apa pun (tidak yakin mereka membuat pengecualian ini).

Mungkin ini masalah waktu ketika dialog.dismiss () dipanggil setelah aktivitas tidak lagi ditampilkan?

Bagaimana dengan pengujian apa yang terjadi jika Anda mengomentari setOnCancelListener dan kemudian keluar dari aktivitas saat tugas latar belakang sedang berjalan? Maka onPostExecute Anda akan mencoba untuk mengabaikan dialog yang sudah diberhentikan. Jika aplikasi macet, Anda mungkin dapat memeriksa apakah dialog terbuka sebelum mengabaikannya.

Saya mengalami masalah yang sama persis sehingga saya akan mencobanya dalam kode.

Brandon O'Rourke
sumber
Saya juga melihat ke dalam kode dimiss (), dan memang, dapat dengan aman dipanggil dari utas apa pun. BTW, saya punya masalah dengan pengujian, karena masalah ini terjadi pada ponsel pengguna, dan saya tidak pernah dapat mereproduksi sendiri :-( Jadi mencoba mencari tahu dengan menganalisis kode ... Menurut waktu. Saya berpikir tentang ini, tetapi tidak dapat membayangkan situasi bagaimana Kegiatan dapat ditutup sebelum Dialog. Jika KEMBALI ditekan, maka akan membatalkan Dialog terlebih dahulu. Dan kegiatan rekreasi otomatis dilarang oleh file manifes, tetapi mungkin masih dapat dibuat kembali bagaimana? saya tahu jika Anda menemukan sesuatu!
alex2k8
2

alex,

Saya bisa saja salah di sini, tetapi saya curiga bahwa banyak telepon 'di alam bebas' memiliki bug yang menyebabkan mereka beralih orientasi pada aplikasi yang ditandai sebagai berorientasi statis. Ini terjadi cukup banyak pada telepon pribadi saya, dan pada banyak telepon percobaan yang digunakan oleh kelompok kami (termasuk droid, n1, g1, pahlawan). Biasanya aplikasi yang ditandai sebagai berorientasi statis (mungkin secara vertikal) akan meletakkan dirinya sendiri selama satu atau dua detik menggunakan orientasi horisontal, dan kemudian segera beralih kembali. Hasil akhirnya adalah meskipun Anda tidak ingin aplikasi beralih orientasi, Anda harus siap untuk melakukannya. Saya tidak tahu dalam kondisi persis bagaimana perilaku ini dapat direproduksi, saya tidak tahu apakah itu khusus untuk versi Android. Yang saya tahu adalah bahwa saya telah melihat itu terjadi berkali-kali :(

Saya akan merekomendasikan menggunakan solusi yang disediakan dalam tautan yang Anda posting yang menyarankan mengganti metode Activity onCreateDialog dan membiarkan OS Android mengelola siklus hidup Dialog Anda. Sepertinya saya meskipun Anda tidak ingin aktivitas Anda beralih orientasi, itu beralih orientasi di suatu tempat. Anda dapat mencoba melacak metode yang akan selalu mencegah peralihan orientasi, tetapi saya mencoba untuk memberi tahu Anda bahwa saya secara pribadi tidak percaya ada cara yang sangat mudah yang bekerja pada semua ponsel Android saat ini di pasar.

Hamy
sumber
1
Anda dapat menjaga perangkat Anda dari beralih orientasi, tetapi ada banyak perubahan konfigurasi lainnya yang menghancurkan / menciptakan kembali Aktivitas Anda - yang umum adalah menggeser keyboard ke dalam atau ke luar.
MaximumGoat
2

Yang paling berhasil bagi saya adalah memverifikasi apakah Kegiatan tidak selesai.

if (!mActivity.isFinishing()) {
    dialog.dismiss();
}
Her Thu
sumber
2

Aktivitas ini dinyatakan TIDAK diciptakan kembali oleh rotasi atau slide keyboard.

Baru saja mendapat masalah yang sama. Perbaiki untuk API level 13 atau lebih tinggi.
Dari Android docs:

Catatan: Jika aplikasi Anda menargetkan API level 13 atau lebih tinggi (sebagaimana dideklarasikan oleh atribut minSdkVersion dan targetSdkVersion), maka Anda juga harus mendeklarasikan konfigurasi "screenSize", karena itu juga berubah ketika perangkat beralih antara orientasi potret dan lanskap.

Jadi saya telah mengubah manifes saya menjadi ini:

<activity
        android:name="MyActivity"
        android:configChanges="orientation|screenSize"
        android:label="MyActivityName" >
</activity>

Dan sekarang berfungsi dengan baik. Aktivitas tidak diciptakan kembali ketika saya memutar telepon, melanjutkan dialog dan tampilan tetap sama. Tidak ada kesalahan untuk saya.

Melangsir
sumber
ini bukan solusi. misalnya saya miliki dan aktivitas Adview dari admob dan itu harus membuat ulang aktivitas untuk perubahan ukuran.
batmaci
2

Pertama-tama lakukan penanganan kesalahan di mana pun Anda mencoba mengabaikan dialog.

 if ((progressDialog != null) && progressDialog.isShowing()) {
            progressDialog.dismiss();
            progressDialog = null;
        }

Jika itu tidak diperbaiki maka abaikan di onStop () Method of the activity.

 @Override
    protected void onStop() {
        super.onStop();
        if ((progressDialog != null) && progressDialog.isShowing()) {
            progressDialog.dismiss();
            progressDialog = null;
        }
    }
Amit Patel
sumber
1

Saya memiliki masalah yang sama ketika menggunakan tombol untuk menyinkronkan daftar dari server: 1) Saya klik tombol 2) Dialog progres muncul saat memuat daftar dari server 3) Saya mengubah perangkat ke orientasi lain 4) java.lang .IllegalArgumentException: Tampilan tidak terlampir pada window manager pada postExecute () dari AsyncTask selama progress.dismiss ().

Ketika saya mencoba memperbaikinya, saya menemukan bahwa meskipun masalah tidak terjadi, daftar saya tidak menampilkan semua item.

Saya pikir apa yang saya inginkan adalah agar AsyncTask menyelesaikan (dan mengabaikan dialog) sebelum aktivitas beign dihancurkan, jadi saya membuat objek asynctask sebagai atribut dan menimpa metode onDestroy ().

Jika asynctask membutuhkan banyak waktu, pengguna mungkin akan merasa bahwa perangkatnya lambat, tetapi saya pikir itulah harga yang ia bayar untuk mencoba mengubah orientasi perangkat saat dialog progres muncul. Dan bahkan jika itu membutuhkan waktu aplikasi tidak crash.

private AsyncTask<Boolean, Void, Boolean> atask;

@Override
protected void onDestroy() {
    if (atask!=null)
        try {
            atask.get();
        } catch (InterruptedException e) {
        } catch (ExecutionException e) {
        }
    super.onDestroy();
}
shadowglas
sumber
1
@Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            if (progressDialog != null && progressDialog.isShowing()) {
                Log.i(TAG, "onPostexucte");
                progressDialog.dismiss();
}
}
vikseln
sumber
3
Sementara cuplikan kode ini dapat menjawab pertanyaan yang memberikan beberapa penjelasan tentang bagaimana cara memecahkan masalah akan membantu pengunjung masa depan ke situs memahami jawaban Anda
RobV
0

Kode di bawah ini berfungsi untuk Anda, dan berfungsi dengan baik untuk saya:

private void viewDialog() {
    try {
        Intent vpnIntent = new Intent(context, UtilityVpnService.class);
        context.startService(vpnIntent);
        final View Dialogview = View.inflate(getBaseContext(), R.layout.alert_open_internet, null);
        final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_DIM_BEHIND,
                PixelFormat.TRANSLUCENT);
        params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL;
        windowManager.addView(Dialogview, params);

        Button btn_cancel = (Button) Dialogview.findViewById(R.id.btn_canceldialog_internetblocked);
        Button btn_okay = (Button) Dialogview.findViewById(R.id.btn_openmainactivity);
        RelativeLayout relativeLayout = (RelativeLayout) Dialogview.findViewById(R.id.rellayout_dialog);

            btn_cancel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Handler handler = new Handler(Looper.getMainLooper());
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                if (Dialogview != null) {
//                                ( (WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE)).removeView(Dialogview);
                                    windowManager.removeView(Dialogview);
                                }
                            } catch (final IllegalArgumentException e) {
                                e.printStackTrace();
                                // Handle or log or ignore
                            } catch (final Exception e) {
                                e.printStackTrace();
                                // Handle or log or ignore
                            } finally {
                                try {
                                    if (windowManager != null && Dialogview != null) {
//                                    ((WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE)).removeView(Dialogview);
                                        windowManager.removeView(Dialogview);
                                    }
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
                            //    ((WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE)).removeView(Dialogview);
//                        windowManager.removeView(Dialogview);


                        }
                    });
                }
            });
            btn_okay.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Handler handler = new Handler(Looper.getMainLooper());
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            //        ((WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE)).removeView(Dialogview);
                            try {
                                if (windowManager != null && Dialogview != null)
                                    windowManager.removeView(Dialogview);
                                Intent intent = new Intent(getBaseContext(), SplashActivity.class);
                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//                        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
//                        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);


                                context.startActivity(intent);
                            } catch (Exception e) {
                                windowManager.removeView(Dialogview);
                                e.printStackTrace();
                            }
                        }
                    });
                }
            });
        } catch (Exception e) {
            //` windowManager.removeView(Dialogview);
            e.printStackTrace();
        }
    }

Jangan mendefinisikan pandangan Anda secara global jika Anda menyebutnya dari layanan latar belakang.

Shashwat Gupta
sumber