Je suis assez novice en matière de programmation Android et de Java en général, mais j'ai une grande expérience en tant que codeur C au niveau du système. Je voulais créer une API ou une bibliothèque qui pourrait être utilisée par une suite d'applications Android que je prévois de développer et, après de nombreuses recherches, j'ai décidé qu'un service lié était le moyen Android de le faire (j'aurais normalement créé un .so ou un .dll). Si cette hypothèse est incorrecte, alors toute ma question pourrait bien être sans objet.
Quoi qu'il en soit, j'ai créé le cadre de mon service dans un projet et j'ai créé une activité dans un autre pour tester le service. J'ai fait un stub de la méthode handleMessage() du service avec des appels à Toast juste pour voir si cela fonctionnait et j'ai ensuite ajouté deux boutons à mon activité : un pour lier le service et le second pour le délier. Après environ une heure d'impossibilité d'exécuter mon activité parce qu'elle ne pouvait pas voir mon service, j'ai trouvé comment faire en sorte qu'Eclipse puisse voir le code source du service à partir de l'activité et j'ai pensé que j'étais sur la bonne voie. Puis j'ai lancé l'activité.
Tout a l'air d'aller bien. Deux boutons, l'un pour lier, l'autre pour délier. Cependant, lorsque j'ai appuyé sur le bouton de liaison, l'application s'est fermée de force. J'ai utilisé le débogueur pour voir ce qui se passait et la fermeture forcée a lieu lors de l'appel à bindService() dans mon activité. Bien sûr, l'appel bindService() a été copié à partir d'un autre exemple dans lequel un nouveau Intent() a été créé sur la même ligne, donc j'ai séparé les deux lignes de code et c'est vraiment qui meurt lorsque j'essaie de créer l'intention.
Voici le code de mon activité :
package net.william.android.myAPI.tester;
import net.william.android.myAPI.MyApiService;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.widget.Toast;
public class MyApiTester extends Activity
{
boolean mIsBound = false;
private ServiceConnection mConnection = new ServiceConnection()
{
public void onServiceConnected(ComponentName className, IBinder service)
{
Toast.makeText(FaceClientTester.this, "Remote Service Connected", Toast.LENGTH_SHORT).show();
}
public void onServiceDisconnected(ComponentName className)
{
Toast.makeText(FaceClientTester.this, "Remote Service Disconnected", Toast.LENGTH_SHORT).show();
}
};
public void doBindService(View view)
{
if (!mIsBound)
{
Toast.makeText(this, "Binding Service", Toast.LENGTH_SHORT).show();
Intent myIntent = new Intent(MyApiTester.this, MyApiService.class);
bindService(myIntent, mConnection, Context.BIND_AUTO_CREATE);
mIsBound = true;
}
}
public void doUnbindService(View view)
{
if (mIsBound)
{
unbindService(mConnection);
mIsBound = false;
Toast.makeText(this, "Service Unbound", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
return;
}
}
Voici le code de mon service :
package net.william.android.myAPI
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.widget.Toast;
public class MyApiService extends Service
{
static final int API_FN_1 = 101;
static final int API_FN_2 = 102;
class MyApiHandler extends Handler
{
@Override
public void handleMessage(Message msg)
{
switch (msg.what)
{
case API_FN_1:
ApiFn1();
break;
case API_FN_2:
ApiFn2();
break;
default:
super.handleMessage(msg);
break;
}
}
}
final Messenger myMessenger = new Messenger(new MyApiHandler());
@Override
public void onCreate()
{
Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
}
@Override
public void onDestroy()
{
Toast.makeText(this, "Service Stopped", Toast.LENGTH_SHORT).show();
}
@Override
public IBinder onBind(Intent intent)
{
Toast.makeText(this, "Service Bound", Toast.LENGTH_SHORT).show();
return myMessenger.getBinder();
}
private void ApiFn1()
{
Toast.makeText(this, "API Function 1", Toast.LENGTH_SHORT).show();
return;
}
private void ApiFn2()
{
Toast.makeText(this, "API Function 2", Toast.LENGTH_SHORT).show();
return;
}
}
J'ai changé certains noms de choses, mais c'est vraiment l'essentiel de mon code jusqu'à présent. Juste un tas d'appels à Toast pour que je puisse, je l'espère, voir que la chose fonctionne.
Tous les tutoriels que j'ai trouvés sur le sujet ignorent complètement le manifeste. Hier soir, j'ai essayé de modifier les options du manifeste en pensant que cela pouvait avoir un rapport avec le problème, mais en vain. Quoi qu'il en soit, pour être complet, voici le code du manifeste pour l'activité :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.william.android.myAPI.tester"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="10" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MyApiTester" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
et le service :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.william.android.myAPI"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="10" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<service android:name=".MyApiService"></service>
</application>
</manifest>
J'ai essayé d'ajouter ce qui suit à l'intérieur du fichier <service>
mais cela n'a pas semblé aider :
<intent-filter>
<action android:name="net.william.android.myAPI.MyApiService" />
</intent-filter>
Quoi qu'il en soit, il s'agit de mon premier message sur votre forum, alors je m'excuse s'il y a trop ou trop peu d'informations, ou si j'ai manqué une solution vraiment facile quelque part sur le web. J'ai passé une bonne partie de la nuit à lire toute la documentation sur les services offerts par Google et à lire les messages des forums les uns après les autres, donc, à ce stade, je pourrais très facilement oublier quelque chose. Merci d'avance à tous ceux qui trouveront le temps de m'aider !