Служба привязки из другого приложения
В приложении, предоставляющем сервис, у меня есть два файла 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
Спасибо всем за помощь