2016-10-31 7 views
1

특정 상황에서는 신청서에 exit()으로 전화해야합니다. (완료하는 가장 좋은 방법은 아니지만 질문이 아닙니다.) 또한 충돌에 대해 사용자에게 알려주는 새로운 대화 상자를 표시하려고합니다.새로운 활동이 시작되지 않는 경우가 있음

새 브로드 캐스트 리시버 인 새로운 활동 클래스를 생성하여 매니페스트에 등록했습니다. 다음으로, 전화 :

Intent intent = new Intent(this, AppCloseReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, intent, 0); 
try 
{ 
    pendingIntent.send(); 
} 
catch(Exception ex){} 

System.exit(0); 

문제는 새 창이 때때로를 표시한다는 것입니다! 먼저 새로운 활동을 시작하기 전에 System.exit(0);이 시작될 것이라고 생각했습니다. (비동기 호출로 인해 생각을 찾을 수 없습니다.) Thread.sleep(1000)pendingIntent.send();System.exit(0); 사이에 추가했습니다. 결과는 동일합니다 - 새 창이 가끔 나타납니다.. 로그에는 아무 것도 없으며 예외는 없습니다.

새로운 활동은 정적 텍스트 일뿐입니다.

+0

이것은 절대적으로 신뢰할 수 없습니다. 'System.exit() '를 호출하면 기본적으로 VM이 종료됩니다. VM을 종료 할 때 어떤 일이 발생한다고 보장 할 수는 없습니다. UI에 아무것도 표시되지 않을 것입니다. 유스 케이스를 설명하고 대체 방법을 제안 할 수 있습니다. –

+0

유스 케이스는 특정 조건에서 '종료'하고 응용 프로그램이 중지 된 이유를 사용자에게 알려주는 것입니다. 대안으로 나는 알림을 사용하고 있지만 사용자가 수동으로 닫을 때까지 기다려야하는 더 많은 지속성 솔루션을 원합니다. – nikitablack

답변

1

이것은 신뢰할 수 없습니다. VM을 종료하게 만들면 더 이상 VM이 실행되지 않으므로 아무 것도 표시 할 수 없습니다. 이렇게하는 유일한 방법은 메시지를 표시하기 위해 BroadcastReceiverActivity을 다른 OS 프로세스에서 실행하는 것입니다. 이것은 예외의 특성에 따라 기존 VM이 다른 구성 요소를 시작할 수 없기 때문에 100 % 신뢰할 수는 없지만 현재 구현 된 것보다 더 신뢰할 수 있습니다. 예를 들어 앱이 OutOfMemoryException으로 인해 충돌하는 경우 유용하지 않은 것으로 보입니다.

는 구성 요소가 별도의 프로세스에서 실행되도록 해당 구성 요소에 대한 매니페스트에 <activity><receiver> 정의에

android:process=":other" 

을 추가합니다.

VM이 실제로 대화 상자를 시작할 수있는 기회를주기 위해 호출을 System.exit()으로 지연시켜야합니다. 또한이 경우 PendingIntent을 사용할 필요가 없습니다. 다음과 같이 시도하십시오.

Intent intent = new Intent(this, AppCloseReceiver.class); 
sendBrodcast(intent); 
// Start separate Thread to terminate the process 
new Thread(new Runnable() { 
    @override 
    public void run() { 
     SystemClock.sleep(1000); // Sleep a bit to give the VM enough time to actually send the broadcast Intent 
     System.exit(0); 
    } 
}).start(); 
관련 문제