Как вибрировать каждые 15 минут в веб-приложении tizen в фоновом режиме?

#javascript #tizen #tizen-web-app #tizen-wearable-sdk #tizen-studio

Вопрос:

Я пытаюсь написать альтернативу «почувствуй часы» для tizen (веб-приложение tizen для носимых устройств tizen).

Я хочу, чтобы часы вибрировали :

  • один вибрирует, когда минута составляет :15
  • два вибрирует, когда минута в :30
  • 3 вибрирует, когда минута составляет :45

Я перепробовал множество методов, таких как «api сигнализации» и т. Д., Но рабочий метод просто работает. Я использую tizen.power.request(«CPU»,»CPU_AWAKE»); чтобы приложение работало в фоновом режиме, но часы показывают, что мое веб-приложение использует высокую зарядку аккумулятора.

было бы намного лучше, если бы приложение вибрировало без открытия в фоновом режиме.

вот мое дерево:

 │   .tproject
│   config.xml
│   icon.png
│   index.html
│   main.js
│   reicon.jpg
│   reicon_crop.jpg
│   VibrateWatch.wgt
│
├───.settings
│       .jsdtscope
│       org.eclipse.wst.css.core.prefs
│       org.eclipse.wst.jsdt.ui.superType.container
│       org.eclipse.wst.jsdt.ui.superType.name
│
├───.sign
│       .manifest.tmp
│       author-signature.xml
│       signature1.xml
│
├───css
│       style.css
│
└───js
        main.js
        worker.js
 

вот мой worker.js код :

 function timedCount() {
    postMessage(0);                     //send data   
    setTimeout("timedCount()",1000);    // set vibration interval (or use specific time)
}

timedCount();
 

вот мой main.js код :

 //786
var pause = 150;
var dot = 300;
var ldot = 900;
var vibratePattern;
var tout;
var lastmin = 61;
var currentTime, timeLeft;

function format2Digits(value){
    if(value < 10)
        return "0"   value;
    return value;
}

function capp() {
      var currApp = tizen.application.getCurrentApplication();
      currApp.hide();
}


function multiVibration(list) {
      tizen.application.launch("MWoMC5yuQf.VibrateWatch", onsuccess);
      console.log(onsuccess);
      function onsuccess() {
        console.log("Application launched successfully");
      }
      /* Vibrate SOS */
      
      setTimeout(function (){  navigator.vibrate(list);
        }, 1300);
      
      setTimeout("capp()",5000);
      
    }

window.onload = function () {
    var worker = new Worker("js/worker.js");
    worker.onmessage = secondly;
    
};

function secondly(){
    tizen.power.request("CPU","CPU_AWAKE");

    var date = tizen.time.getCurrentDateTime();
    var houres = date.getHours();
    var minutes = date.getMinutes();
    var seconds = date.getSeconds();
    console.log('Time:',houres,minutes,seconds)
    
    currentTime = document.querySelector("#currentTime");
    currentTime.innerHTML = format2Digits(houres)   ":"   format2Digits(minutes)   ":"   format2Digits(seconds);
    
    if ( ((0 <= seconds) amp;amp; (seconds <= 10)) amp;amp; (lastmin !== minutes) ){
      setTimeout(function (){
          
        switch (minutes) {
          case 15:
              tout = 700
              setTimeout(function (){ navigator.vibrate([ldot]); }, 200);
              vibratePattern = [dot];
              multiVibration(vibratePattern);
              break;
          case 30:
            tout = 700
            setTimeout(function (){ navigator.vibrate([ldot]); }, 200);
            vibratePattern = [dot, pause, dot];
            multiVibration(vibratePattern);
              break;
          case 45:
            tout = 700
            setTimeout(function (){ navigator.vibrate([ldot]); }, 200);
            vibratePattern = [dot, pause, dot, pause, dot, pause];
            multiVibration(vibratePattern);
              break;
        }
          
      }, 500);
      
      lastmin = minutes;
      console.log('LM',lastmin);
    
    }

}
 

если у вас есть какие-либо идеи , пожалуйста, сообщите мне. Спасибо 🙂

Ответ №1:

Есть несколько концепций, которые могут быть вам полезны.

  1. Фоновая поддержка приложения — вам не нужно поднимать пользовательский интерфейс каждый раз, когда устройству нужно вибрировать. Вы можете настроить свойства фоновой поддержки и категории фона, чтобы разрешить выполнять некоторые действия в фоновом режиме.

Тогда приложение может быть очень простым (я использовал секунды для упрощения кодирования), просто в main.js:

 function checkTime() {
  var sec = new Date().getSeconds();
  switch(sec) {
    case 0:
      /// navigator.vibrate([ldot]);  // EDIT: does not work in background support mode
      // you can use Feedback API instead (hardcoded version of 3 vibrations)
      // you can also experiment with other types of feedback events to find to most suitable
      setTimeout(function() {tizen.feedback.play("LOWBATT", "TYPE_VIBRATION")}, 0);
      setTimeout(function() {tizen.feedback.play("LOWBATT", "TYPE_VIBRATION")}, 300);
      setTimeout(function() {tizen.feedback.play("LOWBATT", "TYPE_VIBRATION")}, 900);
      break;
    case 15:
      /// etc.
}
//check every second
setInterval(checkTime, 1000);

 

Приложение в фоновом режиме также вызовет вибрацию устройства.

  1. Если вам нужно больше разделения между пользовательским интерфейсом и рабочим кодом, пожалуйста, ознакомьтесь с концепцией «приложение-служба«. Но, пожалуйста, обратите внимание, что приложение службы имеет ограниченный доступ к некоторым API (например, навигатору), поэтому вам необходимо использовать API MessagePort, чтобы сообщить приложению пользовательского интерфейса о вибрации. Какой-то псевдокод:

service.js:

 var port = tizen.messageport.requestRemoteMessagePort("znvYsIPC4D.WebUIServiceUI", "portService")

function checkTime() {
    var sec = new Date().getSeconds();
    var message;
    switch(sec) {
    case 15:
        message = [{key: "type", value: "vibrate15"}] 
        break;
    case 30:
        message = [{key: "type", value: "vibrate30"}]
        break;
    case 45:
        message = [{key: "type", value: "vibrate45"}]
        break;
    case 0:
        message = [{key: "type", value: "vibrate0"}]
        break;
    }
    message amp;amp; port.sendMessage(message);
}

module.exports.onStart = function() {
  console.log("onStart is called");
  setInterval(checkTime, 1000);
};
module.exports.onStop = function() {
  console.log("onStop is called");
};
 

main.js:

   var port = tizen.messageport.requestLocalMessagePort("portService");

  var listener = function(message) {
      var type = message[0].value;
      
      switch(type) {
      case "vibrate0":
          navigator.vibrate([ldot]);
          break;
      case "vibrate15":
          // etc.
      }
  }
  port.addMessagePortListener(listener);

  // run a service
  tizen.application.launch("znvYsIPC4D.Service", (s) => console.log("success"), (s) => console.log("error"))
 
  1. Наконец, если всего вышеперечисленного недостаточно, вы можете рассмотреть возможность использования собственного приложения службы, работающего с приложением веб-интерфейса, в качестве гибридного приложения для повышения производительности.

Кстати, прямой причиной высокого заряда батареи является линия:

 tizen.power.request("CPU","CPU_AWAKE");
 

пожалуйста, просто удалите его — конфигурация фоновой поддержки, вероятно, сделает то, что вы ожидали.

Комментарии:

1. Большое спасибо, я проверю коды и прокомментирую !

2. Извините, как я могу запустить приложение службы другим способом?

3. Большое спасибо. Я немного изменил ваш код, и теперь он работает. Могу ли я поддерживать работу службы, когда приложение закрыто из последних приложений?

4. Второй и первый методы не работают 🙁 . Я должен включить экран для вибрации. Что мне делать?

5. @Alirezadigi вы правы, похоже, что navigator.vibrate() не работает в фоновой поддержке… Я заменил его на tizen.API обратной связи фоновая поддержка, и он работает, даже если приложение перемещено в фоновый режим/экран выключен. Пожалуйста, проверьте мою модификацию в 1-м способе.