#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:
Есть несколько концепций, которые могут быть вам полезны.
- Фоновая поддержка приложения — вам не нужно поднимать пользовательский интерфейс каждый раз, когда устройству нужно вибрировать. Вы можете настроить свойства фоновой поддержки и категории фона, чтобы разрешить выполнять некоторые действия в фоновом режиме.
Тогда приложение может быть очень простым (я использовал секунды для упрощения кодирования), просто в 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);
Приложение в фоновом режиме также вызовет вибрацию устройства.
- Если вам нужно больше разделения между пользовательским интерфейсом и рабочим кодом, пожалуйста, ознакомьтесь с концепцией «приложение-служба«. Но, пожалуйста, обратите внимание, что приложение службы имеет ограниченный доступ к некоторым 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"))
- Наконец, если всего вышеперечисленного недостаточно, вы можете рассмотреть возможность использования собственного приложения службы, работающего с приложением веб-интерфейса, в качестве гибридного приложения для повышения производительности.
Кстати, прямой причиной высокого заряда батареи является линия:
tizen.power.request("CPU","CPU_AWAKE");
пожалуйста, просто удалите его — конфигурация фоновой поддержки, вероятно, сделает то, что вы ожидали.
Комментарии:
1. Большое спасибо, я проверю коды и прокомментирую !
2. Извините, как я могу запустить приложение службы другим способом?
3. Большое спасибо. Я немного изменил ваш код, и теперь он работает. Могу ли я поддерживать работу службы, когда приложение закрыто из последних приложений?
4. Второй и первый методы не работают 🙁 . Я должен включить экран для вибрации. Что мне делать?
5. @Alirezadigi вы правы, похоже, что navigator.vibrate() не работает в фоновой поддержке… Я заменил его на tizen.API обратной связи фоновая поддержка, и он работает, даже если приложение перемещено в фоновый режим/экран выключен. Пожалуйста, проверьте мою модификацию в 1-м способе.