it-swarm.com.de

Übergabe von Daten von Aktivität an Dienst mit einer Absicht

Wie erhalte ich Daten in einem Android-Service, das von einem aufrufenden Activity übergeben wurde?

61
GobiasKoffi

Erster Kontext (kann Aktivität/Dienstleistung usw. sein)

Sie haben einige Möglichkeiten:

1) Verwenden Sie das Bundle aus dem Intent :

Intent mIntent = new Intent(this, Example.class);
Bundle extras = mIntent.getExtras();
extras.putString(key, value);  

2) Erstellen Sie ein neues Bundle

Intent mIntent = new Intent(this, Example.class);
Bundle mBundle = new Bundle();
mBundle.extras.putString(key, value);
mIntent.putExtras(mBundle);

3) Verwenden Sie die Shortcut-Methode putExtra () des Intent

Intent mIntent = new Intent(this, Example.class);
mIntent.putExtra(key, value);

Neuer Kontext (kann Aktivität/Dienstleistung usw. sein)

Intent myIntent = getIntent(); // this getter is just for example purpose, can differ
if (myIntent !=null && myIntent.getExtras()!=null)
     String value = myIntent.getExtras().getString(key);
}

HINWEIS: Bundles haben "get" - und "put" -Methoden für Alle primitiven Typen, Parcelables und Serializables. Ich habe Strings nur zu Demonstrationszwecken verwendet.

29
Pentium10

Um eine genaue Antwort auf diese Frage zu erhalten, wie Daten von einer Aktivität an einen Dienst gesendet werden sollen, müssen Sie die onStartCommand() -Methode überschreiben, bei der Sie das Absichtsobjekt erhalten:

Wenn Sie eine Service erstellen, sollten Sie die onStartCommand() -Methode überschreiben. Wenn Sie sich die Signatur unten genau ansehen, erhalten Sie hier das intent-Objekt, das an sie übergeben wird:

  public int onStartCommand(Intent intent, int flags, int startId)

So erstellen Sie aus einer Aktivität das Intent-Objekt, um den Dienst zu starten, und platzieren Ihre Daten dann in dem Intent-Objekt. Beispielsweise möchten Sie eine UserID von Activity an Service übergeben:

 Intent serviceIntent = new Intent(YourService.class.getName())
 serviceIntent.putExtra("UserID", "123456");
 context.startService(serviceIntent);

Wenn der Dienst gestartet wird, wird seine onStartCommand() -Methode aufgerufen, sodass Sie in dieser Methode den Wert (UserID) beispielsweise vom Intent-Objekt abrufen können

public int onStartCommand (Intent intent, int flags, int startId) {
    String userID = intent.getStringExtra("UserID");
    return START_STICKY;
}

Hinweis: Die obige Antwort gibt an, dass Sie eine Intent mit der getIntent() -Methode erhalten, die im Kontext eines Services nicht korrekt ist

183
user_CC

Wenn Sie Ihren Dienst binden, erhalten Sie das Extra in onBind(Intent intent).

Aktivität:

 Intent intent = new Intent(this, LocationService.class);                                                                                     
 intent.putExtra("tour_name", mTourName);                    
 bindService(intent, mServiceConnection, BIND_AUTO_CREATE); 

Bedienung: 

@Override
public IBinder onBind(Intent intent) {
    mTourName = intent.getStringExtra("tour_name");
    return mBinder;
}
9
Martin Pfeffer

Eine andere Möglichkeit ist die Verwendung von intent.getAction:

Im Dienst:

public class SampleService inherits Service{
    static final String ACTION_START = "com.yourcompany.yourapp.SampleService.ACTION_START";
    static final String ACTION_DO_SOMETHING_1 = "com.yourcompany.yourapp.SampleService.DO_SOMETHING_1";
    static final String ACTION_DO_SOMETHING_2 = "com.yourcompany.yourapp.SampleService.DO_SOMETHING_2";
    static final String ACTION_STOP_SERVICE = "com.yourcompany.yourapp.SampleService.STOP_SERVICE";

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        String action = intent.getAction();
        //System.out.println("ACTION: "+action);
        switch (action){
            case ACTION_START:
                startingService(intent.getIntExtra("valueStart",0));
                break;
            case ACTION_DO_SOMETHING_1:
                int value1,value2;
                value1=intent.getIntExtra("value1",0);
                value2=intent.getIntExtra("value2",0);
                doSomething1(value1,value2);
                break;
            case ACTION_DO_SOMETHING_2:
                value1=intent.getIntExtra("value1",0);
                value2=intent.getIntExtra("value2",0);
                doSomething2(value1,value2);
                break;
            case ACTION_STOP_SERVICE:
                stopService();
                break;
        }
        return START_STICKY;
    }

    public void startingService(int value){
        //calling when start
    }

    public void doSomething1(int value1, int value2){
        //...
    }

    public void doSomething2(int value1, int value2){
        //...
    }

    public void stopService(){
        //...destroy/release objects
        stopself();
    }
}

In Aktivität:

public void startService(int value){
    Intent myIntent = new Intent(SampleService.ACTION_START);
    myIntent.putExtra("valueStart",value);
    startService(myIntent);
}

public void serviceDoSomething1(int value1, int value2){
    Intent myIntent = new Intent(SampleService.ACTION_DO_SOMETHING_1);
    myIntent.putExtra("value1",value1);
    myIntent.putExtra("value2",value2);
    startService(myIntent);
}

public void serviceDoSomething2(int value1, int value2){
    Intent myIntent = new Intent(SampleService.ACTION_DO_SOMETHING_2);
    myIntent.putExtra("value1",value1);
    myIntent.putExtra("value2",value2);
    startService(myIntent);
}

public void endService(){
    Intent myIntent = new Intent(SampleService.STOP_SERVICE);
    startService(myIntent);
}

Schließlich in der Manifest-Datei:

<service Android:name=".SampleService">
    <intent-filter>
        <action Android:name="com.yourcompany.yourapp.SampleService.ACTION_START"/>
        <action Android:name="com.yourcompany.yourapp.SampleService.DO_SOMETHING_1"/>
        <action Android:name="com.yourcompany.yourapp.SampleService.DO_SOMETHING_2"/>
        <action Android:name="com.yourcompany.yourapp.SampleService.STOP_SERVICE"/>
    </intent-filter>
</service>
5
Carlos Gómez

Aktivität:

int number = 5;
Intent i = new Intent(this, MyService.class);
i.putExtra("MyNumber", number);
startService(i);

Bedienung:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if (intent != null && intent.getExtras() != null){
        int number = intent.getIntExtra("MyNumber", 0);
    }
}
2
vishalknishad

Dies ist ein viel besserer und sicherer Weg. Arbeiten wie ein Zauber!

   private void startFloatingWidgetService() {
        startService(new Intent(MainActivity.this,FloatingWidgetService.class)
                .setAction(FloatingWidgetService.ACTION_PLAY));
    }

anstatt :

 private void startFloatingWidgetService() {
        startService(new Intent(FloatingWidgetService.ACTION_PLAY));
    }

Wenn Sie den zweiten Versuch ausführen, wird folgende Fehlermeldung angezeigt: Java.lang.IllegalArgumentException: Service Intent muss eindeutig sein: Intent {act = com.floatingwidgetchathead_demo.SampleService.ACTION_START}

Dann wird dein Service so sein:

static final String ACTION_START = "com.floatingwidgetchathead_demo.SampleService.ACTION_START";
    static final String ACTION_PLAY = "com.floatingwidgetchathead_demo.SampleService.ACTION_PLAY";
    static final String ACTION_PAUSE = "com.floatingwidgetchathead_demo.SampleService.ACTION_PAUSE";
    static final String ACTION_DESTROY = "com.yourcompany.yourapp.SampleService.ACTION_DESTROY";

 @SuppressLint("LogConditional")
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    String action = intent.getAction();
    //System.out.println("ACTION: "+action);
    switch (action){
        case ACTION_START:
            Log.d(TAG, "onStartCommand: "+action);
            break;
        case ACTION_PLAY:
            Log.d(TAG, "onStartCommand: "+action);
           addRemoveView();
           addFloatingWidgetView();
            break;
        case ACTION_PAUSE:
            Log.d(TAG, "onStartCommand: "+action);
            break;
        case ACTION_DESTROY:
            Log.d(TAG, "onStartCommand: "+action);
            break;
    }
    return START_STICKY;

}
1
Debasish Ghosh

Service: Startservice kann Nebeneffekte verursachen, die beste Möglichkeit, Messenger zu verwenden und Daten zu übergeben. 

private CallBackHandler mServiceHandler= new CallBackHandler(this);
private Messenger mServiceMessenger=null;
//flag with which the activity sends the data to service
private static final int DO_SOMETHING=1;

private static class CallBackHandler extends Android.os.Handler {

private final WeakReference<Service> mService;

public CallBackHandler(Service service) {
    mService= new WeakReference<Service>(service);
}

public void handleMessage(Message msg) {
    //Log.d("CallBackHandler","Msg::"+msg);
    if(DO_SOMETHING==msg.arg1)
    mSoftKeyService.get().dosomthing()
}
}

Übung: Holen Sie den Messenger von Intent, füllen Sie die Daten aus und geben Sie die Nachricht an den Dienst zurück

private Messenger mServiceMessenger;
@Override
protected void onCreate(Bundle savedInstanceState) {
mServiceMessenger = (Messenger)extras.getParcelable("myHandler");
}


private void sendDatatoService(String data){
Intent serviceIntent= new 
Intent(BaseActivity.this,Service.class);
Message msg = Message.obtain();
msg.obj =data;
msg.arg1=Service.DO_SOMETHING;
mServiceMessenger.send(msg);
}
0
surya

Daten von Activity an IntentService übergeben

So übergebe ich Daten von Activity an IntentService

Eine meiner Anwendung hat dieses Szenario. 

MusicActivity ------ url (String) ------> DownloadSongService

1) Daten senden (Aktivitätscode)

  Intent intent  = new Intent(MusicActivity.class, DownloadSongService.class);
  String songUrl = "something"; 
  intent.putExtra(YOUR_KEY_SONG_NAME, songUrl);
  startService(intent);

2) Daten im Service abrufen (IntentService-Code)
Sie können auf die Absicht mit der Methode onHandleIntent() zugreifen

public class DownloadSongService extends IntentService {

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {

        String songUrl = intent.getStringExtra("YOUR_KEY_SONG_NAME");

        //  Download File logic

    }

}
0
Rohit Singh