2010-02-16 9 views
12

ich die Folowing Methode in einem Dienst in meiner appplication habe:Android - Verwenden der Methode von einem Dienst in einer Aktivität?

public void switchSpeaker(boolean speakerFlag){ 

     if(speakerFlag){ 
     audio_service.setSpeakerphoneOn(false); 
     } 
     else{ 
     audio_service.setSpeakerphoneOn(true); 
     } 

    } 

Also meine Frage ist, was ist der beste und effektivste Weg, die Lage sein, diese Methode in einer Aktivität zu verwenden, wie folgt

final Button speaker_Button = (Button) findViewById(R.id.widget36); 

      speaker_Button.setOnClickListener(new View.OnClickListener(){ 
       public void onClick(View v){ 

        switchSpeaker(true); //method from Service 

       } 

      }); 

Muss ich ein AIDL machen oder gibt es einen einfacheren Weg?

Antwort

3

Sie müssen Service switchSpeaker Methode für Kunden offenlegen. Definieren Sie Ihre .aidl-Datei. Dann binden Sie diesen Service von Ihrer Aktivität aus und rufen Sie einfach switchSpeaker. Siehe documentation

Keine andere einfache Möglichkeit, diese Methode aufzurufen, nur dann, wenn es statisch)

+1

Für .aidl verweisen wir Multi-Threading zu behandeln haben und so ist das nicht ein richtiger Weg zur Umsetzung des Hilfe, um einen lokalen Service zu nutzen. Stattdessen gibt es zwei andere Optionen, die wir verwenden können und die Verwendung von IBinder und Using Messenger. IBinder ist am besten, wenn ein lokaler Service mit der Aktivität verbunden ist. – Dharmendra

+1

Link ist kaputt: p @ponkin – Pankaj

3

Es ist öffentlich, rechts :)

Sie können bindService (Intent) -Methode aufrufen. Werfen Sie einen Blick auf ApiDemos, die Klasse LocalServiceBinding.

In der Callback-Methode onServiceConnected können Sie sehen:

public void onServiceConnected(ComponentName className, IBinder service) { 
     // This is called when the connection with the service has been 
     // established, giving us the service object we can use to 
     // interact with the service. Because we have bound to a explicit 
     // service that we know is running in our own process, we can 
     // cast its IBinder to a concrete class and directly access it. 
     mBoundService = ((LocalService.LocalBinder)service).getService(); 

     // Tell the user about this for our demo. 
     Toast.makeText(LocalServiceBinding.this, R.string.local_service_connected, 
       Toast.LENGTH_SHORT).show(); 
    } 

Verwenden Sie nun das Dienstobjekt (mBoundService) die Methode aufzurufen.

Das ist alles :)

+0

aber dann wird es ein begrenzter Dienst und ich werde nicht in der Lage sein, es zu verwenden, auch nachdem die Aktivitätskomponente zerstört wird .. auf andere Weise? –

+0

Wenn der Dienst im Hintergrund ausgeführt werden soll, wenn die Aktivität zerstört wird, können Sie den Dienst normal starten, ohne ihn an Ihre Aktivität zu binden. Dann, um die Methode aus dem Dienst aufzurufen, anstatt direkt aufzurufen, können Sie startService mit Intent aufrufen, hat eine vordefinierte Aktion oder zusätzliche Daten, ob der Dienst bereits ausgeführt wird oder nicht, es onStartCommand Methode aufgerufen wird -> prüfen Sie die Absicht und Rufen Sie die gewünschte Methode auf, wenn die Absicht übereinstimmt. Der Hauptunterschied besteht darin, dass dieser Aufruf asynchron ist und Sie das Methodenergebnis nicht direkt erhalten können. –

68

es 3 Möglichkeiten sind Dienstleistung mit Ihrer Aktivität zu binden.

  1. IBinder Implementierung
  2. Mit Gesander
  3. AIDL Mit

Unter dieser IBinder Implementierung ist der beste Anzug in Ihrem Fall

Beispiel IBinder Klasse

1. Server.java Dienst

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 void switchSpeaker(boolean speakerFlag){ 

     if(speakerFlag){ 
     audio_service.setSpeakerphoneOn(false); 
     } 
     else{ 
     audio_service.setSpeakerphoneOn(true); 
     } 

    } 
} 

2. Client.java Aktivität

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) { 
      mServer.switchSpeaker(true); 
     } 
    }); 

} 

@Override 
protected void onStart() { 
    super.onStart(); 
    Intent mIntent = new Intent(this, Server.class); 
bindService(mIntent, mConnection, BIND_AUTO_CREATE); 
}; 

ServiceConnection mConnection = new ServiceConnection() { 

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

    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; 
    } 
}; 
} 

Beispiel Gesander Klasse

1. Server.java Service

public class Server extends Service{ 

    Messenger messenger = new Messenger(new LocalHandler()); 
    Messenger clientMessenger; 
    static final int SysterTime = 0; 
    static final int AddHandler = 1; 
    List<Handler> mHandlers; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mHandlers = new ArrayList<Handler>(); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return messenger.getBinder(); 
    } 

    public class LocalHandler extends Handler { 

     @Override 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 
      case SysterTime: 
       SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
       try { 
        clientMessenger.send(Message.obtain(null, SysterTime, mDateFormat.format(new Date()))); 
       } catch (RemoteException e) { 
        e.printStackTrace(); 
       } 
       break; 

      case AddHandler: 
       clientMessenger = new Messenger((Handler) msg.obj); 
       try { 
        clientMessenger.send(Message.obtain(null, AddHandler, "Registed messanger")); 
       } catch (RemoteException e) { 
        e.printStackTrace(); 
       } 
       break; 

      default: 
       break; 
      } 
      super.handleMessage(msg); 
     } 
    } 
} 

2. Kunde.java Aktivität

public class Client extends Activity { 

    Messenger messenger; 
    boolean mBounded; 
    TextView text; 
    Button button; 
    Button register; 


    @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) { 

       Message message = Message.obtain(null, Server.SysterTime, null); 
       try { 
        messenger.send(message); 
       } catch (RemoteException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 

     register = (Button) findViewById(R.id.register); 
     register.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 

       Message message = Message.obtain(null, Server.AddHandler, new ClientHandle()); 
       try { 
        messenger.send(message); 
       } catch (RemoteException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 

    } 


    public class ClientHandle extends Handler { 

     @Override 
     public void handleMessage(Message msg) { 

      switch (msg.what) { 
      case Server.SysterTime: 
       text.setText(msg.obj.toString()); 
       break; 

      case Server.AddHandler: 
       text.setText(msg.obj.toString()); 
       break; 

      default: 
       break; 
      } 

      super.handleMessage(msg); 
     } 


    } 

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

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



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



    ServiceConnection mConnection = new ServiceConnection() { 

     public void onServiceDisconnected(ComponentName name) { 
      mBounded = false; 
      messenger = null; 
     } 

     public void onServiceConnected(ComponentName name, IBinder service) { 
      Toast.makeText(Client.this, "Service is connected", 1000).show(); 
      messenger = new Messenger(service); 
      mBounded = true; 
     } 
    }; 
} 

Beispiel AIDL

1. IRemoteService.aidl

package com.example.bindservice.aidl; 

interface IRemoteService { 

    String getMessage(String msg); 
} 

2. Server.java Dienst

public class Server extends Service{ 

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

    IRemoteService.Stub mStub = new IRemoteService.Stub() { 

     public String getMessage(String msg) throws RemoteException { 
      return msg; 
     } 
    }; 
} 

3. Client.java Aktivität

public class Client extends Activity { 

    Button button; 
    TextView text; 
    boolean mBound; 
    IRemoteService mIRemoteService; 
    EditText etMsg; 

    @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); 
     etMsg = (EditText)findViewById(R.id.etMsg); 
     button.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 

       if(mBound) { 
        try { 
         text.setText(mIRemoteService.getMessage(etMsg.getText().toString())); 
        } catch (RemoteException e) { 
         e.printStackTrace(); 
        }     
       } 
      } 
     }); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     bindService(new Intent(Client.this, Server.class), mConnection, BIND_AUTO_CREATE); 
    } 

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

    ServiceConnection mConnection = new ServiceConnection() { 

     public void onServiceDisconnected(ComponentName name) { 
      mIRemoteService = null; 
      mBound = false; 
     } 

     public void onServiceConnected(ComponentName name, IBinder service) { 
      mIRemoteService = IRemoteService.Stub.asInterface(service); 
      mBound = true; 
     } 
    }; 
} 

Für weitere Studie, die Sie this document

+3

gute Beispiele dort! –

+0

Ich benutze Beispiel 3 mit Hilfe von aidl, erhalten Null Zeiger Ausnahme hier String a = mIRemoteService.getMessage ("msg"); –

+0

@RajaReddyPolamReddy Stellen Sie eine neue Frage mit Ihrem Code, damit Sie mehr und bessere Antworten erhalten können. – Dharmendra