개발 - 안드로이드

안드로이드 Notification 클릭시 Fragment 이동

개미v 2023. 9. 25. 14:04

안드로이드에서 FCM Notification을 클릭시 특정 Fragment로 이동하는 방법입니다.
검색해서 알려진 방법으로 Fragment 이동은 되나 MainActivity가 여러개 생겨서 문제가 생기는데 이를 해결하였습니다.

AndroidAManifest.xml
우선은 MainActivity가 여러개 생기지 않게 singleTask 설정합니다.

<activity
    android:name=".main.MainActivity"
    android:launchMode="singleTask" />

 

FCMService.java
FCM 수신시 Notification 알림 부분 입니다.
Intent에 이동할 fragment가 fragment2로 이동한다고 데이타를 넣어 줍니다.
이는 MainActivity의 onCreate와 onNewIntent에서 처리 됩니다.

// Notification 알림
Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("moveFragment", "fragment2");
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);

String chId = "myChId";
String chName = "myChName";

Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

NotificationCompat.Builder notiBuilder = new NotificationCompat.Builder(this, chId)
        .setSmallIcon(R.mipmap.ic_launcher)
        .setContentTitle(title)
        .setContentText(body)
        .setAutoCancel(true)
        .setSound(soundUri)
        .setContentIntent(pendingIntent);

NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel channel = new NotificationChannel(chId, chName, NotificationManager.IMPORTANCE_HIGH);
manager.createNotificationChannel(channel);
manager.notify(0, notiBuilder.build());

 

MainActivity.java
onCreate 함수와 onNewIntent 함수에서 각각 처리해주면 됩니다.

Activity 생명주기로 살펴 보면...
앱이 실행중인 상태에서 Fragment 이동시 onNewIntent 함수가 호출되고 onCreate 함수는 호출되지 않습니다.
앱이 실행중이지 않은 상태에서는 onCreate 함수가 호출되고 onNewIntent 함수는 호출 되지 않습니다.

public class MainActivity extends AppCompatActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		// 앱이 실행중이지 않은 상태에서 Notification 알림 클릭시 이동
		String extraStr = getIntent().getStringExtra("moveFragment");
		if (extraStr != null) {
			if (extraStr.equals("fragment2")) {
				Fragment2 fragment2 = new Fragment2();
                getSupportFragmentManager().beginTransaction().add(R.id.container, fragment2).commit();
			}
		}
	}
	
	@Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);

        // 앱이 실행중인 상태에서 Notification 알림 클릭시 이동
        String extraStr = intent.getStringExtra("moveFragment");
        if (extraStr != null) {
            if (extraStr.equals("fragment2")) {
                Fragment2 fragment2 = new Fragment2();
                getSupportFragmentManager().beginTransaction().add(R.id.container, fragment2).commit();
            }
        }
    }
}