Я пробую пример привязанного сервиса в https://developer.android.com/guide/components/bound-services. Точнее говоря, я хочу запустить пример службы, к которому можно получить доступ из другого приложения с помощью мессенджера.
Итак, у меня есть приложение A (сохранило стандартное имя app в студии), которое включает службу (непосредственно скопировано со страницы android):
public class MessengerService extends Service {
/**
* Command to the service to display a message
*/
static final int MSG_SAY_HELLO = 1;
/**
* Handler of incoming messages from clients.
*/
static class IncomingHandler extends Handler {
private Context applicationContext;
IncomingHandler(Context context) {
applicationContext = context.getApplicationContext();
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_SAY_HELLO:
Toast.makeText(applicationContext, "hello!", Toast.LENGTH_SHORT).show();
break;
default:
super.handleMessage(msg);
}
}
}
/**
* Target we publish for clients to send messages to IncomingHandler.
*/
Messenger mMessenger;
/**
* When binding to the service, we return an interface to our messenger
* for sending messages to the service.
*/
@Override
public IBinder onBind(Intent intent) {
Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show();
mMessenger = new Messenger(new IncomingHandler(this));
return mMessenger.getBinder();
}
}
И у меня есть приложение B под названием 'serviceuser' (второй модуль в моем проекте android -studio), которое пытается использовать службу в этом действие (также скопированное со страницы android):
public class ActivityMessenger extends Activity {
/** Messenger for communicating with the service. */
Messenger mService = null;
/** Flag indicating whether we have called bind on the service. */
boolean bound;
/**
* Class for interacting with the main interface of the service.
*/
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
// This is called when the connection with the service has been
// established, giving us the object we can use to
// interact with the service. We are communicating with the
// service using a Messenger, so here we get a client-side
// representation of that from the raw IBinder object.
mService = new Messenger(service);
bound = true;
}
public void onServiceDisconnected(ComponentName className) {
// This is called when the connection with the service has been
// unexpectedly disconnected -- that is, its process crashed.
mService = null;
bound = false;
}
};
public void sayHello(View v) {
if (!bound) return;
// Create and send a message to the service, using a supported 'what' value
Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0);
try {
mService.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected void onStart() {
super.onStart();
// Bind to the service
bindService(new Intent(this, MessengerService.class), mConnection,
Context.BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
super.onStop();
// Unbind from the service
if (bound) {
unbindService(mConnection);
bound = false;
}
}
}
Теперь очевидно, что действие, использующее службу, нуждается в зависимости от приложения-службы, поскольку эта строка
bindService(new Intent(this, MessengerService.class), mConnection,
Context.BIND_AUTO_CREATE);
в противном случае он жалуется, что не может разрешить MessengerService.class.
Но, что бы я ни делал, я не могу решить эту проблему с зависимостями. Вот что я попробовал:
- просто добавьте зависимость, как предложено android studio, которая добавит
"compile project(path:':app')"
в файл 'serviceuser'
gradle (автоматически выполняется студией, если я соглашаюсь) на его предложение), но это как-то полностью нарушает проект, и я получаю еще больше ошибок - , как предлагается в аналогичных постах, я заменил
"compile project(path:':app')"
на "implementation project(path: ':app', configuration: 'default'"
, но затем студия android снова заявляет, что он не знает, MessengerService.class
- пытается переместить MessengerService в модуль класса библиотеки, но затем студия жалуется, что не может разрешить базовый класс Service (я полагаю, что модулю libary просто не хватает необходимой среды приложения)
Чего мне не хватает ?! Хорошо, я мог бы использовать подход AIDL для удаленных служб, но на странице разработчика android прямо говорится, что это более простой способ включить удаленный (то есть, не в том же приложении) доступ к службе.
Любой помощь в этой головоломке очень ценится.
Моя установка:
studio version: 3.5.3
gradle plugin version: 3.5.3
gradle version: 5.4.1