내용 보기

작성자

관리자 (IP : 172.17.0.1)

날짜

2020-07-09 07:33

제목

[Android] Notification클릭시 PendingIntent처리하기


푸시 데이터를 받아 Notification을 띄우고 해당 Notification클릭시 원하는 Activity를 띄우기 위해서 다음과 같이 처리한다.
일단 소스 코드는 다음과 같다.

AndroidManifest.xml

<activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
 
        <!--앱이 백그라운드 상태일때 푸시 알림바 클릭시 열리는 엑티비티 및 데이터 받는 필터 설정-->
        <category android:name="android.intent.category.DEFAULT" />
 
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>
 
<activity
        android:name=".NoteActivity"
        android:theme="@style/AppTheme.NoActionBar">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainActivity" />
</activity>
 
<activity
        android:name=".ScheduleActivity"
        android:theme="@style/AppTheme.NoActionBar">
    <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity" />
</activity>
cs

// 알림 창 표시
private fun sendNotification(title: String?, body: String?, categoryId: Long?, noteId: Long?, noteType: String?)
{
 
    val notiIconClickIntent = Intent(this, MainActivity::class.java).apply {
 
        flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
 
        putExtra("categoryId", categoryId);
 
        putExtra("noteId", noteId);
 
        putExtra("noteType", noteType ?: "");
 
    }
 
 
 
    val CHANNEL_ID = "CollocNotification"
 
    val CHANNEL_NAME = "CollocChannel"
 
    val description = "This
is Colloc channel"
 
    val importance = NotificationManager.IMPORTANCE_HIGH
 
 
 
    var notificationManager: NotificationManager = this.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
 
 
 
    if( android.os.Build.VERSION.SDK_INT >=
android.os.Build.VERSION_CODES.O) {
 
        val channel = NotificationChannel(CHANNEL_ID, CHANNEL_NAME, importance)
 
        channel.description = description
 
        channel.enableLights(true)
 
        channel.lightColor = Color.RED
 
        channel.enableVibration(true)
 
        channel.setShowBadge(false)
 
       
notificationManager.createNotificationChannel(channel)
 
    }
 
 
 
    var pendingIntent = PendingIntent.getActivity(this0, notiIconClickIntent, PendingIntent.FLAG_UPDATE_CURRENT)
 
    val notificationSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
 
 
 
    var notificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
 
        //.setLargeIcon(BitmapFactory.decodeResource(resources,
R.mipmap.ic_launcher))
 
       
//.setSmallIcon(R.mipmap.ic_launcher_round)
 
        .setSmallIcon(if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) R.drawable.ic_stat_name else R.mipmap.ic_launcher_round)
 
        .setColor(ContextCompat.getColor(this, R.color.colorPrimary))
 
        .setContentTitle(title)
 
        .setContentText(body)
 
        .setAutoCancel(true)
 
        .setSound(notificationSound)
 
        .setContentIntent(pendingIntent)
 
 
 
    notificationManager.notify(0, notificationBuilder.build());
 
}
cs

NotificationCompat.Builder클래스는 build()메서드에서 알림바에 대한 설정을 하고 NotificationManager클래스의 notify()메서드로 알림을 발생시킨다.

이때 PendingIntent클래스의 getActivity로 클릭시 표시할 엑티비티를 지정한다.
위 코드상에서는 MainActivity를 표시하도록 기술 되어 있다.
푸시 알림 클릭 후 MainActivity를 표시할 때 putExtra로 여러 데이터를 넘기고
MainActivity에서 받아 처리 한다.

다음 코드는 MainActivity에서 전달할 데이터를 받아 처리 하는 부분이다.

MainActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {
    // https://stackoverflow.com/questions/20853128/connect-to-sql-server-through-android
    // StrictMode설정을 해야 MSSQL Connection시 오류가 나지 않는다..
    // 이유는 모르겠음..ㅠ
    val policy = StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
 
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(this.toolbar)
 
    // 스와이프 새로고침 이벤트 리스너 등록
    this.swipeRefreshLayout.setOnRefreshListener(this);
 
    // 푸시 알림 클릭으로 MainIntent실행시
    val categoryId = intent.getLongExtra("categoryId"-1L);
    val noteId = intent.getLongExtra("noteId"-1L);
    val noteType = intent.getStringExtra("noteType");
    // 앱 포크라운드에서 푸시 알림 클릭시
    if(categoryId > 0 && noteId > 0) {
        if(noteType == "ScheduleType") {
            startActivity<ScheduleActivity>("noteId" to noteId, "categoryId" to categoryId, "categoryText" to "");
        }
        else {
            startActivity<NoteActivity>("noteId" to noteId, "categoryId" to categoryId, "categoryText" to "");
        }
    }
    // 앱 백그라운드에서 푸시 알림 클릭시
    else {
        val bundle: Bundle? = intent.extras;
        if(bundle != null) {
            val categoryId = bundle.get("categoryId")?.toString()?.toLongOrNull();
            val noteId = bundle.get("noteId")?.toString()?.toLongOrNull();
            val noteType = bundle.get("noteType")?.toString() ?: "";
 
            if(categoryId != null && categoryId > 0 && noteId != null && noteId > 0) {
                if(noteType == "ScheduleType") {
                    startActivity<ScheduleActivity>("noteId" to noteId, "categoryId" to categoryId, "categoryText" to "");
                }
                else {
                    startActivity<NoteActivity>("noteId" to noteId, "categoryId" to categoryId, "categoryText" to "");
                }
            }
        }
    }
....
}
cs


출처1

출처2