본문 바로가기

소프트웨어/Android/Java/Ndk

Android] Service상에서 Activity 띄우기

Service에서 Intent를 이용해 Activity를 띄우려고 한다.

startActivity(Intent intent) 매서드를 이용해서 Activity를 call하면 

...FLAG_ACTIVITY_NEW_TASK... 의 에러가 출력된다.


왜냐하면 Activity는 스택형태로 쌓이게되는데 Activity가 아닌곳인 Service상에서 Activity를 불르면 어느 task에 Activity를 추가할지 모르기때문에 오류가 발생한다.


해결방법은 두 가지가 있다.

1. Flag를 추가하기

2. PendingIntent 사용하기



1. Flag를 추가하기

보통 

줄1] Intent intent = new Intent(Context context, Class class);

줄2] startActivity(intent); 

를 써서 Activty를 call한다. 이렇게 쓸 때 오류가 발생하는데 아래와 같이 한줄을 추가한다.


줄1] Intent intent = new Intent(Context context, Class class);

줄2] intent.addFlag(Intent.FLAG_ACTIVTY_NEW_TASK);

줄3] startActivity(intent); 


intent에 FLAG_ACTIVTY_NEW_TASK 플레그를 추가하면 에러를 없앨 수 있다.



flag는 설명과 같이 history stack의 new stack에서 actiivty가 시작되게 설정시킨다.



2. PendingIntent 사용하기

보통 

줄1] Intent intent = new Intent(Context context, Class class);

줄2] startActivity(intent); 

를 써서 Activty를 call한다. 여기서 startActivty말고 아래와 같이 PendingIntent를 사용해보자


줄1] Intent intent = new Intent(Context context, Class class);

줄2] PendingIntent pendingIntent = PendingIntent.getActivity(Context context, 0, intent, 0);

줄3] try{    pendingIntent.send();    } catch(Exception e) {   //익셉션    }; 

를 써서 Activty를 call한다. 이렇게 쓸 때 오류가 발생하는데 아래와 같이 한줄을 추가한다.


PendingIntent를 사용하면 ActivityManager가 FLAG_ACTIVTY_NEW_TASK를 자동으로 추가해줘서 문제가 해결된다. 
startActiivty와는 다르게 PendingIntent의 인스턴스에서 send()매서드를 사용하면 PendingIntent에 담겨진 Intent 정보를 바탕으로 Activity가 call된다.