|
||
|
|
|
|||||||
| Tasker Para hablar de todo lo relacionado con la aplicación tasker |
![]() |
|
|
Herramientas |
|
#1
|
||||
|
||||
|
Usos del array local interno %caller
En más de una ocasión he usado la variable interna %caller1 para dar respuesta/solución a alguna consulta. Por ejemplo en estos temas...
http://www.htcmania.com/showthread.p...7#post18925847 http://www.htcmania.com/showthread.p...4#post20043474 http://www.htcmania.com/showthread.p...1#post22171901 ... y en el más reciente ... http://www.htcmania.com/showthread.p...1#post23624241 Viendo que esa variable %caller1 tiene una gran utilidad Caravantes me invitó a explicar su uso con un poco más de detalle ... esto es lo que me ha salido. ![]() Tipos de variables La documentación de Tasker organiza las variables dependiendo de su ámbito o de quién les asigna su valor.
Los detalles se pueden consultar aquí: http://tasker.dinglisch.net/userguide/en/variables.html Combinando esas cuatro posibilidades obtenemos los tipos de variables más habituales: Las variables “globales internas”. Son las que usamos para conocer el nivel de batería (%BATT), la fecha (%DATE) o las coordenadas GPS (%LOC). Tasker tiene un amplio catálogo de estas variables. Las variables “globales de usuario”. Son las que usamos en nuestros desarrollos si queremos conservar su valor por tiempo indefinido o si lo queremos consultar/modificar desde varias tareas/escenas. Las variables “locales de usuario”. Son las que usamos en nuestros desarrollos si queremos que su ámbito se limite a la tarea/escena en la que son creadas. Existe un tipo más, el de las variables “locales internas”, que nos proporcionan información extra sobre la tarea en la que son consultadas.
Es precisamente sobre esta última variable, el array %caller, sobre lo que trata este pequeño tutorial. El array %caller El array %caller permite trazar cómo ha llegado a iniciarse la tarea/escena actual. Supongamos que tenemos un perfil “P” que al activarse lanza la tarea “T1” que muestra la escena “E” que tiene un botón “B” que lanza la tarea “T2”. Si desde la tarea “T2” consultamos cada elemento del array %caller podremos seguir toda la secuencia:
El formato de cada elemento del array %caller no es exactamente el que he puesto en el ejemplo anterior, realmente es así: callertype(=callername(:subcallername)) La parte callertype aparece siempre y las otras dos (callername y subcallername) dependiendo de las circunstancias. Los posibles callertype se detallan a continuación: profile Si la tarea se inicia desde un perfil en callername pondrá enter o exit dependiendo de si el perfil se ha activado o desactivado. En subcallername pondrá el nombre del perfil y si no tiene nombre pondrá anon.scene Si la tarea se inicia desde una escena en callername pondrá el nombre de la escena. Si el evento que lanza la tarea se genera desde un elemento en subcallername pondrá el nombre del elemento. Si el evento se genera al pulsar sobre una opción de la barra de acciones en subcallername pondrá la etiqueta de la acción, si la tiene asignada. Para eventos globales de la escena en subcallername pondrá el tipo de evento.ui Si la tarea se inicia al pulsar el botón PLAY en el editor de tareas.launch Si la tarea es exportada como aplicación y se inicia desde el lanzador de aplicaciones del sistema.notification Si la tarea se inicia desde un botón de acción de una notificación.external Si la tarea se inicia desde una aplicación externa. Por ejemplo; un widget de Zoom.task Si la tarea se inicia desde otra tarea usando la acción “Realizar tarea” en subcallername pondrá el nombre de esa tarea y si no tiene nombre pondrá anon. ¿Qué utilidad tiene todo esto? La mejor que yo he encontrado es la de poder usar una única tarea para la entrada y la salida de un perfil. Esto es de especial utilidad si una de las tareas tiene que interrumpir la ejecución de la otra. Supongamos que quieres montar un sistema que encienda el WiFi al iniciar ciertas aplicaciones y que lo apague al cerrarlas, pero para evitar apagados/encendidos innecesarios se te ha ocurrido que puedes esperar unos segundos antes de apagar el WiFi por si abres a continuación otra de las aplicaciones controladas por este sistema. La forma más simple de hacerlo tendría este aspecto: Código:
Perfil: EstadoApp (11) Aplicación: YouTube o Google Entrada: WiFiOn (22) A1: Flash [ Texto:%priority | %caller1 Largo:Encendido ] A2: Detener [ Con error:Apagado Tarea:WiFiOff ] A3: WiFi [ Establecer:Encendido ] Salida: WiFiOff (33) A1: Flash [ Texto:%priority | %caller1 Largo:Encendido ] A2: Esperar [ MS:0 Segundos:10 Minutos:0 Horas:0 Días:0 ] A3: WiFi [ Establecer:Apagado ] ![]() Pues que la acción “Detener” no se ejecuta a tiempo porque la tarea WiFiOn no se inicia hasta que termina la tarea WiFiOff. Es una cuestión de prioridades (%priority) y de la forma en la que funciona Tasker. Para entender esto tienes que tener en cuenta estas cosas:
Los detalles se pueden consultar aquí: http://tasker.dinglisch.net/userguide/en/tasks.html Con eso en mente no es difícil ver que estás intentando detener una tarea con prioridad 1006 desde otra tarea, que por tener prioridad 5, probablemente no se ejecutará hasta que termine la que pretendes detener, porque casualmente está en una espera. Una forma de solucionar esta situación, para mi gusto la más elegante, es usar el “Manejo de incompatibilidades” para permitir que la segunda ejecución de una tarea interrumpa a la primera, y usar el array %caller para saber si una tarea se está ejecutando como consecuencia de la entrada o de la salida de un perfil. El sistema del ejemplo anterior quedaría así: Código:
Perfil: EstadoApp (11) Aplicación: YouTube o Google Entrada y Salida: WiFiOnOff (44) Abortar Tarea Existente A1: Flash [ Texto:%priority | %caller1 Largo:Encendido ] A2: Si (if) [ %caller1 ~ *enter* ] A3: WiFi [ Establecer:Encendido ] A4: Else A5: Esperar [ MS:0 Segundos:10 Minutos:0 Horas:0 Días:0 ] A6: WiFi [ Establecer:Apagado ] A7: Fin si (End if) ¿Y sólo vale para esto? Ni mucho menos. Sólo tienes que dar un vistazo a los temas que he puesto al principio. Otro posible escenario en el que hacer uso del array %caller podría estar formado por una escena con varios botones que lanzasen la misma tarea. Consultando el valor de %caller1 esa tarea podía saber desde qué botón de la escena ha sido lanzada y actuar en consecuencia. Hasta la próxima
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) Última edición por WillyWeb Día 08/07/16 a las 19:21:12. |
| Los siguientes 6 usuarios han agradecido a WillyWeb su comentario: | ||
|
|
|
#2
|
||||
|
||||
|
Qué máquina! En el post más reciente que comentas no veo la variable que nos ocupa. De todas formas, me quito el sombrero Mr. WillyWeb!
![]() Edito: sí que sale... |
| Los siguientes 2 usuarios han agradecido a Mitrhandir su comentario: | ||
|
#3
|
||||
|
||||
|
Genial, Willy, muchísimas gracias
![]() Es una explicación completísima con todas las ramificaciones del asunto. Por ejemplo, aunque yo conocía la variable %caller, no me había parado a pensar que pertenece al grupo de variables "locales internas"; bueno, para ser más concreto, ni sabía que existía ese tipo de variables. Creo que estaría bien añadir algún ejemplo muy concreto y fácil de entender, como los siguientes: Cuando la tarea es ejecutada como tarea de ENTRADA, el contenido de %caller1 es
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
|
#4
|
||||
|
||||
|
Ya he puesto los ejemplos ... ¿mejor así?
__________________
Miembro del equipo que promueve el [Subforo de Tasker]
Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino) |
| Los siguientes 2 usuarios han agradecido a WillyWeb su comentario: | ||
|
#5
|
||||
|
||||
|
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
![]() |
Estás aquí
|
||||||
|
||||||
| Herramientas | |