이전글에서 푸시를 사용할수 있게 준비 해줬다면 이제는 개발 소스를 수정하여 기능을 만들어줘야 합니다.




푸시 동작은 폰을 찾기 부터 시작됩니다.


푸시 데이터가 발송되면 폰 마다 다른 토큰이라는 것으로 폰을 찾고 그 곳에만 데이터를 보내주게 됩니다.


따라서 앱이 실행될때 토큰을 만들거나, 기간이 지난 토큰은 새로 만들어주는 프로세스가 필요 합니다.




여기서는 위 내용에 따라 크게 토큰을 생성하는 부분, 메시지를 받아서 필요에 맞게 변형하는 부분, 변형한 메시지를 푸시로 표현하는 부분 을 개발하게 됩니다.










1. FirebaseInstanceIDService 자바클래스 파일을 만들어 줍니다.











2.  FirebaseInstanceIDService 파일에 아래 내용을 파일에 수정 합니다. 푸시를 받기 위해 폰에 토큰을 생성하거나 새로고침하는 내용 입니다.


public class FirebaseInstanceIDService extends FirebaseInstanceIdService {


    private static final String TAG = "MyFirebaseIIDService";


    // [START refresh_token]

    @Override

    public void onTokenRefresh() {

        // Get updated InstanceID token.

        String token = FirebaseInstanceId.getInstance().getToken();


    }


}

 












3. FirebaseMessagingService 자바클래스 파일을 만들어 줍니다.











4. FirebaseMessagingService 파일에 아래 내용을 수정 합니다. 간략히 작성된 내용을 설명드리면 title, contents, imgurl 데이터를 가지는 json 푸시 데이터가 오면 안드로이드에서 사용가능한 데이터로 추출하여 푸시 알림을 설정하는 내용 입니다.



public class FirebaseMessagingService extends com.google.firebase.messaging.FirebaseMessagingService {

    private static final String TAG = "FirebaseMsgService";

    public String title,contents,imgurl;


    // [START receive_message]

    @Override

    public void onMessageReceived(RemoteMessage remoteMessage) {


        sendPushNotification(remoteMessage.getData().get("message"));

    }


    private void sendPushNotification(String message) {


        System.out.println("received message : " + message);




        try {


            JSONObject  jsonRootObject = new JSONObject(message);


            title = jsonRootObject.getString("title");

            contents = jsonRootObject.getString("contents");

            imgurl = jsonRootObject.getString("imgurl");



        } catch (JSONException e) {

            e.printStackTrace();

        }


        Bitmap bitmap = getBitmapFromURL(imgurl);



        Intent intent = new Intent(this, MainActivity.class);

        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,

                PendingIntent.FLAG_ONE_SHOT);


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

        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)

                .setSmallIcon(R.drawable.bar_icon)

                .setLargeIcon(bitmap)

                .setContentTitle(title)

                .setContentText(contents)

                .setAutoCancel(true)

                .setSound(defaultSoundUri).setLights(000000255,500,2000)

                .setContentIntent(pendingIntent);




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


        PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);

        PowerManager.WakeLock wakelock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");

        wakelock.acquire(5000);



        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());

    }




    public Bitmap getBitmapFromURL(String strURL) {

        try {

            URL url = new URL(strURL);

            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            connection.setDoInput(true);

            connection.connect();

            InputStream input = connection.getInputStream();

            Bitmap myBitmap = BitmapFactory.decodeStream(input);

            return myBitmap;

        } catch (IOException e) {

            e.printStackTrace();

            return null;

        }

    }



}

 









5. MainActivity 파일을 열어  수정 합니다. 언제든지 푸시 데이터가 오면 푸시가 실행될수 있도록 해줍니다. (항상 대기..) 여기서 notice는 푸시 받을 곳의 이름 입니다.


public class MainActivity extends AppCompatActivity {


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);


        FirebaseMessaging.getInstance().subscribeToTopic("notice");


    }


}

 










6. 알림이 왔을때 안드로이드 상단바에 표시될 아이콘 이미지를 설정해 줍니다.












6-1. Image Asset 을 선택해 줍니다.












6-2. Icon Type은 Action Bar and Tab Icons Name은 bar_icon으로 설정해 줍니다.









6-3. Next를 클릭하면 이미지가 자동으로 만들어 집니다.














[목차]


1. 프로젝트 생성 하기 - 안드로이드 모바일웹으로 하이브리드앱 만들기 1


2. 푸시 사용 준비하기 (FCM) - 안드로이드 모바일웹으로 하이브리드앱 만들기 2


3. 푸시 기능 만들기 (FCM) - 안드로이드 모바일웹으로 하이브리드앱 만들기 3


4. 푸시 테스트 하기 - 안드로이드 모바일웹으로 하이브리드앱 만들기 4


5. 웹뷰추가하기 - 안드로이드 모바일웹으로 하이브리드앱 만들기 5


6. 웹뷰에서 자바스크립트 동작 처리하기 - 안드로이드 모바일웹으로 하이브리드앱 만들기 6


7. 뒤로 버튼 눌렀을때 동작 처리하기 - 안드로이드 모바일웹으로 하이브리드앱 만들기 7


8. 인트로(스플레시) 만들기 - 안드로이드 모바일웹으로 하이브리드앱 만들기 8


9. 아이콘 설정하기 - 안드로이드 모바일웹으로 하이브리드앱 만들기 9


10. 테스트용 APK 추출하기 - 안드로이드 모바일웹으로 하이브리드앱 만들기 10









copyright (c) 2017 워크식스


  1. dooboo 2018.02.18 10:46 신고

    음.. powermanager을 사용하는곳도 있고 안사용하는곳도있던데..사용하는 이유가 무었인가요??

    • 2018.02.19 02:02

      비밀댓글입니다

+ Recent posts