it-swarm.com.de

Wie rufen Sie Methoden eines Dienstes aus Aktivität auf?

Ich möchte einfach die Methoden eines lokalen Dienstes aus meiner Tätigkeit heraus aufrufen. Wie kann ich das machen ?

25
Shiz

Eine Möglichkeit, dies zu tun, besteht darin, eine Schnittstelle mit Android AIDL zu definieren und das Subsystem Binder für die Ausführung von IPC zu verwenden. Unter dem Link, den ich gepostet habe, gibt es eine Reihe von Anweisungen. Ich würde dort anfangen und dann hier posten, wenn Sie Fragen haben. Obwohl es ein ziemlich komplexes Thema (IPC) ist, machen Android und die Binder wirklich gute Arbeit, um es ziemlich einfach zu machen (zumindest für den Anfang, ich bin mir sicher, Sie könnten es kompliziert machen, wenn Sie wollten ;-))

Edit Wie in den Kommentaren darauf hingewiesen, ist dies nicht erforderlich, wenn die Variable Service und der Client im selben Prozess ausgeführt werden. Wenn Sie nichts anderes angeben, ist dies die Standardeinstellung. Es funktioniert jedoch trotzdem, es fügt nur etwas mehr Komplexität hinzu.

2
Chris Thompson

Hier ist ein Beispiel, das helfen könnte
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;
        }
    };
}
50
Prateek Yadav

Beispielcode für dieses Recht befindet sich in der Service-Dokumentation unter "Local Service Sample":

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

Auch für diejenigen, die helpl vorschlagen - wenn Ihr Service und Ihr Client alle Teil Ihres eigenen .apk sind und in demselben Prozess (dem Standardverhalten) ausgeführt werden, besteht keine Notwendigkeit für aidl; Es ist nur zusätzliche Komplexität, die Ihnen nichts gibt.

28
hackbod

Wie ruft man eine normale Java Klassenmethode auf?

A obj = new A();
obj.method();

Service ist eine Java class. Wie würden Sie also eine Service-Methode aufrufen?

serviceObj.method();

Die eigentliche Frage ist nun, wie Sie ein Service-Objekt erstellen.

Service serviceObj = new Service();

Auf keinen Fall.

In Android ist Service eine Systemkomponente, die von Android OS erstellt, zerstört und verwaltet wird.
Zum Erstellen eines Serviceobjekts benötigen wir `IBinder.

Dies ist der Ablauf beim Abrufen eines Serviceobjekts von IBinder .

enter image description here

Sobald Sie serviceObject angehalten haben. Es wird wie jedes normale Java Objekt funktionieren.
Die oben in der Abbildung erläuterte Sache wird als Bindung eines Dienstes bezeichnet.

Das Binden ermöglicht das Beobachten eines Hintergrunddienstes aus einer Aktivität. Mit der Bindung können wir auf beide Arten kommunizieren, dh Aktivität <---> Service.
Prateek Yadav hat bereits ein exzellentes Code-Snippet zur Verfügung gestellt. Das kannst du benutzen.

Ein paar Dinge zu beachten

  • Vergessen Sie niemals, den Dienst zu entbinden, da dies sonst zu ResourceLeak führen kann.
  • Sie können startService(intent) und bindService(mIntent, mConnection, BIND_AUTO_CREATE) in beliebiger Reihenfolge aufrufen. Binden und Starten eines Dienstes sind zwei unabhängige Dinge.
2
Rohit Singh

Ich weiß nicht, wo Ihr Problem liegt, bitte posten Sie etwas Code ... Mit einer Sammelmappe kann die Aktivität auf das Serviceobjekt zugreifen. Siehe die Beispiele in der API zum Herstellen einer Verbindung zwischen Aktivität und Service. 

Wenn Sie das Serviceobjekt in Ihrer Aktivität haben, können Sie einfach anrufen:
mService.yourMethod ();
Wir könnten Ihnen viel besser helfen, wenn Sie Ihr Problem genau beschreiben würden und, wie gesagt, einige Ausschnitte posten. 

0
Jonathan Roth