Я просто хочу вызвать методы локальной службы из своей деятельности. Как я могу это сделать ?Как вызвать методы Сервиса из активности?
ответ
Один из способов сделать это - определить интерфейс с помощью Android's AIDL и использовать подсистему Binder
для выполнения IPC. В ссылке, которую я опубликовал, есть большой набор инструкций. Я бы начал там, а затем разместил здесь, если у вас есть вопросы. Несмотря на то, что это довольно сложная тема (IPC), Android и Binder
делают действительно хорошую работу, делая ее довольно простой (по крайней мере, для начала, я уверен, что вы можете усложнить, если хотите ;-))
Редактировать Как указано в комментариях, это необязательно, если Service
и клиент работают в одном процессе. Если вы не укажете иное, это значение по умолчанию. Тем не менее, он по-прежнему работает независимо, он просто добавляет немного сложнее.
Я не знаю, где ваша проблема, пожалуйста, разместите код. С помощью связующего объекта Activity может иметь доступ к объекту службы. См. Примеры в API для создания соединения между активностью и сервисом.
Имея объект обслуживания в своей деятельности, вы можете просто позвонить:
mService.yourMethod();
Мы могли бы помочь вам намного лучше, если бы вы точно описали свою проблему, и, как я уже сказал, разместите несколько фрагментов.
Почему вы не поставить некоторые ссылки на полезные ресурсы? Опубликовать некоторые фрагменты скелета о том, как связать службу и вызвать ее метод впоследствии? :) – Juri
@Juri http://stackoverflow.com/questions/1916253/bind-service-to-activity-in-android из ниоткуда он был связан – CrandellWS
Существует пример кода для этого права в сервисной документации, в разделе «Local Sample Service»:
http://developer.android.com/reference/android/app/Service.html#LocalServiceSample
Кроме того, для тех людей, предлагая aidl - если ваш сервис и клиент являются частью вашего собственный .apk и работает в одном и том же процессе (поведение по умолчанию), нет необходимости в помощи; это просто дополнительная сложность, которая не дает вам ничего.
Вот пример, который может помочь
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;
}
};
}
отличный ответ ... – Opiatefuchs
Если служба остановлена, я получу вызов onServiceDisconnected? –
Почему это так чертовски сложно назвать простым fuction –
ваша ссылка не работает ... –
@RajaReddyPolamReddy спасибо! Я починил это. –
AIDL требуется только в том случае, если служба и деятельность находятся в разных приложениях. Если ваш сервис и активность являются локальными для вашего приложения (что является общим случаем), см. Ответ от @hackbod – odedfos