2011-01-30 3 views

ответ

1

Один из способов сделать это - определить интерфейс с помощью Android's AIDL и использовать подсистему Binder для выполнения IPC. В ссылке, которую я опубликовал, есть большой набор инструкций. Я бы начал там, а затем разместил здесь, если у вас есть вопросы. Несмотря на то, что это довольно сложная тема (IPC), Android и Binder делают действительно хорошую работу, делая ее довольно простой (по крайней мере, для начала, я уверен, что вы можете усложнить, если хотите ;-))

Редактировать Как указано в комментариях, это необязательно, если Service и клиент работают в одном процессе. Если вы не укажете иное, это значение по умолчанию. Тем не менее, он по-прежнему работает независимо, он просто добавляет немного сложнее.

+0

ваша ссылка не работает ... –

+0

@RajaReddyPolamReddy спасибо! Я починил это. –

+1

AIDL требуется только в том случае, если служба и деятельность находятся в разных приложениях. Если ваш сервис и активность являются локальными для вашего приложения (что является общим случаем), см. Ответ от @hackbod – odedfos

0

Я не знаю, где ваша проблема, пожалуйста, разместите код. С помощью связующего объекта Activity может иметь доступ к объекту службы. См. Примеры в API для создания соединения между активностью и сервисом.

Имея объект обслуживания в своей деятельности, вы можете просто позвонить:
mService.yourMethod();
Мы могли бы помочь вам намного лучше, если бы вы точно описали свою проблему, и, как я уже сказал, разместите несколько фрагментов.

+4

Почему вы не поставить некоторые ссылки на полезные ресурсы? Опубликовать некоторые фрагменты скелета о том, как связать службу и вызвать ее метод впоследствии? :) – Juri

+0

@Juri http://stackoverflow.com/questions/1916253/bind-service-to-activity-in-android из ниоткуда он был связан – CrandellWS

24

Существует пример кода для этого права в сервисной документации, в разделе «Local Sample Service»:

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

Кроме того, для тех людей, предлагая aidl - если ваш сервис и клиент являются частью вашего собственный .apk и работает в одном и том же процессе (поведение по умолчанию), нет необходимости в помощи; это просто дополнительная сложность, которая не дает вам ничего.

35

Вот пример, который может помочь
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

отличный ответ ... – Opiatefuchs

+0

Если служба остановлена, я получу вызов onServiceDisconnected? –

+9

Почему это так чертовски сложно назвать простым fuction –