에러(error)
ERROR/AndroidRuntime(): Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
원인(cause)
안드로이드 플랫폼 상에서는 Activity 가 아닌 Service 혹은 BroadcastReceiver 에서 Activity 를 하나 새롭게 생성하려고 할 경우에는 예외를 만나게 된다. 간단히 살펴보면, Activity 가 아닌 곳에서 startActivity()를 호출 하지 말고, 만일 호출하고자 할 때면 FLAG_ACTIVITY_NEW_TASK 를 사용하라는 의미이다.
안드로이드 플랫폼에서 어플리케이션의 UI 가 어떻게 구성되어지는지 조금 살펴볼 필요가 있다. 안드로이드 어플리케이션 UI의 핵심 요소는 두 가지 Activity 와 Task이다. Activity 는 개별 개별의 화면을 나타낸다고 생각할 수 있고, 어플리케이션의 진행에 따라 서로 상호작용하는 Activity 가 차곡 차곡 쌓여있는 것을 Task 라고 할 수 있다. 용어가 좀 헷갈리지만, 안드로이드 개발자 사이트에서 Task 에 관한 내용을 살펴보면, "Stack 형태(Last In First Out)로 배치된 서로 연관된 Activity 의 그룹" 이라고 되어 있습니다. 결국 기능적으로는 'Activity Stack' 이라고 생각해도 될 듯 하다.
해결(solution)
[방법 1] 오류 발생 시 알려주는 내용대로 FLAG_ACTIVITY_NEW_TASK 플래그를 사용하면 된다. 만일 실행 시키려고 하는 Activity 가 이미 작동중인 Task 가 있다면 해당 Task 에, 그렇지 않다면 아예 새로운 Task 에 Activity 를 위치 시키라는 뜻이다.
Intent i = new Intent(this, ServiceTest.class); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(i); |
Intent i = new Intent(this, ServiceTest.class); PendingIntent p = PendingIntent.getActivity(this, 0, i, 0); try { p.send(); } catch (CanceledException e) { e.printStackTrace(); } |