pouvez-vous me donner un exemple simple d'application avec service d'arrière-plan qui utilise des méthodes bind/unbind pour le démarrer et l'arrêter? J'y cherchais pendant une demi-heure, mais ces exemples utilisent les méthodes startService/stopService ou sont très difficiles pour moi. Je vous remercie.
Vous pouvez essayer d'utiliser ce code:
protected ServiceConnection mServerConn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
Log.d(LOG_TAG, "onServiceConnected");
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(LOG_TAG, "onServiceDisconnected");
}
}
public void start() {
// mContext is defined upper in code, I think it is not necessary to explain what is it
mContext.bindService(intent, mServerConn, Context.BIND_AUTO_CREATE);
mContext.startService(intent);
}
public void stop() {
mContext.stopService(new Intent(mContext, ServiceRemote.class));
mContext.unbindService(mServerConn);
}
Ajoutez ces méthodes à votre activité:
private MyService myServiceBinder;
public ServiceConnection myConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder binder) {
myServiceBinder = ((MyService.MyBinder) binder).getService();
Log.d("ServiceConnection","connected");
showServiceData();
}
public void onServiceDisconnected(ComponentName className) {
Log.d("ServiceConnection","disconnected");
myService = null;
}
};
public Handler myHandler = new Handler() {
public void handleMessage(Message message) {
Bundle data = message.getData();
}
};
public void doBindService() {
Intent intent = null;
intent = new Intent(this, BTService.class);
// Create a new Messenger for the communication back
// From the Service to the Activity
Messenger messenger = new Messenger(myHandler);
intent.putExtra("MESSENGER", messenger);
bindService(intent, myConnection, Context.BIND_AUTO_CREATE);
}
Et vous pouvez vous lier au service en survivant onResume (), et onPause () dans votre classe d'activité.
@Override
protected void onResume() {
Log.d("activity", "onResume");
if (myService == null) {
doBindService();
}
super.onResume();
}
@Override
protected void onPause() {
//FIXME put back
Log.d("activity", "onPause");
if (myService != null) {
unbindService(myConnection);
myService = null;
}
super.onPause();
}
Notez que lors de la liaison à un service, seule la méthode onCreate()
est appelée dans la classe de service. Dans votre classe de service, vous devez définir la méthode myBinder:
private final IBinder mBinder = new MyBinder();
private Messenger outMessenger;
@Override
public IBinder onBind(Intent arg0) {
Bundle extras = arg0.getExtras();
Log.d("service","onBind");
// Get messager from the Activity
if (extras != null) {
Log.d("service","onBind with extra");
outMessenger = (Messenger) extras.get("MESSENGER");
}
return mBinder;
}
public class MyBinder extends Binder {
MyService getService() {
return MyService.this;
}
}
Après avoir défini ces méthodes, vous pouvez accéder aux méthodes de votre service dans votre activité:
private void showServiceData() {
myServiceBinder.myMethod();
}
et enfin, vous pouvez démarrer votre service lorsqu'un événement tel que _BOOT_COMPLETED_ survient
public class MyReciever extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("Android.intent.action.BOOT_COMPLETED")) {
Intent service = new Intent(context, myService.class);
context.startService(service);
}
}
}
notez que lors du démarrage d'un service, onCreate()
et onStartCommand()
sont appelées dans la classe de service et vous pouvez arrêter votre service lorsqu'un autre événement se produit de stopService () notez que votre écouteur d'événement doit être enregistré dans votre fichier manifeste Android:
<receiver Android:name="MyReciever" Android:enabled="true" Android:exported="true">
<intent-filter>
<action Android:name="Android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
Tout d’abord, deux choses que nous devons comprendre,
bindService(new Intent("com.Android.vending.billing.InAppBillingService.BIND"), mServiceConn, Context.BIND_AUTO_CREATE);
ici mServiceConn
est une instance de ServiceConnection
class (intégrée), c’est en fait une interface que nous devons implémenter avec deux méthodes (la première pour le réseau connecté et le second réseau non connecté) pour surveiller l’état de la connexion réseau.
IBinder
Object. Donc, IBinder
object est notre gestionnaire qui accède à toutes les méthodes de Service
à l'aide de l'opérateur (.)..
MyService myService;
public ServiceConnection myConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder binder) {
Log.d("ServiceConnection","connected");
myService = binder;
}
//binder comes from server to communicate with method's of
public void onServiceDisconnected(ComponentName className) {
Log.d("ServiceConnection","disconnected");
myService = null;
}
}
myservice.serviceMethod();
Ici myService
est un objet et serviceMethod est une méthode dans le service. et de cette manière, la communication est établie entre le client et le serveur.