Вернуть другой Binder из уже привязанного сервиса - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть служба, которая уже связана внешним приложением через AIDL.

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

(псевдокод) выглядит следующим образом:

class MyService extends Service{
    public IBinder onBind(Intent intent){
        if (intent.hasExtra("LocalBindingRequest")){
            return getLocalBinder();
        else {
           return getAidlBinder();
        }
    }
}

class ExternalApp extends Activity{
    void someFunc(){
        Intent i = new Intent(new ComponentName("com.my.pkg", "com.my.pkg.MyService");
        bindService(i, myServiceConnection, Context.BIND_AUTO_CREATE);
    }
}

class InternalApp extends Activity{
    MyService mService;

    void someFunc(){
        Intent i = new Intent(new ComponentName("com.my.pkg", "com.my.pkg.MyService")
           .putExtra("LocalBindingRequest", true);
        bindService(i, myServiceConnection, Context.BIND_AUTO_CREATE);
    }

    public void onServiceConnected(ComponentName cn, IBinder service){
        InternalBinder ib = (LocalBinder)service;
        mService = ib.getService();

    }
}

Поток выглядит так:

  • ExternalApp привязывается к AidlBinder
  • ExternalAppвызывает функцию, которая требует, чтобы служба запустила действие
  • служба запускает действие
  • Внутренняя активность пытается связать
  • Я получаю исключение (по-видимому, не достигнув точки останова в onBind илиonServiceConnected)

java.lan.ClassCastException: AidlService не может быть приведен к InternalBinder


Служба не может вернутьсядругой Binder?

Если нет, то что я могу сделать, чтобы передать Результат обратно в MyService, который уже связан?

1 Ответ

0 голосов
/ 11 апреля 2019

Хорошо, я должен был прочитать документы в onBind(Intent)

Намерение: Намерение, которое использовалось для привязки к этой услуге, как дано Context.bindService. Обратите внимание, что любые дополнения, которые были включены в Намерение в этой точке здесь не будет видно.

Вот почему мне дали Службу Эйдля. Исправление будет:

class InternalApp extends Activity{
    MyService mService;

    void someFunc(){
        Intent i = new Intent(new ComponentName("com.my.pkg", "com.my.pkg.MyService");
        i.setAction("LocalBindingRequest");
        bindService(i, myServiceConnection, Context.BIND_AUTO_CREATE);
    }

    public void onServiceConnected(ComponentName cn, IBinder service){
        InternalBinder ib = (LocalBinder)service;
        mService = ib.getService();

    }
}


class MyService extends Service{
    public IBinder onBind(Intent intent){
        if ("LocalBindingRequest".equals(intent.getAction()){
            return getLocalBinder();
        else {
           return getAidlBinder();
        }
    }
}

И мы можем иметь отдельные связыватели для каждого запроса связывания

...