Android: передать параметр службе из Activity
Я привязываюсь к Сервису таким образом:
Класс действия:
ListenLocationService mService;
@Override
public void onCreate(Bundle savedInstanceState) {
...
Intent intent = new Intent(this, ListenLocationService.class);
intent.putExtra("From", "Main");
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
...
}
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className,
IBinder service) {
LocalBinder binder = (LocalBinder) service;
mService = binder.getService();
}
public void onServiceDisconnected(ComponentName arg0) {
}
};
Это метод onBind
моей службы:
@Override
public IBinder onBind(Intent intent) {
Bundle extras = intent.getExtras();
if(extras == null)
Log.d("Service","null");
else
{
Log.d("Service","not null");
String from = (String) extras.get("From");
if(from.equalsIgnoreCase("Main"))
StartListenLocation();
}
return mBinder;
}
Итак, у меня есть "null" в LogCat
- пакет равен null, несмотря на то, что я сделал intent.putExtra
до bindService
В общем Сервис отлично работает. Однако мне нужно вызвать StartListenLocation();
только из основного действия приложения (я решил сделать это, отправив флаг).
Как я могу отправить данные для обслуживания? Или, может быть, есть еще один способ проверить, какая активность запущена onBind
?
Ответы
Ответ 1
1 Создайте интерфейс, объявляющий всю сигнатуру метода, которую вы хотите вызвать из Activity:
public interface ILocationService {
public void StartListenLocation(Location location);
}
2 Сделайте свой связующий инструмент ILocaionService и определите фактическое тело метода:
public class MyBinder extends Binder implements ILocationService {
... ...
public void StartListenLocation(Location location) {
// implement your method properly
}
... ...
}
3 В операции, связанной с сервисом, обратитесь к своему связующему по интерфейсу:
... ...
ILocationService mService; // communication is handled via Binder not the actual service class.
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
mService = (ILocationService) service;
}
... ...
};
... ...
// At some point if you need call service method with parameter:
Location location = new Location();
mService.StartListenLocation(location);
Все сообщения (т.е. вызов метода вашей службе) должны обрабатываться и выполняться с помощью класса связующего класса инициализироваться и возвращаться в ServiceConnection.onServiceConnected(), а не для фактического класса обслуживания (binder.getService() не требуется). Вот как связывает сервисную связь, предназначенную для работы в API.
Обратите внимание, что bindService() является асинхронным вызовом. После вызова функции bindService() произойдет задержка, и до того, как обратный вызов ServiceConnection.onServiceConnected() будет задействован системой. Поэтому наилучшим местом для выполнения сервисного метода является сразу после инициализации mService в методе ServiceConnection.onServiceConnected().
Надеюсь, что это поможет.
Ответ 2
Вы можете передать параметр таким простым способом: -
Intent serviceIntent = new Intent(this,ListenLocationService.class);
serviceIntent.putExtra("From", "Main");
startService(serviceIntent);
и получить параметр в методе onStart вашего класса обслуживания
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Bundle extras = intent.getExtras();
if(extras == null)
Log.d("Service","null");
else
{
Log.d("Service","not null");
String from = (String) extras.get("From");
if(from.equalsIgnoreCase("Main"))
StartListenLocation();
}
}
Наслаждайтесь:)
Ответ 3
Согласно этой сессии
http://www.google.com/events/io/2010/sessions/developing-RESTful-android-apps.html
Одним из способов отправки данных в службу является использование базы данных, содержащей столбцы pid (идентификатор процесса), данные, статус, в котором статус может быть READ, READY, BINDING и т.д., когда служба загружается, она считывает таблицу, которая заполняется вызывающей активностью и может быть удалена по завершении, указанным другим способом является AIDL, как указано в предыдущем ответе, выберите в соответствии с вашим приложением.