PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV Mobile 2024 → [WM17] Service Android
[WM17] Service Android
Started by olivier barreau, Jan., 20 2012 11:15 PM - 20 replies
Posted on January, 20 2012 - 11:15 PM
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
Posted on August, 09 2012 - 11:16 AM
Bonjour,
Je cherche a faire la meme chose, avez vous trouver une solution ?
Merci d'avance.
Yoann
Posted on August, 09 2012 - 1:31 PM
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.
Posted on August, 13 2013 - 2:53 PM
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
Registered member
92 messages
Popularité : +2 (2 votes)
Posted on August, 13 2013 - 4:50 PM
oui

il faut faire un service :)

dans un library java exterieur a windev
Registered member
92 messages
Popularité : +2 (2 votes)
Posted on August, 13 2013 - 4:52 PM
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 modified, August, 13 2013 - 5:03 PM
Registered member
92 messages
Popularité : +2 (2 votes)
Posted on August, 13 2013 - 5:03 PM
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)){

}

}

}
Posted on August, 17 2013 - 5:13 PM
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
Posted on August, 17 2013 - 5:14 PM
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
Registered member
92 messages
Popularité : +2 (2 votes)
Posted on August, 17 2013 - 10:13 PM
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 ?
Posted on August, 17 2013 - 11:22 PM
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...
Posted on August, 19 2013 - 4:26 AM
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 ! :)
Registered member
92 messages
Popularité : +2 (2 votes)
Posted on August, 19 2013 - 8:18 AM
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 modified, August, 19 2013 - 8:23 AM
Registered member
92 messages
Popularité : +2 (2 votes)
Posted on August, 19 2013 - 8:20 AM
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 modified, August, 19 2013 - 8:25 AM
Posted on August, 19 2013 - 11:21 PM
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...
Posted on August, 20 2013 - 12:27 AM
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?
Posted on August, 22 2013 - 1:16 AM
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 ;)
Registered member
92 messages
Popularité : +2 (2 votes)
Posted on August, 22 2013 - 8:25 AM
solution a essayer : passer par un fichier jar (voir premier code)
Posted on August, 22 2013 - 6:53 PM
Mmm, ça fait pareil, la boucle s'arrête...

Une autre piste en tête?
Registered member
92 messages
Popularité : +2 (2 votes)
Posted on August, 23 2013 - 8:18 AM
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 modified, August, 23 2013 - 8:22 AM
Posted on September, 04 2013 - 10:55 AM
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