Bước 3: Thêm chuông báo và thông báo

Trong bước này, bạn sẽ tìm hiểu:

  • Cách đánh thức ứng dụng của bạn vào những khoảng thời gian cụ thể để thực thi các tác vụ trong nền.
  • Cách sử dụng thông báo trên màn hình để thu hút sự chú ý đến một nội dung quan trọng.

Thời gian ước tính để hoàn tất bước này: 20 phút. Để xem trước những việc bạn sẽ hoàn thành trong bước này, hãy chuyển xuống cuối trang này ↓.

Cải thiện ứng dụng Việc cần làm bằng lời nhắc

Cải thiện ứng dụng Việc cần làm bằng cách thêm chức năng nhắc người dùng nếu họ có việc cần làm chưa làm, ngay cả khi ứng dụng đã đóng.

Trước tiên, bạn cần thêm một cách để ứng dụng thường xuyên kiểm tra những việc cần làm chưa hoàn thành. Tiếp theo, ứng dụng cần hiển thị thông báo cho người dùng, ngay cả khi cửa sổ ứng dụng Công việc đã đóng. Để thực hiện điều này, bạn cần tìm hiểu cách hoạt động của chuông báo và thông báo trong Ứng dụng Chrome.

Thêm báo thức

Sử dụng chrome.alarms để thiết lập khoảng thời gian đánh thức. Trong thời gian Chrome còn chạy, trình nghe chuông báo được gọi trong khoảng tập hợp.

Cập nhật quyền cho ứng dụng

Trong tệp manifest.json, hãy yêu cầu quyền "alarms":

"permissions": ["storage", "alarms"],

Cập nhật tập lệnh nền

Trong background.js, hãy thêm trình nghe onAlarm. Hiện tại, hàm callback sẽ chỉ ghi nhật ký thông báo cho Bảng điều khiển mỗi khi có mục việc cần làm:

chrome.app.runtime.onLaunched.addListener(function() {
  chrome.app.window.create('index.html', {
    id: 'main',
    bounds: { width: 620, height: 500 }
  });
});
chrome.alarms.onAlarm.addListener(function( alarm ) {
  console.log("Got an alarm!", alarm);
});

Cập nhật chế độ xem HTML

Trong index.html, hãy thêm nút Kích hoạt chuông báo:

<footer id="info">
  <button id="toggleAlarm">Activate alarm</button>
  ...
</footer>

Bây giờ, bạn cần viết trình xử lý sự kiện JavaScript cho nút mới này. Hãy nhớ lại trong Bước 2 rằng một trong những trường hợp không tuân thủ CSP thường gặp nhất là do JavaScript cùng dòng gây ra. Trong index.html, hãy thêm đoạn mã này để nhập tệp alarms.js mới mà bạn sẽ tạo trong bước sau:

  </footer>
  ...
  <script src="js/app.js"></script>
  <script src="js/alarms.js"></script>
</body>

Tạo tập lệnh báo thức

Tạo tệp mới trong thư mục js có tên alarms.js.

Sử dụng mã dưới đây để thêm checkAlarm(), createAlarm(), cancelAlarm()toggleAlarm() cùng với trình xử lý sự kiện nhấp chuột để bật/tắt báo thức khi nút Kích hoạt báo thức được đã nhấp vào.

(function () {
  'use strict';
   var alarmName = 'remindme';
   function checkAlarm(callback) {
     chrome.alarms.getAll(function(alarms) {
       var hasAlarm = alarms.some(function(a) {
         return a.name == alarmName;
       });
       var newLabel;
       if (hasAlarm) {
         newLabel = 'Cancel alarm';
       } else {
         newLabel = 'Activate alarm';
       }
       document.getElementById('toggleAlarm').innerText = newLabel;
       if (callback) callback(hasAlarm);
     })
   }
   function createAlarm() {
     chrome.alarms.create(alarmName, {
       delayInMinutes: 0.1, periodInMinutes: 0.1});
   }
   function cancelAlarm() {
     chrome.alarms.clear(alarmName);
   }
   function doToggleAlarm() {
     checkAlarm( function(hasAlarm) {
       if (hasAlarm) {
         cancelAlarm();
       } else {
         createAlarm();
       }
       checkAlarm();
     });
   }
  $$('#toggleAlarm').addEventListener('click', doToggleAlarm);
  checkAlarm();
})();

Tải lại ứng dụng và dành chút thời gian để kích hoạt (và hủy kích hoạt) báo thức.

Kiểm tra thông báo về trang nền

Bất cứ khi nào kích hoạt chuông báo, bạn sẽ thấy thông điệp nhật ký được in trong Bảng điều khiển mỗi khi báo thức "reo":

Đang in thông báo cảnh báo tới Bảng điều khiển

Bạn sẽ nhận thấy rằng:

  • Ngay cả khi bạn đóng cửa sổ ứng dụng Việc cần làm, chuông báo vẫn sẽ kêu.
  • Trên các nền tảng không phải ChromeOS, nếu bạn đóng hoàn toàn tất cả phiên bản trình duyệt Chrome, chuông báo sẽ không kích hoạt.

Hãy cùng tìm hiểu một số phần trong alarms.js sử dụng từng phương thức chrome.alarms.

Tạo báo thức

Trong createAlarm(), hãy sử dụng API chrome.alarms.create() để tạo chuông báo khi Kích hoạt báo thức đã bật.

chrome.alarms.create(alarmName, {delayInMinutes: 0.1, periodInMinutes: 0.1});

Tham số đầu tiên là một chuỗi không bắt buộc xác định tên riêng biệt cho chuông báo của bạn, ví dụ: remindme. (Lưu ý: Bạn cần đặt tên báo thức để huỷ báo thức theo tên.)

Tham số thứ hai là một đối tượng alarmInfo. Các thuộc tính hợp lệ cho alarmInfo bao gồm when hoặc delayInMinutesperiodInMinutes. Để giảm tải cho máy của người dùng, Chrome giới hạn báo thức ở mức mỗi phút một lần. Chúng tôi đang sử dụng các giá trị nhỏ (0,1 của một phút) ở đây để minh hoạ chỉ có mục đích riêng.

Xoá chuông báo

Trong cancelAlarm(), hãy dùng API chrome.alarms.clear() để huỷ chuông báo khi Huỷ báo thức đã bật.

chrome.alarms.clear(alarmName);

Thông số đầu tiên phải là chuỗi nhận dạng mà bạn đã dùng làm tên chuông báo trong chrome.alarms.create().

Tham số thứ hai (không bắt buộc) là một hàm callback sẽ có định dạng:

function(boolean wasCleared) {...};

Nhận chuông báo

Trong checkAlarm(), hãy dùng API chrome.alarms.getAll() để lấy một mảng gồm tất cả chuông báo đã tạo để cập nhật trạng thái giao diện người dùng của nút bật tắt.

getAll() chấp nhận một hàm callback truyền một mảng các đối tượng Alarm. Để xem nội dung Alarm, bạn có thể kiểm tra các chuông báo đang chạy trong Bảng điều khiển công cụ cho nhà phát triển như sau:

chrome.alarms.getAll(function(alarms) {
  console.log(alarms);
  console.log(alarms[0]);
});

Thao tác này sẽ xuất một đối tượng như {name: "remindme", periodInMinutes: 0.1, scheduledTime: 1397587981166.858} như bên dưới:

Dùng getAll() để kiểm tra các chuông báo đang chạy.

Chuẩn bị sẵn sàng cho phần tiếp theo

Giờ đây, các chuông báo đã được triển khai để thăm dò ứng dụng đều đặn, hãy sử dụng thông tin này làm cơ sở để thêm thông báo bằng hình ảnh.

Thêm thông báo

Hãy thay đổi thông báo chuông báo thành nội dung mà người dùng có thể dễ dàng nhận thấy. Sử dụng chrome.notifications để hiển thị một thông báo trên màn hình như thông báo dưới đây:

Thông báo của ứng dụng Việc cần làm

Khi người dùng nhấp vào thông báo, cửa sổ ứng dụng Công việc sẽ xuất hiện.

Cập nhật quyền cho ứng dụng

Trong tệp manifest.json, hãy yêu cầu quyền "notifications":

"permissions": ["storage", "alarms", "notifications"],

Cập nhật tập lệnh nền

Trong background.js, hãy tái cấu trúc lệnh gọi lại chrome.app.window.create() thành một phương thức độc lập để bạn có thể tái sử dụng:

chrome.app.runtime.onLaunched.addListener(function() {
function launch() {
  chrome.app.window.create('index.html', {
    id: 'main',
    bounds: { width: 620, height: 500 }
  });
}
});
chrome.app.runtime.onLaunched.addListener(launch);
...

Cập nhật trình nghe chuông báo

Ở đầu background.js, hãy thêm một biến cho tên cơ sở dữ liệu được dùng trong chuông báo trình nghe:

var dbName = 'todos-vanillajs';

Giá trị của dbName giống với tên cơ sở dữ liệu được đặt trong dòng 17 của js/app.js:

var todo = new Todo('todos-vanillajs');

Tạo một thông báo

Thay vì chỉ ghi nhật ký chuông báo mới vào Console, hãy cập nhật trình nghe onAlarm để được lưu trữ qua chrome.storage.local.get() và gọi một phương thức showNotification():

chrome.alarms.onAlarm.addListener(function( alarm ) {
  console.log("Got an alarm!", alarm);
  chrome.storage.local.get(dbName, showNotification);
});

Thêm phương thức showNotification() này vào background.js:

function launch(){
  ...
}

function showNotification(storedData) {
  var openTodos = 0;
  if ( storedData[dbName].todos ) {
    storedData[dbName].todos.forEach(function(todo) {
      if ( !todo.completed ) {
        openTodos++;
      }
    });
  }
  if (openTodos>0) {
    // Now create the notification
    chrome.notifications.create('reminder', {
        type: 'basic',
        iconUrl: 'icon_128.png',
        title: 'Don\'t forget!',
        message: 'You have '+openTodos+' things to do. Wake up, dude!'
     }, function(notificationId) {});
  }
}

chrome.app.runtime.onLaunched.addListener(launch);
...

showNotification() sẽ kiểm tra những mục việc cần làm đang xử lý (chưa hoàn thành). Nếu có ít nhất một doanh nghiệp đang mở cửa mục việc cần làm, hãy tạo cửa sổ thông báo bật lên qua chrome.notifications.create().

Tham số đầu tiên là tên thông báo nhận dạng duy nhất. Bạn phải đặt id theo thứ tự để xóa hoặc xử lý các hoạt động tương tác với thông báo cụ thể đó. Nếu mã nhận dạng khớp với mã nhận dạng hiện tại thì trước tiên, create() sẽ xoá thông báo đó trước khi đưa ra thông báo mới.

Tham số thứ hai là một đối tượng NotificationOptions. Có nhiều tuỳ chọn để kết xuất cửa sổ thông báo bật lên. Ở đây, chúng tôi sử dụng thuộc tính "cơ bản" kèm theo biểu tượng, tiêu đề và thông báo. Các loại thông báo khác bao gồm hình ảnh, danh sách và chỉ báo tiến trình. Bạn có thể quay lại trang này khi đã hoàn tất Bước 3 và thử nghiệm với các tính năng thông báo khác.

Thông số thứ ba (không bắt buộc) là phương thức gọi lại sẽ nhận định dạng:

function(string notificationId) {...};

Xử lý các hoạt động tương tác với thông báo

Mở ứng dụng Việc cần làm khi người dùng nhấp vào thông báo. Ở cuối tệp background.js, hãy tạo một Trình xử lý sự kiện chrome.notifications.onClicked:

chrome.notifications.onClicked.addListener(function() {
  launch();
});

Lệnh gọi lại của trình xử lý sự kiện chỉ gọi phương thức launch(). chrome.app.window.create() sẽ tạo một cửa sổ Ứng dụng Chrome mới nếu chưa có cửa sổ hoặc tập trung vào cửa sổ hiện tại mở cửa sổ có mã cửa sổ là main.

Chạy ứng dụng Việc cần làm đã hoàn thành

Bạn đã hoàn tất Bước 3! Tải lại ứng dụng Việc cần làm ngay nhờ lời nhắc.

Kiểm tra các hành vi sau đây có hoạt động như mong đợi không:

  • Nếu bạn không có mục việc cần làm chưa hoàn thành nào, thì sẽ không có thông báo bật lên.
  • Nếu bạn nhấp vào thông báo khi ứng dụng bị đóng, ứng dụng Công việc sẽ mở ra hoặc đi vào tập trung.

Khắc phục sự cố

Tệp background.js cuối cùng sẽ có dạng như thế này. Nếu thông báo không xuất hiện, xác nhận rằng Chrome của bạn là phiên bản 28 trở lên. Nếu thông báo vẫn không xuất hiện, hãy kiểm tra các thông báo lỗi trong Bảng điều khiển Công cụ cho nhà phát triển trên cả cửa sổ chính (nhấp chuột phải > Kiểm tra phần tử) và trang nền (nhấp chuột phải > Kiểm tra trang nền).

Thông tin khác

Để biết thêm thông tin chi tiết về một số API được giới thiệu trong bước này, hãy tham khảo:

Bạn đã sẵn sàng chuyển sang bước tiếp theo? Chuyển tới Bước 4 – Mở đường liên kết ngoài bằng chế độ xem web »