2011-01-30 10 views

risposta

1

Un modo per fare ciò è definire un'interfaccia con Android's AIDL e utilizzare il sottosistema Binder per eseguire IPC. C'è una grande serie di istruzioni al link che ho postato. Inizierei lì e quindi inserirò qui se hai domande. Nonostante sia un argomento molto complesso (IPC) Android e lo Binder fanno davvero un buon lavoro nel renderlo abbastanza semplice (almeno per iniziare, sono sicuro che potresti renderlo complicato se lo volessi ;-))

Modifica Come indicato nei commenti, questo non è necessario se lo Service e il client sono in esecuzione nello stesso processo. Se non diversamente specificato, questo è il valore predefinito. Tuttavia, funziona ancora a prescindere, aggiunge solo un po 'più di complessità.

+0

il tuo link non funziona ... –

+0

@RajaReddyPolamReddy grazie! L'ho riparato. –

+1

AIDL è necessario solo se il servizio e l'attività si trovano in diverse applicazioni. Se il servizio e l'attività sono locali per l'applicazione (che è il caso comune), vedere la risposta di @hackbod – odedfos

0

Non so dove sia il tuo problema, per favore inserisci del codice. Utilizzando un Raccoglitore, l'Attività può avere accesso all'oggetto servizio. Vedi gli esempi nell'API per creare una connessione tra attività e servizio.

Avere l'oggetto servizio nella propria attività, è sufficiente chiamare:
mService.yourMethod();
Potremmo aiutarti molto meglio se descrivesti esattamente il tuo problema e, come ho detto, pubblica alcuni frammenti.

+4

Perché non metti alcuni link a risorse utili? Pubblica alcuni frammenti di scheletro su come associare un servizio e chiamare successivamente il suo metodo? :) – Juri

+0

@Juri http://stackoverflow.com/questions/1916253/bind-service-to-activity-in-android dal nulla è stato collegato – CrandellWS

24

C'è codice di esempio per questo diritto nella documentazione del Servizio, sotto "Sample servizio locale":

http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

anche per quelle persone che suggeriscono AIDL - se il servizio e cliente sono tutti parte del vostro possedere .apk ed essere in esecuzione nello stesso processo (il comportamento predefinito), non c'è bisogno di aiuto; è solo una complessità aggiuntiva che non ti dà nulla.

35

Ecco un esempio che potrebbe aiutare
Server.java:

package com.example.bindservice.binder; 

import java.text.SimpleDateFormat; 
import java.util.Date; 

import android.app.Service; 
import android.content.Intent; 
import android.os.Binder; 
import android.os.IBinder; 

public class Server extends Service { 

    IBinder mBinder = new LocalBinder(); 

    @Override 
    public IBinder onBind(Intent intent) { 
     return mBinder; 
    } 

    public class LocalBinder extends Binder { 
     public Server getServerInstance() { 
      return Server.this; 
     } 
    } 

    public String getTime() { 
     SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     return mDateFormat.format(new Date()); 
    } 
} 

Client.java

package com.example.bindservice.binder; 

import android.app.Activity; 
import android.content.ComponentName; 
import android.content.Intent; 
import android.content.ServiceConnection; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.example.bindservice.binder.Server.LocalBinder; 

public class Client extends Activity { 

    boolean mBounded; 
    Server mServer; 
    TextView text; 
    Button button; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     text = (TextView)findViewById(R.id.text); 
     button = (Button) findViewById(R.id.button); 
     button.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       text.setText(mServer.getTime()); 
      } 
     }); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 

     Intent mIntent = new Intent(this, Server.class); 
     bindService(mIntent, mConnection, BIND_AUTO_CREATE); 
    }; 

    ServiceConnection mConnection = new ServiceConnection() { 
     @Override 
     public void onServiceDisconnected(ComponentName name) { 
      Toast.makeText(Client.this, "Service is disconnected", 1000).show(); 
      mBounded = false; 
      mServer = null; 
     } 

     @Override 
     public void onServiceConnected(ComponentName name, IBinder service) { 
      Toast.makeText(Client.this, "Service is connected", 1000).show(); 
      mBounded = true; 
      LocalBinder mLocalBinder = (LocalBinder)service; 
      mServer = mLocalBinder.getServerInstance(); 
     } 
    }; 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     if(mBounded) { 
      unbindService(mConnection); 
      mBounded = false; 
     } 
    }; 
} 
+0

risposta eccellente ... – Opiatefuchs

+0

se il servizio è forzato, ricevo la chiamata a onServiceDisconnected? –

+9

perché è così dannatamente difficile chiamare una fuction semplice –

Problemi correlati