[{"data":1,"prerenderedAt":973},["ShallowReactive",2],{"news-item-\u002Fvi\u002Fnews\u002Fandroid-firebase-for-beginer":3},{"id":4,"title":5,"body":6,"category":958,"created by":961,"date":962,"description":963,"extension":964,"meta":965,"navigation":966,"path":967,"sections":968,"seo":969,"stem":970,"thumbnail":971,"__hash__":972},"content_vi\u002Fvi\u002Fnews\u002Fandroid-firebase-for-beginer.md","Android Firebase cho người mới bắt đầu",{"type":7,"value":8,"toc":939},"minimark",[9,18,23,35,39,46,56,65,74,78,87,97,101,111,121,125,130,136,146,150,159,163,173,177,181,186,189,193,212,216,221,231,235,240,244,257,261,283,287,294,298,307,311,318,322,327,331,341,345,347,351,358,362,364,368,375,380,395,397,401,405,408,411,414,428,432,439,445,455,459,469,473,475,483,487,501,505,510,516,520,536,542,546,553,559,563,573,579,583,586,590,597,603,608,612,630,634,641,645,650,654,660,666,674,682,686,692,698,711,713,717,721,724,727,730,742,746,758,762,774,779,785,790,794,799,809,815,821,827,833,839,845,856,860,867,873,877,884,890,894,901,907,911,915,921,927,933],[10,11,14],"h1",{"style":12,"id":13},"text-align:center;","firebase",[15,16,17],"strong",{},"Firebase",[19,20,22],"h2",{"id":21},"i-firebase-là-gì","I. Firebase là gì",[24,25,26,27,34],"p",{},"Google Firebase là phần mềm phát triển ứng dụng được Google hỗ trợ cho phép các nhà phát triển phát triển ứng dụng iOS, Android và ",[28,29,33],"a",{"href":30,"rel":31},"https:\u002F\u002Fsearchsoftwarequality.techtarget.com\u002Fdefinition\u002FWeb-application-Web-app",[32],"nofollow","Web apps",". Firebase cung cấp các công cụ để theo dõi phân tích, báo cáo và khắc phục sự cố ứng dụng, tạo thử nghiệm tiếp thị và sản phẩm. Firebase có nhiều dịch vụ và hôm nay mình sẽ viết về in-app messaging, cloud messages and real-time databases.",[19,36,38],{"id":37},"iithêm-firebase-vào-dự-án","II. Thêm Firebase vào dự án",[24,40,41,42],{},"Trước khi thêm Firebase vào ứng dụng Android, chúng ta cần tạo một dự án Firebase để kết nối với ứng dụng Android của mình. Đăng nhập vào Firebase console ở liên kết này ",[28,43,44],{"href":44,"rel":45},"https:\u002F\u002Fconsole.firebase.google.com\u002F?hl=en",[32],[24,47,48,51,52,55],{},[15,49,50],{},"Bước 1",": Sau khi đăng nhập vào Firebase, chọn “",[15,53,54],{},"Create a project","” để tạo một dự án mới.",[57,58],"img",{"className":59,"alt":62,"src":63,"style":64},[60,61],"block","mx-auto","","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075255\u002FScreen-Shot-2020-02-20-at-9.31.55-AM.png","width: 100%;",[24,66,67,70,71],{},[15,68,69],{},"Bước 2",": Thực hiện theo các bước trong Firebase để tạo một dự án mới, sau khi tạo thành công, bạn sẽ thấy giao diện người dùng này, nhấp vào biểu tượng ",[15,72,73],{},"Android",[57,75],{"className":76,"alt":62,"src":77,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075332\u002FScreen-Shot-2020-02-20-at-9.43.53-AM.png",[24,79,80,83,84],{},[15,81,82],{},"Bước 3",": Bạn sẽ cần tên package trong dự án Android, bạn có thể tìm thấy tên package trong ",[15,85,86],{},"AndroidManifest",[24,88,89,94],{},[57,90],{"className":91,"alt":62,"src":92,"style":93},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075551\u002FScreen-Shot-2020-02-21-at-3.19.26-PM.png","width: 70%;",[95,96],"br",{},[57,98],{"className":99,"alt":62,"src":100,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075616\u002FScreen-Shot-2020-02-20-at-9.51.12-AM-1024x121.png",[24,102,103,106,107,110],{},[15,104,105],{},"Bước 4",": Tải file ",[15,108,109],{},"google-services.json"," và thêm vào project Android",[24,112,113,114,116,117,120],{},"Chọn mục project để có thể thấy thư mục gốc trong dự án, thêm file ",[15,115,109],{}," mới tải xuống vào thư mục \"",[15,118,119],{},"Project ➜ app","\".",[57,122],{"className":123,"alt":62,"src":124,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075822\u002FScreen-Shot-2020-02-21-at-3.20.06-PM.png",[57,126],{"className":127,"alt":62,"src":128,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075857\u002FScreen-Shot-2020-02-20-at-9.56.43-AM.png","width: 50%;",[24,131,132,135],{},[15,133,134],{},"Bước 5",": Thêm SDK Firebase",[24,137,138,141,142,145],{},[15,139,140],{},"1."," Trong\"",[15,143,144],{},"build.gradle","\" (project):",[57,147],{"className":148,"alt":62,"src":149,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07075949\u002FScreen-Shot-2020-02-20-at-9.58.50-AM.png",[24,151,152,155,156,158],{},[15,153,154],{},"2."," Trong \"",[15,157,144],{},"\" (app):",[57,160],{"className":161,"alt":62,"src":162,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080017\u002FScreen-Shot-2020-02-20-at-10.06.20-AM-1024x479.png",[24,164,165,168,169,172],{},[15,166,167],{},"Bước 6",": Cài đặt ứng dụng và chờ Firebase kiểm tra, bạn sẽ thấy thông báo khi thành công, chọn “",[15,170,171],{},"Continue to console","”, bây giờ Firebase đã được thêm vào project của bạn.",[57,174],{"className":175,"alt":62,"src":176,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080122\u002FScreen-Shot-2020-02-19-at-4.31.20-PM-31.png",[19,178,180],{"id":179},"iiiin-app-message","III. In-App Message",[182,183,185],"h3",{"id":184},"_1-giới-thiệu","1. Giới thiệu",[24,187,188],{},"Firebase In-App Messaging giúp ứng dụng của bạn có thể thu hút người dùng đang hoạt động bằng cách gửi cho họ những thông điệp tuỳ theo mục đích của bạn và khuyến khích họ sử dụng các tính năng chính của ứng dụng. Ví dụ: bạn có thể gửi tin nhắn trong ứng dụng để khiến người dùng đăng ký, xem video, hoàn thành cấp độ hoặc mua một mặt hàng nào đó. Bạn có thể tùy chỉnh tin nhắn dưới dạng cards, banners, modals, hoặc images, và bạn có thể cài đặt thời điểm hiển thị chính xác giúp cho chúng có thể mang lại lợi ích cho người dùng của bạn nhiều nhất.",[182,190,192],{"id":191},"_2-bắt-đầu","2. Bắt đầu",[24,194,195,197,198,201,202,205,206,208,209],{},[15,196,50],{},": Thêm “",[15,199,200],{},"implementation"," ",[15,203,204],{},"‘com.google.firebase:firebase-inappmessaging-display:19.0.3’"," ” vào \"",[15,207,144],{},"\" (app) và \"",[15,210,211],{},"Sync Now\"",[57,213],{"className":214,"alt":62,"src":215,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080223\u002FScreen-Shot-2020-02-19-at-4.51.31-PM-33-1024x641.png",[24,217,218,220],{},[15,219,69],{},": Lấy Firebase instance ID (ID này được dùng để test in-app messaging trên Firebase)",[222,223,228],"pre",{"className":224,"code":226,"language":227},[225],"language-text","private fun createInstanceId() {\n    FirebaseInstanceId.getInstance().instanceId.addOnCompleteListener { task ->\n        if (!task.isSuccessful) {\n            Log.w(TAG, \"getInstanceId failed\", task.exception)\n            return@addOnCompleteListener\n        }\n\n        \u002F\u002Fcreate new instance id Token\n        val msg = task.result?.id\n        Log.d(TAG, \"token: $msg\")\n    }\n}\n","text",[229,230,226],"code",{"__ignoreMap":62},[57,232],{"className":233,"alt":62,"src":234,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080253\u002FScreen-Shot-2020-02-19-at-5.01.04-PM-35-1024x417.png",[24,236,237,239],{},[15,238,82],{},": Cài đặt ứng dụng và mở Logcat để lấy ID token",[57,241],{"className":242,"alt":62,"src":243,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080319\u002FScreen-Shot-2020-02-19-at-5.23.36-PM-51-1024x625.png",[24,245,246,248,249,252,253,256],{},[15,247,105],{},": Sau khi lấy được ID token, vào Firebase Console và đi đến mục ",[15,250,251],{},"In-App Messaging",", chọn “",[15,254,255],{},"Create your first campaign","”",[57,258],{"className":259,"alt":62,"src":260,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080401\u002FScreen-Shot-2020-02-19-at-5.06.23-PM-41-1024x606.png",[24,262,263,265,266,269,270,273,274,277,278,282],{},[15,264,134],{},": Nhập \"",[15,267,268],{},"Message title\""," (vd: Hello I'm FireBase), \"",[15,271,272],{},"Body","\" (không bắt buộc), ",[15,275,276],{},"Images"," (vd: ",[28,279,280],{"href":280,"rel":281},"https:\u002F\u002Fcdn.pixabay.com\u002Fphoto\u002F2015\u002F10\u002F12\u002F14\u002F54\u002Fcoffee-983955_960_720.jpg",[32],")",[57,284],{"className":285,"alt":62,"src":286,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080500\u002FScreen-Shot-2020-02-19-at-5.12.17-PM-45-1.png",[24,288,289,290,293],{},"Thêm ",[15,291,292],{},"\"Button Text\""," (vd: ok)",[57,295],{"className":296,"alt":62,"src":297,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080533\u002FScreen-Shot-2020-02-19-at-5.12.47-PM-47.png",[24,299,300,302,303,306],{},[15,301,167],{},": Chọn “",[15,304,305],{},"Test on Device","”, và thêm ID token đã được hiển thị trong Logcat (Bước 3)",[57,308],{"className":309,"alt":62,"src":310,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080559\u002FScreen-Shot-2020-02-19-at-5.17.37-PM-49.png",[24,312,313,314,317],{},"Firebase In-App Messaging sẽ gửi tin nhắn đến cho bạn ngay sau khi chọn ",[15,315,316],{},"Test",". để thấy được tin nhắn, cho ứng dụng của bạn xuống background sau đó mở lại app.",[57,319],{"className":320,"alt":62,"src":321,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080625\u002FScreen-Shot-2020-02-19-at-5.24.22-PM-53-1024x663.png",[24,323,324],{},[15,325,326],{},"Kết quả sau khi mở lại ứng dụng:",[57,328],{"className":329,"alt":62,"src":330,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080648\u002FScreenshot_20200219-173204-57-768x1365.jpg",[24,332,333,336,337,340],{},[15,334,335],{},"Bước 7",": Sau khi test thành công , chọn \"",[15,338,339],{},"Next","\" để tiếp tục",[57,342],{"className":343,"alt":62,"src":344,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080709\u002FScreen-Shot-2020-02-20-at-10.50.56-AM.png",[95,346],{},[57,348],{"className":349,"alt":62,"src":350,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080755\u002FScreen-Shot-2020-02-20-at-10.54.15-AM.png",[24,352,353,354,357],{},"Chọn \"",[15,355,356],{},"Review\""," để publish tin nhắn.",[57,359],{"className":360,"alt":62,"src":361,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080836\u002FScreen-Shot-2020-02-20-at-10.56.19-AM.png",[95,363],{},[57,365],{"className":366,"alt":62,"src":367,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080911\u002FScreen-Shot-2020-02-20-at-10.55.31-AM-1024x663.png",[24,369,370,371,374],{},"Khi chọn \"",[15,372,373],{},"Publish\""," tin nhắn sẽ được gửi đến ứng dụng của bạn.",[24,376,377],{},[15,378,379],{},"Kết quả:",[381,382,387,391],"div",{"className":383},[384,385,386],"flex","justify-center","gap-4",[57,388],{"className":389,"alt":62,"src":390,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080936\u002FScreenshot_20200219-173204-57-1-576x1024.jpg",[57,392],{"className":393,"alt":62,"src":394,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07080953\u002FScreenshot_20200219-173801-59-576x1024.jpg",[95,396],{},[57,398],{"className":399,"alt":62,"src":400,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081013\u002FScreenshot_20200219-173901-61-576x1024.jpg",[19,402,404],{"id":403},"iv-cloud-message","IV. Cloud Message",[182,406,185],{"id":407},"_1-giới-thiệu-1",[24,409,410],{},"Firebase Cloud Messaging (FCM) là một giải pháp nhắn tin đa nền tảng cho phép bạn gửi tin nhắn một cách đáng tin cậy và hoàn toàn miễn phí. sử dụng FCM, bạn có thông báo đến cho người dùng rằng email mới hoặc dữ liệu khác đã có sẵn để đồng bộ hóa. Bạn có thể gửi tin nhắn thông báo để thúc đẩy sự tham gia và duy trì của người dùng. Đối với các trường hợp sử dụng như nhắn tin tức thời, tin nhắn có thể chuyển tải trọng lên tới 4KB cho ứng dụng.",[182,412,192],{"id":413},"_2-bắt-đầu-1",[24,415,416,197,418,201,420,423,424,208,426],{},[15,417,50],{},[15,419,200],{},[15,421,422],{},"'com.google.firebase:firebase-messaging:20.1.0'"," ” vào \"",[15,425,144],{},[15,427,211],{},[57,429],{"className":430,"alt":62,"src":431,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081040\u002FScreen-Shot-2020-02-20-at-8.07.39-AM-63-1024x627.png",[24,433,434,436,437],{},[15,435,69],{}," : Thêm service vào File ",[15,438,86],{},[222,440,443],{"className":441,"code":442,"language":227},[225],"\u003Cservice\n     android:name=\".java.MyFirebaseMessagingService\"\n     android:exported=\"false\">\n     \u003Cintent-filter>\n         \u003Caction android:name=\"com.google.firebase.MESSAGING_EVENT\" \u002F>\n     \u003C\u002Fintent-filter>\n\u003C\u002Fservice>\n",[229,444,442],{"__ignoreMap":62},[24,446,447,450,451,454],{},[15,448,449],{},"MyFirebaseMessagingService"," thừa kế từ ",[15,452,453],{},"FirebaseMessagingService",". Đây là bắt buộc nếu bạn muốn xử lý bất kì tin nhắn thông báo nào trên ứng dụng của bạn chạy dưới background. Để nhận thông báo trong foreground ứng dụng, để nhận dữ liệu, để gửi các thư ngược lại và nhiều hơn nữa... Bạn phải thừa kế từ service này.",[57,456],{"className":457,"alt":62,"src":458,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081111\u002FScreen-Shot-2020-02-20-at-8.13.02-AM-65-1024x625.png",[24,460,461,462,465,466,468],{},"Bây giờ bạn sẽ thấy ",[15,463,464],{},"dòng 23"," bị lỗi, bởi vì chưa có class ",[15,467,449],{}," trong project",[57,470],{"className":471,"alt":62,"src":472,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081137\u002FScreen-Shot-2020-02-20-at-8.16.28-AM-67.png",[95,474],{},[24,476,477,481],{},[57,478],{"className":479,"alt":62,"src":480,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081206\u002FScreen-Shot-2020-02-20-at-8.17.14-AM-69.png",[95,482],{},[57,484],{"className":485,"alt":62,"src":486,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081227\u002FScreen-Shot-2020-02-20-at-8.17.30-AM-71-1024x183.png",[24,488,489,490,493,494,500],{},"Đổi package name từ ",[15,491,492],{},".java.MyFirebaseMessagingService"," thành ",[15,495,496],{},[497,498,499],"package",{},".MyFirebaseMessagingService",".",[57,502],{"className":503,"alt":62,"src":504,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081251\u002FScreen-Shot-2020-02-20-at-8.24.31-AM-77-1024x627.png",[24,506,507,509],{},[15,508,82],{}," (Không bắt buộc): Thêm icon mặc định và màu, bạn có thể bỏ qua bước này nếu như bạn không cần",[222,511,514],{"className":512,"code":513,"language":227},[225],"\u003C!-- Set custom default icon. This is used when no icon is set for incoming notification messages.\n     See README(https:\u002F\u002Fgoo.gl\u002Fl4GJaQ) for more. -->\n\u003Cmeta-data\n    android:name=\"com.google.firebase.messaging.default_notification_icon\"\n    android:resource=\"@drawable\u002Fic_stat_ic_notification\" \u002F>\n\u003C!-- Set color used with incoming notification messages. This is used when no color is set for the incoming\n     notification message. See README(https:\u002F\u002Fgoo.gl\u002F6BKBk7) for more. -->\n\u003Cmeta-data\n    android:name=\"com.google.firebase.messaging.default_notification_color\"\n    android:resource=\"@color\u002FcolorAccent\" \u002F>\n",[229,515,513],{"__ignoreMap":62},[57,517],{"className":518,"alt":62,"src":519,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081324\u002FScreen-Shot-2020-02-20-at-8.36.41-AM-79-1024x627.png",[24,521,522,524,525,493,528,531,532,535],{},[15,523,105],{}," (Không bắt buộc): Từ Android 8.0 (API level 26) và cao hơn, các thông báo đã được hỗ trợ và đề xuất. FCM cung cấp thông báo mặc định với cài đặt cơ bản. Còn nếu bạn muốn thông báo với giao diện của riêng mình, bạn hãy đặt ",[15,526,527],{},"default_notification_channel_id",[15,529,530],{},"ID"," thông báo của bạn như hình bên dưới. FCM sẽ sử dụng giá trị này với bất cứ tin nhắn nào đến mà không thiết lập thông báo nào vào thư mục ",[15,533,534],{},"res\u002Fvalues\u002Fstrings.xml"," và thêm dòng code này.",[222,537,540],{"className":538,"code":539,"language":227},[225],"\u003Cstring name=\"default_notification_channel_id\">1\u003C\u002Fstring>\n",[229,541,539],{"__ignoreMap":62},[57,543],{"className":544,"alt":62,"src":545,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081349\u002FScreen-Shot-2020-02-20-at-8.44.38-AM-83-1024x350.png",[24,547,548,549,552],{},"Mở file ",[15,550,551],{},"AndroidMnifest"," và thêm đoạn code này.",[222,554,557],{"className":555,"code":556,"language":227},[225],"\u003Cmeta-data\n    android:name=\"com.google.firebase.messaging.default_notification_channel_id\"\n    android:value=\"@string\u002Fdefault_notification_channel_id\" \u002F>\n",[229,558,556],{"__ignoreMap":62},[57,560],{"className":561,"alt":62,"src":562,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081416\u002FScreen-Shot-2020-02-20-at-8.46.55-AM-85-1024x627.png",[24,564,565,566,568,569,572],{}," ",[15,567,134],{},": Vào file ",[15,570,571],{},"MainActivity"," để lấy token (dùng để test FCM)",[222,574,577],{"className":575,"code":576,"language":227},[225],"private fun createInstanceId() {\n    FirebaseInstanceId.getInstance().instanceId.addOnCompleteListener { task ->\n        if (!task.isSuccessful) {\n            Log.w(TAG, \"getInstanceId failed\", task.exception)\n            return@addOnCompleteListener\n        }\n\n        \u002F\u002Fget id Token\n        \u002F\u002F Get new Instance ID token\n        val token = task.result?.token\n\n        \u002F\u002F Log and toast\n        Log.d(TAG, \"token: $token\")\n        Toast.makeText(baseContext, \"token: $token\", Toast.LENGTH_SHORT).show()\n    }\n}\n",[229,578,576],{"__ignoreMap":62},[57,580],{"className":581,"alt":62,"src":582,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081446\u002FScreen-Shot-2020-02-20-at-8.56.08-AM-87-1024x626.png",[24,584,585],{},"Cài app vào chạy, nếu thành công bạn sẽ nhận được Firebase instance ID.",[57,587],{"className":588,"alt":62,"src":589,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081508\u002FScreenshot_20200220-125154-768x1365.jpg",[24,591,592,594,595],{},[15,593,167],{},": Thiết lập file ",[15,596,449],{},[222,598,601],{"className":599,"code":600,"language":227},[225],"class MyFirebaseMessagingService : FirebaseMessagingService() {\n    companion object {\n        private val TAG = this::class.java.simpleName\n    }\n\n    override fun onNewToken(token: String) {\n        Log.d(TAG, \"Refreshed token: $token\")\n        super.onNewToken(token)\n    }\n\n    override fun onMessageReceived(remoteMessage: RemoteMessage) {\n        super.onMessageReceived(remoteMessage)\n        Log.d(TAG, \"From: ${remoteMessage.from}\")\n\n        remoteMessage.data.isNotEmpty().let {\n        }\n\n        remoteMessage.notification?.let {\n            Log.d(TAG, \"Message Notification Body: ${it.body}\")\n            it.body?.let { body ->\n                sendNotification(body)\n            }\n        }\n    }\n\n    private fun sendNotification(messageBody: String) {\n        val intent = Intent(this, CloudMessageActivity::class.java)\n        intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP\n        val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT)\n\n        val channelId = getString(R.string.default_notification_channel_id)\n        val defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)\n        val notificationBuilder = NotificationCompat.Builder(this, channelId)\n            .setSmallIcon(R.drawable.ic_notifications)\n            .setContentTitle(\"Mess Title\")\n            .setContentText(messageBody)\n            .setAutoCancel(true)\n            .setSound(defaultSoundUri)\n            .setContentIntent(pendingIntent)\n\n        val notificationManager =\n            getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n            val channel = NotificationChannel(\n                channelId, \"Channel human readable title\",\n                NotificationManager.IMPORTANCE_DEFAULT\n            )\n            notificationManager.createNotificationChannel(channel)\n        }\n\n        notificationManager.notify(1, notificationBuilder.build())\n    }\n}\n",[229,602,600],{"__ignoreMap":62},[24,604,605,607],{},[15,606,335],{},": Test FCM trên Firebase",[57,609],{"className":610,"alt":62,"src":611,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081528\u002FScreen-Shot-2020-02-20-at-12.47.45-PM.png",[24,613,614,615,618,619,621,622,625,626],{},"Nhập ",[15,616,617],{},"Title",", ",[15,620,227],{}," và ",[15,623,624],{},"image"," (không bắt buộc) vd ",[28,627,628],{"href":628,"rel":629},"https:\u002F\u002Fcdn.pixabay.com\u002Fphoto\u002F2017\u002F07\u002F07\u002F02\u002F05\u002Fsymbol-2480161_960_720.png",[32],[57,631],{"className":632,"alt":62,"src":633,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081545\u002FScreen-Shot-2020-02-20-at-1.00.12-PM.png",[24,635,636,637,640],{},"Thêm ID token đã lấy được trong ",[15,638,639],{},"Logcat"," (bước 5)",[57,642],{"className":643,"alt":62,"src":644,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081608\u002FScreen-Shot-2020-02-20-at-1.07.28-PM.png",[24,646,647],{},[15,648,649],{},"Kết quả test:",[57,651],{"className":652,"alt":62,"src":653,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081635\u002FScreenshot_20200220-141558-768x1365.jpg",[24,655,656,659],{},[15,657,658],{},"Bước 8",": Tạo và gửi tin nhắn",[24,661,662,663,665],{},"Sau khi test thành công, chọn \"",[15,664,339],{},"\"để tiếp tục",[24,667,668,672],{},[57,669],{"className":670,"alt":62,"src":671,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081717\u002FScreen-Shot-2020-02-20-at-2.22.42-PM.png",[95,673],{},[24,675,676,680],{},[57,677],{"className":678,"alt":62,"src":679,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081729\u002FScreen-Shot-2020-02-20-at-2.25.56-PM.png",[95,681],{},[57,683],{"className":684,"alt":62,"src":685,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081755\u002FScreen-Shot-2020-02-20-at-2.23.43-PM.png",[24,687,688,689,691],{},"Sau khi chọn \"",[15,690,373],{}," Firebase sẽ gửi tin nhắn đến cho ứng dụng",[24,693,694,697],{},[15,695,696],{},"Kết quả",":",[381,699,701,706],{"className":700},[384,385,386],[57,702],{"className":703,"alt":62,"src":704,"style":705},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081831\u002FScreenshot_20200220-144456_One-UI-Home-768x652.jpg","width: 60%;",[57,707],{"className":708,"alt":62,"src":709,"style":710},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081852\u002FScreenshot_20200220-144505-768x954.png","width: 40%;",[95,712],{},[57,714],{"className":715,"alt":62,"src":716,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07081914\u002FScreenshot_20200220-144509-576x1024.jpg",[19,718,720],{"id":719},"v-realtime-database","V. Realtime Database",[182,722,185],{"id":723},"_1-giới-thiệu-2",[24,725,726],{},"Firebase Realtime Database là cơ sở dữ liệu lưu trữ trên mây. Dữ liệu được lưu trữ và đồng bộ hóa theo thời gian thực với mỗi client được kêt nối. Khi bạn xây dựng ứng dụng đa nền tảng với iOS, Android, và javascript SDK, tất cả các client của bạn chia sẽ một thể hiện Realtime Database và tự động tiếp nhận các thay đổi với dữ liệu mới nhất.",[182,728,192],{"id":729},"_2-bắt-đầu-2",[24,731,732,197,734,737,738,208,740],{},[15,733,50],{},[15,735,736],{},"implementation 'com.google.firebase:firebase-database:19.2.1'","” vào \"",[15,739,144],{},[15,741,211],{},[57,743],{"className":744,"alt":62,"src":745,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07082008\u002FScreen-Shot-2020-02-20-at-3.26.15-PM-1024x382.png",[24,747,748,750,751,754,755],{},[15,749,69],{},": Sửa \"",[15,752,753],{},"Rules","\" realtime database thành ",[15,756,757],{},"true",[57,759],{"className":760,"alt":62,"src":761,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07082049\u002FScreen-Shot-2020-02-20-at-3.38.14-PM-1024x541.png",[24,763,764,765,767,768,773],{},"chi tiết về \"",[15,766,753],{},"\" của real time database bạn có thể xem ở ",[28,769,772],{"href":770,"rel":771},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fdatabase\u002Fsecurity\u002Fquickstart#sample-rules%22",[32],"link"," này",[24,775,776,778],{},[15,777,82],{},": Tạo class UserModel",[222,780,783],{"className":781,"code":782,"language":227},[225],"data class UserModel(\n    var id: String = \"\",\n    var name: String = \"\",\n    var age: Int = 0,\n    var email: String = \"\"\n) {\n    override fun toString(): String {\n        return \"UserModel(id='$id', name='$name', age=$age, email='$email')\"\n    }\n}\n",[229,784,782],{"__ignoreMap":62},[24,786,787,789],{},[15,788,105],{},": Tạo 1 layout gồm 3 edit text (name, age and email), 4 button (insert, get, update, delete), 1 recycler view để chứa dữ liệu User",[57,791],{"className":792,"alt":62,"src":793,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07082107\u002FScreenshot_20200220-160304-739x1536.png",[24,795,796],{},[15,797,798],{},"Bước 5:",[800,801,802],"ul",{},[803,804,805,697],"li",{},[806,807,808],"em",{},"Thêm dữ liệu vào database",[24,810,811,812],{},"Đầu tiên, khởi tạo biến ",[15,813,814],{},"databaseReference",[222,816,819],{"className":817,"code":818,"language":227},[225],"private fun initDatabase() {\n    databaseReference = FirebaseDatabase.getInstance().reference\n}\n",[229,820,818],{"__ignoreMap":62},[24,822,823,824,500],{},"Tiếp theo, lấy dữ liệu từ EditText và ",[806,825,826],{},"thêm vào database",[222,828,831],{"className":829,"code":830,"language":227},[225],"private fun insertUser() {\n    if (edt_name.text.isNullOrEmpty() || edt_age.text.isNullOrEmpty() || edt_email.text.isNullOrEmpty()) {\n        Toast.makeText(this, \"Some field are missing.\", Toast.LENGTH_SHORT).show()\n        return\n    }\n\n    \u002F\u002Fget key\n    val key = databaseReference.child(\"User\").push().key\n\n    \u002F\u002Fget user data from edit text\n    val user = UserModel(\n        name = edt_name.text.toString(),\n        age = edt_age.text.toString().toInt(),\n        email = edt_email.text.toString()\n    )\n\n    key?.let {\n        user.id = key\n\n        \u002F\u002F Write a data to the database\n        databaseReference.child(\"User\").child(key).setValue(user).addOnSuccessListener {\n            clearText()\n            \u002F\u002Fget user data from database\n            getUser()\n            \u002F\u002Fscroll to new item\n            recycler_user.scrollToPosition(recyclerAdapter.userList.size - 1)\n        }\n            .addOnFailureListener {\n                Toast.makeText(this, \"Upload Error\", Toast.LENGTH_SHORT).show()\n            }\n    }\n}\n",[229,832,830],{"__ignoreMap":62},[24,834,835,836],{},"Ở sự kiện click của ",[15,837,838],{},"button_insert",[222,840,843],{"className":841,"code":842,"language":227},[225],"btn_insert.setOnClickListener {\n    insertUser()\n}\n",[229,844,842],{"__ignoreMap":62},[24,846,847,848,851,852,855],{},"sau khi chọn ",[15,849,850],{},"button","_",[15,853,854],{},"insert"," dữ liệu sẽ được thêm vào database ngay lập tức.",[57,857],{"className":858,"alt":62,"src":859,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07082139\u002FScreen-Shot-2020-02-20-at-4.36.54-PM.png",[800,861,862],{},[803,863,864],{},[806,865,866],{},"Đọc dữ liệu trên database:",[222,868,871],{"className":869,"code":870,"language":227},[225],"private fun getUser() {\n    databaseReference.child(\"User\").addValueEventListener(object : ValueEventListener {\n        override fun onCancelled(dataError: DatabaseError) {\n            Toast.makeText(this@DataBaseActivity, \"Upload Error\", Toast.LENGTH_SHORT).show()\n        }\n\n        override fun onDataChange(dataSnapshot: DataSnapshot) {\n\n            \u002F\u002Fget user list from database\n            val list = dataSnapshot.children.mapNotNull {\n                it.getValue(UserModel::class.java)\n            }\n            list.forEach {\n                Log.i(\"Users\", it.toString())\n            }\n            \u002F\u002Fadd to recycler view\n            if (list.isNotEmpty()) {\n                recyclerAdapter.userList.clear()\n                recyclerAdapter.userList.addAll(list)\n                recyclerAdapter.notifyDataSetChanged()\n            }\n        }\n    })\n}\n",[229,872,870],{"__ignoreMap":62},[57,874],{"className":875,"alt":62,"src":876,"style":129},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07082214\u002FScreenshot_20200221-082417-739x1536.png",[800,878,879],{},[803,880,881],{},[806,882,883],{},"Update dữ liệu trên database",[222,885,888],{"className":886,"code":887,"language":227},[225],"private fun updateUser() {\n    user?.let {\n        \u002F\u002Fcreate new user object\n        val user = UserModel(\n            it.id,\n            edt_name.text.toString(),\n            edt_age.text.toString().toInt(),\n            edt_email.text.toString()\n        )\n        \u002F\u002Fupdate user\n        databaseReference.child(\"User\u002F${it.id}\").setValue(user)\n    }\n}\n",[229,889,887],{"__ignoreMap":62},[57,891],{"className":892,"alt":62,"src":893,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07082239\u002FScreen-Shot-2020-02-20-at-5.13.21-PM.png",[800,895,896],{},[803,897,898],{},[806,899,900],{},"Delete  dữ liệu trên database",[222,902,905],{"className":903,"code":904,"language":227},[225],"private fun deleteUser() {\n    \u002F\u002F get user id\n    val query =\n        databaseReference.child(\"User\").orderByChild(\"id\").equalTo(user?.id)\n\n    query.addListenerForSingleValueEvent(object : ValueEventListener {\n        override fun onDataChange(dataSnapshot: DataSnapshot) {\n            for (user in dataSnapshot.children) {\n                \u002F\u002Fremove user\n                user.ref.removeValue().addOnSuccessListener {\n                    clearText()\n                }\n            }\n        }\n\n        override fun onCancelled(databaseError: DatabaseError) {\n            Log.e(\n                TAG,\n                \"onCancelled\",\n                databaseError.toException()\n            )\n        }\n    })\n    getUser()\n}\n",[229,906,904],{"__ignoreMap":62},[57,908],{"className":909,"alt":62,"src":910,"style":64},[60,61],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2020\u002F02\u002F07082302\u002FScreen-Shot-2020-02-20-at-5.14.08-PM.png",[19,912,914],{"id":913},"vi-link-tham-khảo","VI. Link tham khảo",[24,916,917],{},[28,918,919],{"href":919,"rel":920},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fguides",[32],[24,922,923],{},[28,924,925],{"href":925,"rel":926},"https:\u002F\u002Fgithub.com\u002Ffirebase\u002Fquickstart-android\u002Fblob\u002F995be41782f84b3c54e41d7d7e5d3a5048fe329e\u002Fmessaging\u002Fapp\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fgoogle\u002Ffirebase\u002Fquickstart\u002Ffcm\u002Fkotlin\u002FMyFirebaseMessagingService.kt#L65-L77",[32],[24,928,929],{},[28,930,931],{"href":931,"rel":932},"https:\u002F\u002Fproandroiddev.com\u002Ffirebase-android-playground-realtime-database-560d4e18404a",[32],[24,934,935],{},[28,936,937],{"href":937,"rel":938},"https:\u002F\u002Fwww.learnhowtoprogram.com\u002Fandroid\u002Fdata-persistence\u002Ffirebase-reading-data-and-event-listeners",[32],{"title":62,"searchDepth":940,"depth":940,"links":941},2,[942,943,944,949,953,957],{"id":21,"depth":940,"text":22},{"id":37,"depth":940,"text":38},{"id":179,"depth":940,"text":180,"children":945},[946,948],{"id":184,"depth":947,"text":185},3,{"id":191,"depth":947,"text":192},{"id":403,"depth":940,"text":404,"children":950},[951,952],{"id":407,"depth":947,"text":185},{"id":413,"depth":947,"text":192},{"id":719,"depth":940,"text":720,"children":954},[955,956],{"id":723,"depth":947,"text":185},{"id":729,"depth":947,"text":192},{"id":913,"depth":940,"text":914},[959,960],"mobile","tech talk","Briswell Vietnam Co Ltd","2020-02-25","Firebase là gì Google Firebase là phần mềm phát triển ứng dụng được Google hỗ trợ cho phép các nhà phát triển phát triển ứng dụng iOS, Android và Web apps. Firebase cung cấp các công cụ để theo dõi phân tích, báo cáo và khắc phục sự cố ứng dụng, tạo thử nghiệm tiếp thị và sản phẩm.","md",{},true,"\u002Fvi\u002Fnews\u002Fandroid-firebase-for-beginer",null,{"title":5,"description":963},"vi\u002Fnews\u002Fandroid-firebase-for-beginer","https:\u002F\u002Fhomepage-media.s3.ap-southeast-1.amazonaws.com\u002Fwp-content\u002Fuploads\u002F2026\u002F06\u002F05080300\u002FFirebase.jpg","p1PsAiypQEQIbHkTnqXIQTnU0h6fpb4U-Mt31v_RZic",1782205035171]