본문 바로가기
Android/Dev

알림바(Notification Bar)를 누를 때 프레그먼트 실행 하기

by featherwing 2018. 4. 10.
728x90
반응형

보통, 앱에서 사용하는 알림바(Notification Bar)를 눌렀을 때는 액티비티로 이동하게 됩니다.

하지만, 프레그먼트를 사용할 때는, 프레그먼트로 이동하게 해 주어야 좀 더 다양한 작업들을 할 수 있습니다.


프레그먼트의 경우 단독으로 사용하기 보다는 여러개의 프레그먼트를 묶어서 뷰페이저를 통해서 사용하게 됩니다.


노티피케이션에서 프레그먼트를 실행하는 방법은 아래와 같은 과정을 통해서 동작하게 됩니다.


1. 알림바(Notification Bar)를 사용하여 알림.

2. 알림바를 누르면 메인액티비티를 실행.

3. 메인액티비티에서 노티피케이션에서 실행된 것을 확인하면 뷰페이저의 특정 프레그먼트로 이동.

3. 프레그먼트로 이동 이후, 원하는 작업을 수행.




1. Notification 알림 띄우기


  public static void showNotification(Context context, String title, String content, String Memo) {

        int re_Noti_ID = Noti_ID;



        Intent notificationIntent = new Intent(context, MainActivity.class);[각주:1]

        notificationIntent.putExtra("ExtraFragment", "Notification");



        notificationIntent.putExtra("Title", title);

        notificationIntent.putExtra("Content", content);

        notificationIntent.putExtra("Memo", Memo);





        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);




        TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);

        stackBuilder.addParentStack(MainActivity.class);

        stackBuilder.addNextIntent(notificationIntent);


        PendingIntent pendingIntent = stackBuilder.getPendingIntent(Noti_ID, PendingIntent.FLAG_UPDATE_CURRENT);

        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);


        if (android.os.Build.VERSION.SDK_INT >= 26) {

            if (notificationManager != null) {

                createNotiChannel(notificationManager);

            }

        }


        Notification.Builder builder = new Notification.Builder(context);


        builder.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE)

                .setSmallIcon(R.drawable.ic_frag_haksa_on)

                .setPriority(Notification.PRIORITY_MAX)

                .setContentIntent(pendingIntent)

                .setContentTitle(title)

                .setContentText(content);


        if (Build.VERSION.SDK_INT >= 26) {

            builder.setChannelId(Noti_Channel_ID);

        }


        builder.setAutoCancel(true);

        builder.setOngoing(true);


        if (Memo.length() >0) {

            Notification.BigTextStyle Style = new Notification.BigTextStyle(builder);

            Style.setBigContentTitle(title);

            Style.bigText(content + "\n" + Memo);

            Style.setSummaryText("더 보기");

            builder.setStyle(Style);

        }



        if (notificationManager != null) {

            notificationManager.notify(Noti_ID, builder.build());

        }


        Noti_ID = re_Noti_ID + 1;

    }



중요한 부분은 인텐트에 엑스트라값을 넣어주는 부분(각주1)으로 이 부분에서 실행되는 메인액티비티가 알림바에서 실행되었다는것 을 판단할 수 있게 됩니다.








*참고 : Target API 26이상의 오레오 기기에서는 아래와 같이 Notification Channel을 추가로 설정해 주지 않으면 알림바가 실행되지 않습니다.


 @TargetApi(Build.VERSION_CODES.O)

    public static void createNotiChannel(NotificationManager notificationManager) {



            CharSequence name = "사용자 알람 채널명";


            int importance = NotificationManager.IMPORTANCE_HIGH;


            NotificationChannel mChannel = new NotificationChannel(Noti_Channel_ID, name, importance);


            mChannel.enableLights(true);

            mChannel.setLightColor(Color.BLUE);

            mChannel.enableVibration(true);



            notificationManager.createNotificationChannel(mChannel);


    }













2.메인액티비티의 onCreate 주기에 다음과 같은 코드를 추가합니다.


String str = getIntent().getStringExtra("ExtraFragment");[각주:2]

        

String Title = getIntent().getStringExtra("Title");

String Content = getIntent().getStringExtra("Content");

String Memo = getIntent().getStringExtra("Memo");

  


        if(str !=null) {

            if(str.equals("Notification")) {


               viewPager.setCurrentItem(2);[각주:3]


                Handler mHandler = new Handler();[각주:4]

                mHandler.postDelayed(new Runnable() {

                    @Override

                    public void run() {

                        Fragment.ShowScreen(Title,Content,Memo);

                    }

                }, 300);


            }

        }




각주 2는 ShowNotification 메소드에서 인텐트에 넣어준 엑스트라값을 받아오는 변수입니다.

그대로 하단의 if 구문이 상단의 str값이 존재하는지를 판단하고, Notification에서 온것인지를 확인합니다.



각주3으로 뷰페이저 내부의 원하는 프레그먼트로 이동할 수 있습니다.



프레그먼트로 이동한 이후에 추가적인 작업을 실행하기 위해서는 각주 3과 같이 Handler를 이용해서 약간의 시간차를 두지 않으면

NullpointAcception이 발생할 수 있습니다.


  1. 인텐트에 엑스트라 값을 넣어서 메인엑티비티가 노티피케이션에서 실행되었는지를 판단 할 수 있게 합니다. [본문으로]
  2. 메인액티비티가 실행될 때 엑스트라값을 가지고 있는가를 판단하는 변수 입니다. [본문으로]
  3. 뷰페이저에서 원하는 프레그먼트로 이동합니다. [본문으로]
  4. 특정 프레그먼트에서 다른작업을 실행 하려 할 때, NullpointAcception을 발생하지 않게 하기 위한 부분 [본문으로]
728x90
반응형

댓글