在app中,提供服务我有两个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>
(我添加了意图过滤器,尝试从不同的方法启动它)
的java:
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文件,并使用它们,但它不起作用。
编辑:哇,这是我的错,我只是覆盖了INotifierTest.Stub
,而只是INotifierTest
,感谢大家的帮助