PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → [WM17] Service Android
[WM17] Service Android
Débuté par olivier barreau, 20 jan. 2012 23:15 - 20 réponses
Posté le 20 janvier 2012 - 23:15
Bonjour,

Je cherche comment lancer une routine en tache de fond sans interface, à l'identique d'un service windows.
Savez-vous si cela est possible en devellopement Android à partir de windev Mobile v17 ?

Merci d'avance !
Olivier
Posté le 09 août 2012 - 11:16
Bonjour,
Je cherche a faire la meme chose, avez vous trouver une solution ?
Merci d'avance.
Yoann
Posté le 09 août 2012 - 13:31
pour cela il faudrait déclarer un broacast receiver (equivalent de callback).
Je ne vois pas comment déclarer une classe comme cela dans windev.

<code>
public class MyIntentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
...
}
}
</code>

J'ai vu que l'on pouvez integrer une blibliothèque .jar à la création de l'application, peut etre une piste.
Posté le 13 août 2013 - 14:53
Bjr,
est ce que vous avez trouvé une solution ?
car j'ai le même souci il faut que je développe un Service qui tourne en tâche de fond

merci
Membre enregistré
92 messages
Popularité : +2 (2 votes)
Posté le 13 août 2013 - 16:50
oui

il faut faire un service :)

dans un library java exterieur a windev
Membre enregistré
92 messages
Popularité : +2 (2 votes)
Posté le 13 août 2013 - 16:52
final String ACTION_NAME = "com.masociete.AlarmReciever";
Intent intent = new Intent(ACTION_NAME);

PendingIntent pendingIntent = PendingIntent.getBroadcast(getContexteApplication(), 0,intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) getContexteApplication().getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime() ,((60*60) * 1000), pendingIntent); // 60 minutes

AlarmReciever a = new AlarmReciever();
getActiviteEnCours().registerReceiver(a , new IntentFilter(ACTION_NAME));
Message modifié, 13 août 2013 - 17:03
Membre enregistré
92 messages
Popularité : +2 (2 votes)
Posté le 13 août 2013 - 17:03
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;


public class AlarmReciever extends BroadcastReceiver
{

@Override
public void onReceive(Context arg0, Intent arg1) {

LocalBroadcastManager mLocalBroadcastManager = LocalBroadcastManager.getInstance(arg0);
Intent broadcastIntent = new Intent("com.masoiete.ff.PUSHINN");
broadcastIntent.putExtra("message", "");
if (!mLocalBroadcastManager.sendBroadcast(broadcastIntent)){

}

}

}
Posté le 17 août 2013 - 17:13
Bonjour floman321,

Peux-tu donner un peu plus d'explications sur ton code et sur la façon de le mettre en oeuvre?

Je suis en train de créer une petite application qui devrait tourner en tâche de fond pour pouvoir lancer des alarmes à des dates précises, et là je coince...

Merci !
Zebx
Posté le 17 août 2013 - 17:14
Bonjour floman321,

Peux-tu donner un peu plus d'explications sur ton code et sur la façon de le mettre en oeuvre?

Je suis en train de créer une petite application qui devrait tourner en tâche de fond pour pouvoir lancer des alarmes à des dates précises, et là je coince...

Merci !
Zebx
Membre enregistré
92 messages
Popularité : +2 (2 votes)
Posté le 17 août 2013 - 22:13
Une procédure global java dans windev qui decrit l'alarme, on précise de reveille le cpu.

final String ACTION_NAME = "com.masociete.AlarmReciever";
Intent intent = new Intent(ACTION_NAME);

PendingIntent pendingIntent = PendingIntent.getBroadcast(getContexteApplication(), 0,intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) getContexteApplication().getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime() ,((60*60) * 1000), pendingIntent); // 60 minutes

AlarmReciever a = new AlarmReciever();
getActiviteEnCours().registerReceiver(a , new IntentFilter(ACTION_NAME));

Jusqu'a la pas de probleme ?
Posté le 17 août 2013 - 23:22
Disons que jusque là, je vois où et comment placer ton code, sans nécessairement en comprendre les rouages ^^

J'ai donc créé une nouvelle procédure globale, j'ai switché le codage en mode java et j'y ai collé ton code.

Question :
com.masociete.AlarmReciever, je dois le remplacer par le nom de mon propre projet?

J'attends tes prochaines instructions car là ça ne me permet pas de créer l'apk sans erreur...
Posté le 19 août 2013 - 04:26
J'ai un peu avancé...

Il me manquait les imports dans la procédure java, donc maintenant je peux à nouveau générer l'apk.

J'ai également créé et ajouté le .jar avec le reste de ton code.

Il reste toujours que sur ces 2 points, je ne suis pas sûr de ce que je dois mettre :
com.masociete.AlarmReciever
com.masoiete.ff.PUSHINN

Mais je ne comprends toujours pas bien comment c'est censé fonctionner.

A quel moment la procédure java est-elle exécutée? Faut-il déclarer ce service quelque-part pour le démarrer? Comment sera déclenché et où devrai-je placer le code WL qui gère mes alarmes?

Ca fait beaucoup de questions je sais... donc si tu préfères y aller étape par étape je suis preneur ! :)
Membre enregistré
92 messages
Popularité : +2 (2 votes)
Posté le 19 août 2013 - 08:18
le + facile pour toi et que tu peux le faire directement dans windev

import android.content.*;
import android.app.PendingIntent;
import android.app.AlarmManager;
import android.os.PowerManager;
import android.os.SystemClock;

public static void RecoitAlarm() {

final String ACTION_NAME = "com.societe.logiciel.AlarmReciever";
Intent intent = new Intent(ACTION_NAME);

PendingIntent pendingIntent = PendingIntent.getBroadcast(getContexteApplication(), 0,intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) getContexteApplication().getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime() ,((60*60) * 1000), pendingIntent); // 60 minutes

getActiviteEnCours().registerReceiver(mPushInfoReceiver , new IntentFilter(ACTION_NAME));
}

static BroadcastReceiver mPushInfoReceiver = new BroadcastReceiver(){
public void onReceive(Context arg0, Intent intent) {

String msg = "";
try{

// Réveille le cpu
PowerManager pm = (PowerManager) getContexteApplication().getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl=pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "tag_pour_log");
wl.acquire();

appelProcedureWL("CheckEvenement");

// Met en veille le cpu
wl.release();

}catch(Exception e){
msg = "";
appelProcedureWL("ErreurAffiche",e.getMessage());
}
}
};

Ca marche comme un timersys de windev.
Je peux pas faire plus facile :)

onReceive va etre déclenché a chaque tick de l'alarme

Regarde sur cette page pour plus d'infos http://developer.android.com/reference/android/app/AlarmManager.html
Message modifié, 19 août 2013 - 08:23
Membre enregistré
92 messages
Popularité : +2 (2 votes)
Posté le 19 août 2013 - 08:20
le + facile pour toi et que tu peux le faire directement dans windev

import android.content.*;
import android.app.PendingIntent;
import android.app.AlarmManager;
import android.os.PowerManager;
import android.os.SystemClock;

public static void RecoitAlarm() {

final String ACTION_NAME = "com.societe.logiciel.AlarmReciever";
Intent intent = new Intent(ACTION_NAME);

PendingIntent pendingIntent = PendingIntent.getBroadcast(getContexteApplication(), 0,intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) getContexteApplication().getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, SystemClock.elapsedRealtime() ,((60*60) * 1000), pendingIntent); // 60 minutes

getActiviteEnCours().registerReceiver(mPushInfoReceiver , new IntentFilter(ACTION_NAME));
}

static BroadcastReceiver mPushInfoReceiver = new BroadcastReceiver(){
public void onReceive(Context arg0, Intent intent) {

String msg = "";
try{

// Réveille le cpu
PowerManager pm = (PowerManager) getContexteApplication().getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl=pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "tag_pour_log");
wl.acquire();

appelProcedureWL("CheckEvenement");

// Met en veille le cpu
wl.release();

}catch(Exception e){
msg = "";
appelProcedureWL("ErreurAffiche",e.getMessage());
}
}
};

Ca marche comme un timersys de windev.
Je peux pas faire plus facile :)

onReceive va etre déclenché a chaque tick de l'alarme

Regarde sur cette page pour plus d'infos http://developer.android.com/reference/android/app/AlarmManager.html

Deplus, il faut executer la procedure "RecoitAlarm" dans l'init du projet
Message modifié, 19 août 2013 - 08:25
Posté le 19 août 2013 - 23:21
Merci ! Ca semble plus facile effectivement :)

Bon, ceci dit, j'ai pas encore pu tester en live car je suis face à un problème...

Ca me renvoit une erreur comme quoi je n'ai pas la permission WAKE_LOCK.

A priori je devrais ajouter cette permission dans le manifest.xml mais sous windev17 ça ne semble pas possible :s

J'ai essayé de modifier le manifest avec apktool mais sans succès.

Une idée géniale pour contourner le problème? Genre une fonction bidon dans windev qui débloquerait cette permission ^^ Ou que sais-je encore...
Posté le 20 août 2013 - 00:27
Bon j'ai trouvé une astuce pour contourner mon problème de manifest, la manip est un peu pénible mais ça marche...

Du coup je suis en test live maintenant :)

En revanche au niveau du code, si je comprends bien, c'est censé lancer la procédure CheckEvenement toutes les 60min.

Pour les tests, je suis passé à 10s et j'ai mis une simple popup info dans CheckEvenement.

Dès que l'application se lance la popup s'ouvre, donc le code va bien jusqu'au bout.

Mais ensuite, ça boucle pas toutes les 10s... que l'application soit ouverte ou fermée, appareil en veille ou non.

Quelque-chose m'échappe donc... une idée?
Posté le 22 août 2013 - 01:16
Hello,

Me rev'là et le code fonctionne !

J'ai dû modifier le getActiviteEnCours sur l'enregistrement du receiver par getContexteApplication, et là ça boucle enfin nickel :) Merci !

Suite des opérations maintenant car l'objectif n'est pas encore atteint ^^

Lorsque j'utilise le bouton back, mon application se ferme et l'alarme aussi du coup... or comme le but est que ça tourne comme un service, bah c'est pas un bon plan.

Tu aurais une astuce pour éviter cette fermeture totale non désirée?

Me faudra ensuite trouver comment lancer le process automatqiuement au boot, mais je me suis pas encore penché sur la question... donc une chose à la fois ;)
Membre enregistré
92 messages
Popularité : +2 (2 votes)
Posté le 22 août 2013 - 08:25
solution a essayer : passer par un fichier jar (voir premier code)
Posté le 22 août 2013 - 18:53
Mmm, ça fait pareil, la boucle s'arrête...

Une autre piste en tête?
Membre enregistré
92 messages
Popularité : +2 (2 votes)
Posté le 23 août 2013 - 08:18
C'est vrai que je n'ai que cette application en premier plan.
Pour faire ce que tu veux faire : il faut créer un service en java dans une jar et le déclarer dans ton manifest.
Message modifié, 23 août 2013 - 08:22
Posté le 04 septembre 2013 - 10:55
Salut floman321,

Je reviens un peu tardivement sur le sujet...

Juste pour dire que j'ai finalement choisi de coder ce projet totalement en java, sans passer par Windev. Ca devenait trop compliqué à mon goût d'intégrer ce que je voulais faire avec windev...

Mais en tout cas merci pour tes infos, ça m'a donné les premières pistes pour développer mon p'tit projet et là je commence doucement à en voir le bout :)

Zebx