Служба привязки из другого приложения

В приложении, предоставляющем сервис, у меня есть два файла AIDL:

interface ICountTest {
    oneway void count(in INotifierTest test);
}

interface INotifierTest {
   oneway void notify(int count);
}

В основном я хочу считать до Integer.MAX_VALUE в for цикл, а затем передать это значение уведомителю, чтобы он мог показать его визуально в другом приложении

Для этого у меня есть сервис

XML:

<service android:name=".service.TestService"
    android:process=".remote"
    android:exported="true">
    <intent-filter>
        <action android:name="TestService.START_SERVICE" />
    </intent-filter>
</service>

(Я добавил фильтр намерений, чтобы попытаться запустить его с другого подхода)

Джава:

public class TestService extends Service{

   private ICountTest.Stub mBinder;

   @Override
   public void onCreate() {
       super.onCreate();

       mBinder = new ICountTest.Stub() {
           @Override
           public void count(INotifierTest notifier) throws   RemoteException {
               int k = 0;
               for(int i = 0; i < Integer.MAX_VALUE; i++) {
                   k = i;
               }
               notifier.notify(k);
           }
       };
   }

   @Nullable
   @Override
   public IBinder onBind(Intent intent) {
       return mBinder;
   }
}

В моем MainActivity класс я переопределил notify метод:

private INotifierTest.Stub mINotifierTest = new INotifierTest.Stub() {
    @Override
    public void notify(int count) throws RemoteException {
       final String result = String.valueOf(count);
       Log.d("aidl_test", result);
       MainActivity.this.runOnUiThread(new Runnable() {
           @Override
           public void run() {
               Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();
           }
       });
    }
};

Я зову count метод в onServiceConnected:

 private ServiceConnection mServiceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        mCountTest = ICountTest.Stub.asInterface(iBinder);
        try {
            Log.d("aidl_test", Thread.currentThread().getName());
            mCountTest.count(mINotifierTest);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName componentName) {

    }
};

Но когда мне нужно запустить его из другого приложения, например, так:

Intent i = new Intent();
i.setComponent(new ComponentName("com.xxx.xxx", "com.xxx.xxxx.service.TestService"));
getActivity().bindService(i, mServiceConntection, Context.BIND_AUTO_CREATE);

Я должен предоставить свой собственный ServiceConnection класс, который будет переопределять необходимую функциональность, я получаю связку, но в основном у меня есть только имя класса для необходимого интерфейса и, следовательно, я ничего не могу с этим поделать. Я также пытался просто startService но, по логике, это не сработает.

Я думаю, что я делаю что-то действительно неправильно, пожалуйста, помогите мне понять.

Моя цель: бежать count метод из TestService связующего в другом приложении, и увидеть Toast а также Log с результатом.

РЕДАКТИРОВАТЬ: я пытался создать те же файлы AIDL с тем же пакетом и кодом, что и в первом приложении, и использовать их, но это не работает.

РЕДАКТИРОВАТЬ: Wow это была моя вина, я просто переопределил не INotifierTest.Stub, но просто INotifierTestСпасибо всем за помощь

0 ответов

Другие вопросы по тегам