ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] pendingIntent putExtra 및 주의 사항
    Android📱 2024. 9. 12. 21:33

    요즘 Service를 많이 다루다 보니 notification에서 주로 많이 쓰는 pendingIntent를 많이 사용하고 있다.

    pendingIntent란 기본적으로 intent가 컴포넌트간의 통신과 데이터 전달을 위한 클래스라고 한다면

    그에 확장된 버전으로 intent를 지연시켜 발생하는 시키는 방식으로 개발자가 원하는 시점을 정의해 놓고  외부 어플리케이션이나 시스템에 실행 시점을 양도하여 intent를 발생시키는 방식이다.

     

    함정을 파놓고 외부에서 함정을 밟으면 작동하는 원리와 비슷한 느낌이다.

     

    보통 Notification이나 위젯에서 많이 사용을 하게된다고 한다

    나는 서비스를 이용한 앱 위에 그리기에서 인터렉션을 구현 중이라 사용하게 되었는데

    문제가 있었다

     

    문제

     

    intent를 사용하듯 putExtra로 값을 넣어 줬는데 

    Activity에서 intent에 값이 오지 않는 현상이 발생하였다

     

    기존 코드

     

    val intent = packageManager.getLaunchIntentForPackage(packageName)?.apply {
    	putExtra("call", true)
    }
    
    val pendingIntent = 
    	PendingIntent.getActivity(
    		this,
            	REQUEST_CODE,
    		intent,
    		PendingIntent.FLAG_IMMUTABLE,
    	)
        
    pendingIntent.send()

     

    이러한 방식으로 값을 전달하면 값이 제대로 오지 않게된다.

     

    일단 내 상황에서의 문제는 requestCode였다

    2개의 pendingIntent를 이용하는데 

    requestCode를 같은 값을 써서 받아 오지 못하는 거였다 ㅡㅡ

     

    그 과정에서 알게 된 주의 사항들

     

    1.

    PendingIntent.FLAG_UPDATE_CURRENT

     

    만약 getActivity의 flags 파라미터에 FLAG_IMMUTABLE 혹은 FLAG_MUTABLE을 넣지 않는다면

    안드로이드 12 이상에서는 앱이 종료되는 것을 볼 수 있을 것이다

     

    고로 둘 중 하나를 넣어주거나 버전 분기가 필요하다

     

    FLAG_IMMUTABLE와 FLAG_MUTABLE는 이름 그대로 변경이 가능한가 아닌가의 차이이다.

    기존 pendingIntent가 존재할 때 새 값을 무시할 것인가 변경할 것인가의 차이이다

    만약 중간에 값이 변경되어야 한다면 FLAG_MUTABLE 아니면 FLAG_IMMUTABLE을 명시해 주면 된다

     

    2.

     

    내가 겪은 문제인데

    getActivity()의 파라미터 중 requestCode를 명확하게 해주어야 한다.

    만약 FLAG까지 써서 값을 변경 가능하게 했다면

    이상한 값을 받아 올 수도 있다

     

    requestCode가 pendingIntent의 구분 값이라는 느낌을 받았다

     

Designed by Tistory.