java.lang.IllegalArgumentException :보기가 창 관리자에 첨부되지 않았습니다


148

AsyncTask를 시작하고 작업 기간 동안 진행률 대화 상자를 표시하는 활동이 있습니다. 액티비티는 회전 또는 키보드 슬라이드로 다시 생성되지 않는다고 선언됩니다.

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

작업이 완료되면 대화 상자가 닫히지 만 일부 전화 (프레임 워크 : 1.5, 1.6)에서는 이러한 오류가 발생합니다.

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)

내 코드는 다음과 같습니다

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();

내가 읽은 것 ( http://bend-ing.blogspot.com/2008/11/properly-handle-progress-dialog-in.html )에서 안드로이드 소스에서 본 것은 그것을 얻을 수있는 유일한 상황처럼 보입니다. 활동이 파괴 된 경우는 예외입니다. 그러나 내가 언급했듯이, 나는 기본 행사를위한 활동 레크리에이션을 금지합니다.

따라서 어떤 제안이라도 대단히 감사합니다.


1
이 질문에 대한 답변이 많았는데 도움이된다면 정답으로 선택하십시오.
Parag Kadam

답변:


228

대화 상자를 닫고 onPostExecute 메소드에서 활동을 완료하면 때때로이 오류가 발생 합니다. 대화가 성공적으로 종료되기 전에 때때로 활동이 완료되는 것 같습니다.

나에게 효과적인 간단하면서도 효과적인 솔루션

@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;
    }  
}

44
간단한 해결책? 예. 유효한? 아마도이 경우에. 내가 추천할까요? 아니! 삼키지 마십시오 ALL 같은 예외를! 나는 IllegalArgumentException을 잡을 수 없지만 다른 해결책을 찾으십시오.
Simon Forsberg

6
일반적으로 빈 try-catches는 좋지 않은 생각이기 때문에 때로는 올바른 일이 될 수 있습니다.
Thomas

3
@Damjan 귀하의 답변에 따라 catch type Exception을 제안합니다. 글쎄, 이것은 Google의 나쁜 습관입니다. 여기에서 읽을 수 있습니다 : 일반 예외를 잡지 마십시오 .
Yaniv

17
나는 이것이 효과적인 해결책이라고 생각합니다. 일반적인 경우에는이 작업을 수행해서는 안되지만 Android 프레임 워크에서는 쉽게 확인할 수 없으므로 특별한 방법을 사용해야합니다. 또한 대화 상자의 isShowing () 호출이 예상대로 작동하면 이러한 종류의 핵이 필요하지 않습니다.
SXC

1
더 나은 것을 찾을 때까지 빠른 수정
Rohit Tigga

13

다음은이 주제에서 찾은 모든 정답 (@Damjan 및 @Kachi 덕분)을 정리 한 "글 머리표 증명"솔루션입니다. 여기서 다른 모든 탐지 방법이 성공하지 못한 경우에만 예외가 삼켜집니다. 필자의 경우 대화 상자를 자동으로 닫아야하며 이것이 앱 충돌을 방지하는 유일한 방법입니다. 도움이 되길 바랍니다. 의견이 있거나 더 나은 해결책이 있으면 투표하고 의견을 남겨주십시오. 감사합니다!

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;
        }
    }

1
아주 좋은 해결책! 설정 dialog = null은 효과가 없습니다. 그리고 StatusEventDialog그냥 읽어야 Dialog합니다.
hgoebl

1
StatusEventDialog가 dialog로 변경되어야합니다.
Sreekanth Karumanaghat

이 답변은 매우 잘 처리 된 것으로 받아 들여 져야합니다.
blueware

나는 당신이 "올바른"되고 싶다는 것을 이해하고 isDestroyed()사용할 수없는 경우에만 try / catch를 사용 하지만 실제로는 try / catch를 항상 사용하는 것이 동일하지 않습니까?
zundi 2012

11

해결 방법이있을 수 있습니다.

같은 문제가 있었는데 (파일 시스템을 ListView통해 )을 통해 많은 항목을로드 하고 AsyncTask있습니다. 했던 onPreExecute()을 발사 ProgressDialog한 다음 모두 onPostExecute()onCancelled()(작업이를 통해 명시 적으로 취소 될 때 호출 AsyncTask.cancel()을 통해 폐쇄) .cancel().

onCancelled()메소드 에서 대화 상자를 죽일 때 동일한 "java.lang.IllegalArgumentException :보기가 창 관리자에 연결되지 않았습니다"오류가 발생 했습니다 AsyncTask(훌륭한 선반 응용 프로그램 에서이 작업을 보았습니다 ).

해결 방법은 다음 AsyncTask을 포함 하는 공개 필드를 만드는 것입니다 ProgressDialog.

public ProgressDialog mDialog;

그런 다음을 onDestroy()취소하면 다음을 AsyncTask통해 관련 대화 상자를 종료 할 수도 있습니다.

AsyncTask.mDialog.cancel();

에서 AsyncTask.cancel()DOES 트리거 onCancelled()를 호출 AsyncTask하지만 어떤 이유로 메소드가 호출 될 때보기가 이미 삭제되어 대화 상자를 취소하는 데 실패했습니다.


@Paul이 언급 한 것처럼 UserTask 구현이 뛰어납니다. 소스 코드는 다음과 같습니다 : code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/…
Evi Song

유스 케이스는 같은 프로젝트에서 찾을 수 있지만 code.google.com/p/shelves/source/browse/trunk/Shelves/src/org/…
Evi Song

9

이 문제를 해결하는 올바른 해결책은 다음과 같습니다.

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;
    }
}

이 솔루션은 모든 예외를 맹목적으로 잡는 대신 문제의 근원을 해결합니다. 대화를 초기화하는 데 사용 된 활동이 이미 완료되었을 때 대화 상자를 닫으려고합니다. KitKat을 실행하는 Nexus 4에서 작업하지만 모든 버전의 Android에서 작동합니다.


3
isDestroyedAPI 17 이상이 필요함
Androiderson

왜 mProgressDialog를 null로 설정해야합니까? 메모리 누수와 관련이 있습니까? 설명해 주시겠습니까?
Pawan

@Pawan, 그것은 내 목적에 대한 구현 세부 사항입니다. 꼭 필요한 것은 아니며,이 클래스의 함수가 작동하는 방식 일뿐입니다. 진행 대화 상자가 숨겨진 후 null로 설정했습니다. 사용자가 다른 진행률 대화 상자를 표시하려고하면 새 인스턴스가 인스턴스화됩니다.
Kachi

확실히! ((Activity) context) .isFinishing ()이 필요합니다. 감사합니다! :)
Daniel Krzyczkowski 2016 년

5

나는 'Damjan'의 의견에 동의합니다.
많은 대화 상자를 사용하는 경우 onDestroy () 또는 onStop ()에서 모든 대화 상자를 닫아야합니다.
그런 다음 빈도를 줄일 수 있습니다 'java.lang.IllegalArgumentException : 창 관리자에 첨부되지 않은보기'예외가 발생합니다.

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




더 명확하게하기 위해 onDestroy가 호출 된 후 대화 상자를 표시하지 않습니다.
나는 아래와 같이 사용하지 않는다. 그러나 분명하다.

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();
}


행운을 빕니다!


나는 항상 빈 캐치 블록을 피하는 것을 선호합니다. 시도해 볼 가치가 있지만이 오류는 발생하기 어렵 기 때문에 실제로 작동하는지 여부는 시간 만 알 수 있습니다. 어쨌든 고마워
Dr Fichman

빈 캐치 블록이란 무엇입니까? try / catch를 사용하지 않습니다. mIsDestroyed 변수가 작동을 초과했습니다. 그러나 다른 스레드에서 작업 한 후 해당 대화 상자가 코드에 작성되면이 변수가 필요할 수 있습니다. 다른 스레드가 작동 중일 때 활동이 완료되면이 예외를 볼 수 있습니다.
Hogun

나는 같은 prob을 가지고 @Override public void onPause () {if (dialog! = null) dialog.dismiss (); super.onPause (); } 현재까지 나는이 오류가 없다 ... 그래서 나는 당신의 대답과 같고 정말 유용하다고 생각합니다.
Chris Sim

@ChrisSim 안녕하세요! onPuase () 및 onDestroy ()는 차이입니다. Activity가 onPuase이면 대화 상자가 닫힙니다. 앱을 실행할 때 대화 상자가 표시되지 않습니다. 당신은 그것을 원하십니까?
Hogun

@Hogun 예, 물론 같은 생각입니다. 파괴가 아닌 일시 중지시 대화 상자가 필요하기 때문에 파기 대신 일시 중지시 대화 상자를 닫습니다. 둘째, null이 아닌 경우에만 닫습니다. 다른 사람들을 위해 이것을 설명해 주셔서 감사합니다.
Chris Sim

4

이것을 사용하십시오.

if(_dialog!=null && _dialog.isShowing())
_dialog.dismiss();

2
@Damjan이 제안한 것과 거의 동일한 솔루션입니다.
Yury

28
이것은 충분하지 않습니다. IllegalArgumentException은 여전히이 검사에서 발생합니다.
머피

나는 같은 해결책을 시도했지만 여전히 효과적인지 모른다. 차이점은 두 번째 부분 .isShowing ()이 null 인 경우 평가되지 않도록하기 위해 두 개를 중첩 한 것입니다.
Nick

2
충분하지 않습니다.
trante

1
@Nick :이 둥지 배수 필요 if'같은 경우에요 없다, 자바의 &&연산자는 두번째 피연산자는 평가되지 않음을 의미 (또한 단락이라고도 함) 게으른 평가, 경우에 첫 번째 평가하여 false결과를 의미한다 ( 는 &&항상있을 것입니다 false) 따라서 "게으른"평가, 어쨌든. 마찬가지로 ||첫 번째 피연산자가로 평가되면 두 번째 피연산자를 평가하지 않습니다 true. 참고 : &|연산자에는이 동작이 없으므로 항상 두 피연산자를 모두 평가하십시오.
Matthias

3

나는 같은 문제를 겪었다.

@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;
    }  
}

2

다른 답변과 달리 코드가 정확하다고 생각합니다. onPostExecute는 UI 스레드에서 실행됩니다. 이것이 AsyncTask의 요점입니다. runOnUiThread 호출에 대해 걱정하거나 핸들러를 처리 할 필요가 없습니다. 또한 문서에 따르면 dismiss ()는 모든 스레드에서 안전하게 호출 할 수 있습니다 (예외가 확실하지 않음).

아마도 활동이 더 이상 표시되지 않은 후 dialog.dismiss ()가 호출되는 타이밍 문제입니까?

setOnCancelListener를 주석 처리 한 다음 백그라운드 작업이 실행되는 동안 활동을 종료하면 어떻게됩니까? 그런 다음 onPostExecute는 이미 해제 된 대화 상자를 닫으려고 시도합니다. 응용 프로그램이 충돌하면 대화 상자를 닫기 전에 대화 상자가 열려 있는지 확인할 수 있습니다.

나는 똑같은 문제를 겪고 있으므로 코드에서 시도해 볼 것입니다.


또한 dimiss () 코드를 살펴 보았으며 실제로 모든 스레드에서 안전하게 호출 할 수 있습니다. BTW, 나는이 문제가 사용자 전화에서 발생하기 때문에 테스트에 문제가 있으며, 나는 스스로 복제 할 수 없었습니다 :-( 그래서 코드를 분석하여 알아 내려고 노력 중 ... 타이밍에 따르면. Dialog를 누르기 전에 Activity를 닫을 수있는 상황을 상상할 수 없습니다. BACK을 누르면 Dialog를 먼저 취소 할 것입니다. ! 당신이 어떤 것을 발견하면 나에게 알
alex2k8

2

알렉스

나는 여기에서 틀릴 수 있지만, '와일드 한'여러 전화에 정적으로 지향 된 응용 프로그램의 방향을 전환하는 버그가 있다고 생각합니다. 이것은 내 개인 전화와 우리 그룹이 사용하는 많은 테스트 전화 (드로이드, n1, g1, 영웅)에서 상당히 발생합니다. 일반적으로 정적으로 (수직으로) 표시된 앱은 가로 방향을 사용하여 1 초 또는 2 초 동안 배치 된 다음 즉시 다시 전환됩니다. 결과적으로 앱의 방향 전환을 원하지 않더라도 가능할 수 있도록 준비해야합니다. 이 동작이 어떤 정확한 조건에서 재현 될 수 있는지 모르겠습니다. Android 버전과 관련된 것인지 모르겠습니다. 내가 아는 것은 그것이 여러 번 일어나는 것을 보았습니다.

Activity onCreateDialog 메소드를 재정의하고 Android OS가 대화 상자의 수명주기를 관리하도록 제안 하는 링크에 제공된 솔루션을 사용하는 것이 좋습니다 . 당신이 당신의 활동이 방향을 바꾸지 않기를 원하더라도, 그것은 어딘가에서 방향을 바꾸는 것 같습니다. 방향 전환을 항상 방지 할 수있는 방법을 추적 할 수는 있지만, 현재 시장에있는 모든 현재 Android 휴대 전화에서 작동하는 확실한 방법이 없다고 개인적으로 말하려고합니다.


1
기기가 방향을 전환하지 못하게 할 수는 있지만 활동을 파괴 / 재 작성하는 다른 구성 변경 사항이 많이 있습니다. 일반적으로 키보드를 넣거나 꺼냅니다.
MaximumGoat

2

대부분의 경우 나를 위해 일한 것은 활동이 끝나지 않았는지 확인하는 것입니다.

if (!mActivity.isFinishing()) {
    dialog.dismiss();
}

2

액티비티는 회전 또는 키보드 슬라이드로 다시 생성되지 않는다고 선언됩니다.

같은 문제가 발생했습니다. API 레벨 13 이상이 수정되었습니다.
안드로이드 문서에서 :

참고 : 애플리케이션이 API 레벨 13 이상 (minSdkVersion 및 targetSdkVersion 속성으로 선언 된대로)을 대상으로하는 경우 장치가 세로 방향과 가로 방향간에 전환 될 때도 변경되므로 "screenSize"구성도 선언해야합니다.

그래서 내 매니페스트를 다음과 같이 변경했습니다.

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

그리고 지금은 잘 작동합니다. 전화를 돌리고 진행률 대화 상자와보기가 동일하게 유지되면 활동이 다시 작성되지 않습니다. 나에게 오류가 없습니다.


이것은 해결책이 아닙니다. 예를 들어 admob의 Adview 활동이 있고 크기 변경에 대한 활동을 다시 만들어야합니다.
batmaci

2

우선 대화 상자를 닫으려고 할 때 오류 처리를 수행하십시오.

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

그래도 해결되지 않으면 활동의 onStop () 메소드에서 해제하십시오.

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

1

버튼을 사용하여 서버에서 목록을 동기화하는 동안 동일한 문제가 발생했습니다 .1) 버튼을 클릭하십시오 .2) 서버에서 목록을 다운로드하는 동안 진행률 대화 상자가 나타납니다 .3) 장치를 다른 방향으로 바꿉니다 .4) java.lang .IllegalArgumentException : progress.dismiss () 동안 AsyncTask의 postExecute ()에서 창 관리자에보기가 첨부되지 않았습니다.

수정을 시도했을 때 문제가 발생하지 않아도 내 목록에 모든 항목이 표시되지 않는 것으로 나타났습니다.

내가 원하는 것은 액티비티가 파괴되기 전에 AsyncTask가 완료되고 대화 상자를 닫는 것이라고 생각하여 asynctask 객체를 속성으로 만들고 onDestroy () 메소드를 재정의했습니다.

비동기 작업에 많은 시간이 걸리면 사용자는 장치가 느리다고 느낄 수 있지만 진행률 대화 상자가 표시되는 동안 장치 방향을 변경하려고 시도하는 데 드는 비용이라고 생각합니다. 그리고 시간이 걸리더라도 앱이 다운되지 않습니다.

private AsyncTask<Boolean, Void, Boolean> atask;

@Override
protected void onDestroy() {
    if (atask!=null)
        try {
            atask.get();
        } catch (InterruptedException e) {
        } catch (ExecutionException e) {
        }
    super.onDestroy();
}

1
@Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            if (progressDialog != null && progressDialog.isShowing()) {
                Log.i(TAG, "onPostexucte");
                progressDialog.dismiss();
}
}

3
이 코드 스 니펫은 문제를 해결하는 방법에 대한 설명을 제공하여 질문에 대답 할 수 있지만 향후 사이트 방문자가 귀하의 답변을 이해하는 데 도움이 될 것입니다.
RobV

0

아래 코드는 당신을 위해 작동합니다. 그것은 나를 위해 완벽하게 작동합니다.

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();
        }
    }

백그라운드 서비스에서 호출하는 경우 뷰를 전체적으로 정의하지 마십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.