Lancer une application en background

  • Réponses :10
centinno
  • Posts de Forum 8

9 sept. 2013 à 08:38:39 via site

Bonjour, je suis en train de développer une application qui permet d'enregistrer dans une base de donnée SQLite des SMS des qu'ils arrivent sur le telephone. J'utilise le broadcast receiver pour recuperer le message ensuite le composant activity pour inserer dans la base. Mais j'aimerai remplacer activity par service pour que l'application ne derange pas l'utilisateur. Est ce que quelqu'un veut m'aider. Voici mon code:
//MainActivity.java
[code]
public class MainActivity extends BroadcastReceiver {
private final String ACTION_RECEIVE_SMS = "android.provider.Telephony.SMS_RECEIVED";
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if(intent.getAction().equals(ACTION_RECEIVE_SMS)){
Bundle bundle = intent.getExtras();
if(bundle != null){
Object[] pdus = (Object[])bundle.get("pdus");
SmsMessage[] message = new SmsMessage[pdus.length];
for (int i=0;i<pdus.length;i++){
message[i]=SmsMessage.createFromPdu((byte[])pdus[i]);
}
if(message.length > -1){
String messageBody = message[0].getMessageBody();
String phoneNumber = message[0].getDisplayOriginatingAddress();

Toast.makeText(context,"Expediteur - numero :"+phoneNumber+" Sms : "+messageBody, Toast.LENGTH_SHORT).show();
Intent SecondeItent = new Intent(context, SmsActivity.class);
SecondeItent.putExtra("phoneNumber",phoneNumber);
SecondeItent.putExtra("messageBody",messageBody);
SecondeItent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(SecondeItent);
}
}
}
}
}
[/code]
//SmsActivity.java
1public class SmsActivity extends Activity{
2 String num;
3 String msg;
4 @Override
5 protected void onCreate(Bundle savedInstanceState) {
6 super.onCreate(savedInstanceState);
7 //setContentView(R.layout.activity_main);
8 Bundle bundle = getIntent().getExtras();
9 num = bundle.getString("phoneNumber");
10 msg = bundle.getString("messageBody");
11
12 InsertDonnee();
13
14 }
15 public void InsertDonnee() {
16 SmsDao smsdao = new SmsDao(this);
17 Sms sms = new Sms(num,msg);
18 smsdao.open();
19 smsdao.insertSms(sms);
20 Sms smsFromBdd = smsdao.getSmsWithNum(sms.getNum());
21 if(smsFromBdd != null){
22 Toast.makeText(this, smsFromBdd.toString(), Toast.LENGTH_LONG).show();
23 }
24 smsdao.close();
25 }
26
27}
Autres fichiers: AndroidManifest.xml, MyBaseSQLite.java, SmsDao.java et Sms.java
merci

— Modifié le 9 sept. 2013 à 08:44:38

Répondre
Compte désactivé
  • Posts de Forum 1 560

9 sept. 2013 à 08:53:57 via app

http://developer.android.com/guide/components/services.html

Pour créer un service, vous devez créer une sous-classe de service (ou un de ses sous-classes existantes). Dans votre application, vous devez remplacer certaines méthodes de rappel qui gèrent les aspects clés du cycle de vie du service et de fournir un mécanisme permettant de lier des composants au service, le cas échéant. Les méthodes de rappel plus importantes que vous devez redéfinir sont:

onStartCommand ()
Le système appelle cette méthode quand un autre composant, comme une activité, les demandes que le service soit démarré, en appelant startService () . Une fois cette méthode s'exécute, le service est démarré et peut fonctionner en tâche de fond indéfiniment. Si vous implémentez ce fait, il est de votre responsabilité d'arrêter le service lorsque son travail est fait, en appelant stopSelf () ou stopService () . (Si vous ne souhaitez offrir liaison, vous n'avez pas besoin de mettre en œuvre cette méthode.)
onBind ()
Le système appelle cette méthode quand un autre composant veut se lier avec le service (par exemple pour effectuer RPC), en appelant bindService () . Dans votre implémentation de cette méthode, vous devez fournir une interface que les clients utilisent pour communiquer avec le service, en renvoyant un IBinder . Vous devez toujours mettre en œuvre cette méthode, mais si vous ne voulez pas permettre la liaison, alors vous devriez retourner null.
oncreate ()
Le système appelle cette méthode lorsque le service est créé, pour effectuer les procédures de configuration ponctuels (avant d'appeler soit onStartCommand () ou onBind () ). Si le service est déjà en cours d'exécution, cette méthode n'est pas appelée.
OnDestroy ()
Le système appelle cette méthode lorsque le service n'est plus utilisé et est détruit. Votre service doit mettre en œuvre ce à nettoyer toutes les ressources tels que les fils, les auditeurs inscrits, récepteurs, etc Ceci est le dernier appel le service reçoit.
Si un composant démarre le service en appelant startService () (qui se traduit par un appel à onStartCommand () ), le service reste actif jusqu'à ce qu'il s'arrête avec lui-même stopSelf () ou un autre composant s'arrête en appelant stopService () .

Si un composant appelle bindService () pour créer le service (et onStartCommand () est non appelé), le service ne fonctionne que tant que le composant est lié à elle. Une fois que le service n'est pas lié à tous les clients, le système détruit.

Le système Android forcera-arrêter un service uniquement lorsque la mémoire est faible et il doit récupérer les ressources du système pour l'activité qui a le focus de l'utilisateur. Si le service est lié à une activité qui a le focus de l'utilisateur, alors il est moins susceptible d'être tué, et si le service est déclaré à courir au premier plan (voir plus loin), alors il ne sera presque jamais être tué. Sinon, si le service a été démarré et est de longue durée, alors le système va réduire sa position dans la liste des tâches de fond au fil du temps et le service va devenir très sensibles à la mort, si votre service est démarré, vous devez le concevoir à gérer redémarre correctement par le système. Si le système tue votre service, il redémarre dès que les ressources seront disponibles à nouveau (mais cela dépend aussi de la valeur que vous revenez de onStartCommand () , comme on le verra plus tard). Pour plus d'informations sur le moment où le système peut détruire un service, consultez les processus et les Threading documents.

Dans les sections suivantes, vous verrez comment vous pouvez créer chaque type de service et la façon de l'utiliser à partir d'autres composants de l'application.

Déclarer un service dans le manifeste
Comme les activités (et d'autres composants), vous devez déclarer tous les services dans le fichier manifeste de l'application.

Pour déclarer votre service, ajouter un <service> élément comme un enfant de la <application> élément. Par exemple:

<Manifeste ... >
...
<demande ... >
<Service android: nom = ". ExampleService" />
...
</ application>
</ manifest>
Il ya d'autres attributs que vous pouvez inclure dans le <service> élément pour définir des propriétés telles que les autorisations requises pour démarrer le service et le processus dans lequel le service doit s'exécuter. Le android: nom attribut est-il seulement nécessaire spécifie le nom de la classe du service. Une fois que vous publiez votre application, vous ne devez pas modifier ce nom, parce que si vous le faites, vous risquez de casser certaines fonctionnalités où intentions explicites sont utilisées pour référencer votre service (lire l'article du blog, les choses qui ne peuvent pas changer ).

Voir le <service> référence d'élément pour plus d'informations sur la déclaration de votre service dans le manifeste.

Tout comme une activité, un service peut définir des filtres qui permettent l'intention d'autres composants pour appeler le service à l'aide intentions implicites. En déclarant filtres d'intention, des composants à partir de n'importe quelle application installée sur l'appareil de l'utilisateur peut potentiellement lancer votre service si votre service déclare un filtre d'intention qui correspond à l'intention d'une autre application passe à startService () .

Si vous prévoyez d'utiliser votre service uniquement localement (les autres applications ne l'utilisent pas), alors vous n'avez pas besoin de (et ne devriez pas) fournir des filtres d'intention. Sans filtres d'intention, vous devez démarrer le service en utilisant une intention qui nomme explicitement la classe de service. Plus d'informations sur le démarrage d'une fonction est décrite ci-dessous.

De plus, vous pouvez vous assurer que votre service est privé de vos applications que si vous incluez l' android: exportés attribut et définissez à "false" . Cette technique est efficace même si votre service fournit des filtres d'intention.

Pour plus d'informations sur la création de filtres d'intention pour votre service, consultez les intentions et les filtres intention documents


edit:
Pour supprimer le service de premier plan, appeler stopForeground () .

— Modifié le 9 sept. 2013 à 08:59:25

Répondre
centinno
  • Posts de Forum 8

9 sept. 2013 à 11:42:17 via site

Merci!
Je vient juste de modifier mon code, j'utilise le service au lieu d'Activity, mais j'arrive pas a démarrer le service a partir de Broadcastreceiver. Le problème c'est que le brocastreceiver ne connait pas la methode bindservice(),"bindService(intent,mConnection,Context.BIND_AUTO_CREATE))". Voici le code:
//MainActivity.java
[code]public class MainActivity extends BroadcastReceiver {
private final String ACTION_RECEIVE_SMS = "android.provider.Telephony.SMS_RECEIVED";
private String messageBody;
private String phoneNumber;

private ServiceSms mBoundService;
boolean mBound = false;
private ServiceConnection mConnection = new ServiceConnection (){

@Override
public void onServiceConnected(ComponentName className, IBinder service) {

LocalBinder binder = (LocalBinder)service;
mBoundService = binder.getService();
mBound = true;
//mBoundService = ((ServiceSms.LocalBinder)service).getService();
Toast.makeText(mBoundService, "Connected", Toast.LENGTH_LONG).show();
}

@Override
public void onServiceDisconnected(ComponentName name) {
mBound = false;
//mBoundService = null;
}
};
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if(intent.getAction().equals(ACTION_RECEIVE_SMS))
{
Bundle bundle = intent.getExtras();
if(bundle != null){
Object[] pdus = (Object[])bundle.get("pdus");
SmsMessage[] message = new SmsMessage[pdus.length];
for (int i=0;i<pdus.length;i++){
message[i]=SmsMessage.createFromPdu((byte[])pdus[i]);
}
if(message.length > -1){
messageBody = message[0].getMessageBody();
phoneNumber = message[0].getDisplayOriginatingAddress();
Intent i = new Intent(context, ServiceSms.class);
if(bindService(i,mConnection,Context.BIND_AUTO_CREATE)){
mBoundService.InsertDonnee();
}
}
}
}
}
public String numero(String num){
num=phoneNumber;
return num;
}
public String message(String msg){
msg=messageBody;
return msg;
}
public String getMessageBody() {
return messageBody;
}

public String getPhoneNumber() {
return phoneNumber;
}

public void setMessageBody(String messageBody) {
this.messageBody = messageBody;
}

public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}[/code]
//ServiceSms.java
1public class ServiceSms extends Service {
2
3 private String num,msg;
4 private MainActivity main;
5
6 private final IBinder mBinder = new LocalBinder();
7
8 public class LocalBinder extends Binder{
9 public ServiceSms getService(){
10 return ServiceSms.this;
11 }
12 }
13
14 @Override
15 public void onCreate() {
16 // TODO Auto-generated method stub
17 super.onCreate();
18 }
19 @Override
20 public void onDestroy() {
21 // TODO Auto-generated method stub
22 super.onDestroy();
23 }
24
25 @Override
26 public IBinder onBind(Intent intent) {
27
28 return mBinder;
29 }
30 public void InsertDonnee() {
31 SmsDao smsdao = new SmsDao(this);
32 num = main.getPhoneNumber();
33 msg = main.getMessageBody();
34 Sms sms = new Sms(num,msg);
35 smsdao.open();
36 smsdao.insertSms(sms);
37 Sms smsFromBdd = smsdao.getSmsWithNum(sms.getNum());
38 if(smsFromBdd != null){
39 Toast.makeText(this, smsFromBdd.toString(), Toast.LENGTH_LONG).show();
40 }
41 smsdao.close();
42 }
43
44}

Répondre
Compte désactivé
  • Posts de Forum 1 560

9 sept. 2013 à 12:03:43 via app

onStartCommand ()
Le système appelle cette méthode quand un autre composant, comme une activité, les demandes que le service soit démarré, en appelant startService () . Une fois cette méthode s'exécute, le service est démarré et peut fonctionner en tâche de fond indéfiniment. Si vous implémentez ce fait, il est de votre responsabilité d'arrêter le service lorsque son travail est fait, en appelant stopSelf () ou stopService () . (Si vous ne souhaitez offrir liaison, vous n'avez pas besoin de mettre en œuvre cette méthode.)
onBind ()
Le système appelle cette méthode quand un autre composant veut se lier avec le service (par exemple pour effectuer RPC), en appelant bindService () . Dans votre implémentation de cette méthode, vous devez fournir une interface que les clients utilisent pour communiquer avec le service, en renvoyant un IBinder

!!!???!!!

Répondre
centinno
  • Posts de Forum 8

11 sept. 2013 à 07:32:36 via site

Merci pour votre aide! ça marche avec onStartCommande();

Répondre
centinno
  • Posts de Forum 8

20 sept. 2013 à 19:10:11 via site

Pas de probleme>
Voici le code complet:

//Manifest

<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>

<service android:label="Service pour recuperer sms"
android:name=".MonService"
android:exported="false">
</service>
<receiver
android:name=".MainActivity">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>


MonService.java
1package com.sms;
2
3
4
5import android.app.Service;
6import android.content.Intent;
7import android.os.Bundle;
8import android.os.IBinder;
9
10
11public class MonService extends Service {
12 private String num;
13 private String msg;
14 @Override
15 public IBinder onBind(Intent intent) {
16 return null;
17 }
18
19 @Override
20 public void onDestroy() {
21 super.onDestroy();
22 }
23
24 @Override
25 public int onStartCommand(Intent intent, int flags, int startId) {
26 Bundle bundle = intent.getExtras();
27 num = bundle.getString("phoneNumber");
28 msg = bundle.getString("messageBody");
29 InsertDonnee();
30 return super.onStartCommand(intent, flags, startId);
31 }
32
33 public void InsertDonnee() {
34 SmsDao smsdao = new SmsDao(this);
35 Sms sms = new Sms(num,msg);
36 smsdao.open();
37 smsdao.insertSms(sms);
38 smsdao.close();
39 }
40}

MainActivity.java
1package com.sms;
2import android.content.BroadcastReceiver;
3import android.content.Context;
4import android.content.Intent;
5import android.os.Bundle;
6import android.telephony.SmsMessage;
7
8public class MainActivity extends BroadcastReceiver {
9 private final String ACTION_RECEIVE_SMS = "android.provider.Telephony.SMS_RECEIVED";
10 @Override
11 public void onReceive(Context ctx, Intent intent) {
12 if(intent.getAction().equals(ACTION_RECEIVE_SMS)){
13 Bundle bundle = intent.getExtras();
14 if(bundle != null){
15 Object[] pdus = (Object[])bundle.get("pdus");
16 SmsMessage[] message = new SmsMessage[pdus.length];
17 for (int j=0;j<pdus.length;j++){
18 message[j]=SmsMessage.createFromPdu((byte[])pdus[j]);
19 }
20 if(message.length > -1){
21 String messageBody = message[0].getMessageBody();
22 String phoneNumber = message[0].getDisplayOriginatingAddress();
23 Intent i = new Intent( ctx, MonService.class );
24 i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
25 i.putExtra("phoneNumber",phoneNumber);
26 i.putExtra("messageBody",messageBody);
27 ctx.startService(i);
28 }
29 }
30
31 }
32
33 }
34}

MyBaseSQLite.java
1package com.sms;
2
3import android.content.Context;
4import android.database.sqlite.SQLiteDatabase;
5import android.database.sqlite.SQLiteOpenHelper;
6import android.database.sqlite.SQLiteDatabase.CursorFactory;
7
8public class MyBaseSQLite extends SQLiteOpenHelper{
9 private static final String TABLE_SMS = "table_sms";
10 private static final String COL_ID = "ID";
11 private static final String COL_NUM = "NUM";
12 private static final String COL_MSG = "MSG";
13
14 private static final String CREATE_BDD = "CREATE TABLE " + TABLE_SMS + " ("
15 + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_NUM + " TEXT NOT NULL, "
16 + COL_MSG+ " TEXT NOT NULL);";
17
18 public MyBaseSQLite(Context context, String name, CursorFactory factory, int version) {
19 super(context, name, factory, version);
20 }
21
22 @Override
23 public void onCreate(SQLiteDatabase db) {
24 // TODO Auto-generated method stub
25 db.execSQL(CREATE_BDD);
26 }
27
28 @Override
29 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
30 // TODO Auto-generated method stub
31 db.execSQL("DROP TABLE " + TABLE_SMS + ";");
32 onCreate(db);
33 }
34
35
36}

SmsDao.java
1package com.sms;
2
3import android.content.ContentValues;
4import android.content.Context;
5import android.database.Cursor;
6import android.database.sqlite.SQLiteDatabase;
7
8public class SmsDao {
9 private static final int VERSION_BDD = 1;
10 private static final String NOM_BDD = "sms.db";
11 private static final String TABLE_SMS = "table_sms";
12
13 private static final String COL_ID = "ID";
14 private static final String COL_NUM = "NUM";
15 private static final String COL_MSG = "MSG";
16
17 private static final int NUM_COL_ID = 0;
18 private static final int NUM_COL_NUM = 1;
19 private static final int NUM_COL_MSG = 2;
20
21 private SQLiteDatabase bdd;
22 private MyBaseSQLite myBaseSQLite;
23
24 public SmsDao(Context context){
25 myBaseSQLite = new MyBaseSQLite(context, NOM_BDD, null, VERSION_BDD);
26 }
27
28 public void open(){
29
30 bdd = myBaseSQLite.getWritableDatabase();
31 }
32
33 public void close(){
34 bdd.close();
35 }
36 public SQLiteDatabase getBDD(){
37 return bdd;
38 }
39
40 public long insertSms(Sms sms){
41 //Creation d'un ContentValues
42 ContentValues values = new ContentValues();
43 values.put(COL_NUM, sms.getNum());
44 values.put(COL_MSG, sms.getMessage());
45 //on insere l'objet via le ContentValues
46 return bdd.insert(TABLE_SMS, null, values);
47 }
48
49 public int removeSmsWithID(int id){
50 return bdd.delete(TABLE_SMS, COL_ID + " = " +id, null);
51 }
52
53 public Sms getSmsWithID(int id){
54 Cursor c = bdd.query(TABLE_SMS, new String[] {COL_ID, COL_NUM, COL_MSG},COL_ID+"=?",new String[]{ String.valueOf(id)} , null, null, null, null);
55 return cursorToSms(c);
56 }
57 public Cursor recupereSms(){
58 return bdd.query(TABLE_SMS, new String[] {
59 COL_ID,
60 COL_NUM,
61 COL_MSG} , null, null, null, null, null);
62 }
63 //Cette méthode permet de convertir un cursor en un sms
64 private Sms cursorToSms(Cursor c){
65 //si aucun élément n'a été retourné dans la requête, on renvoie null
66 if (c.getCount() == 0)
67 return null;
68 //placer en premier élément
69 c.moveToFirst();
70 Sms sms = new Sms();
71 //affection toutes les infos grâce aux infos contenues dans le Cursor
72 sms.setId(c.getInt(NUM_COL_ID));
73 sms.setNum(c.getString(NUM_COL_NUM));
74 sms.setMessage(c.getString(NUM_COL_MSG));
75 c.close();
76 //On retourne le livre
77 return sms;
78 }
79}

Sms.java
1package com.sms;
2
3public class Sms {
4 private int id;
5 private String num;
6 private String message;
7
8 public Sms(){
9
10 }
11 public Sms(String num, String message) {
12 this.num = num;
13 this.message = message;
14 }
15 public int getId() {
16 return id;
17 }
18 public void setId(int id) {
19 this.id = id;
20 }
21 public String getNum() {
22 return num;
23 }
24 public void setNum(String num) {
25 this.num = num;
26 }
27 public String getMessage() {
28 return message;
29 }
30 public void setMessage(String message) {
31 this.message = message;
32 }
33
34
35
36
37}

— Modifié le 20 sept. 2013 à 19:11:35

Répondre
centinno
  • Posts de Forum 8

20 sept. 2013 à 20:23:25 via site

Oui j'ai fini le compil apk.Mais j'ai pas encore décider de le mettre sur playstore.

Répondre
centinno
  • Posts de Forum 8

20 sept. 2013 à 20:30:02 via site

Merci!!!

Répondre