我在Android上使用网络服务发现(NSD)在设备上宣传REST服务器.我的REST服务器包含在android.app.Service的一个实例中.
在onCreate,我成功启动REST服务器并注册我的NSD服务.我可以在我的网络中的其他设备上看到NSD服务名称(例如我的服务).
在我onDestroy,我停止REST服务器并取消注册NSD服务.
但是,似乎在开发时,当我推送我的应用程序的新实例(通过Eclipse)时,无法保证onDestroy将调用该服务.这意味着我的服务仍在广告中,下次服务开始时,我最终得到我的服务(1),我的服务(2)等.
据我所知,NSD将修改服务名称以创建一个唯一的实例.我的问题是:
onDestroy当我推送我的应用程序的新实例时,有没有办法确保我被调用?这种情况是否与用户在安装我的应用程序更新时可能遇到的情况类似?ie是否onDestroy保证在正在运行的应用程序关闭时调用,以便可以安装该应用程序的新版本?我正在使用大型遗留C++代码库,其中包含许多IDL文件,这些文件具有在任何模块之外声明的所有类型和常量.
对于C++,这会导致代码生成到全局命名空间 - 丑陋但可以接受.
现在我正在尝试添加Java客户端以通过CORBA进行连接.但是,对于Java,从IDL生成的类型(使用适用于java的Sun/Oracle IDL编译器:idlj)位于java 默认包中,因为它们不在IDL模块中.这会导致Java编译错误,因为从默认包导入是非法的.
我正在寻找解决问题的最简单方法.
我考虑过以下几点:
我发现如果没有包含所有类型的现有模块,很难相信没有简单的方法强制IDL在Java包中.我希望我只是错过了显而易见的事!
编辑:
例:
Foo.idl
struct Foo
{
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
Foo.java :( 注意没有指定包,这意味着默认包):
public final class Foo implements org.omg.CORBA.portable.IDLEntity
{
.
.
.
}
Run Code Online (Sandbox Code Playgroud)
ClassUsesFoo.java:
package com.sigh;
import Foo; // <-- this is an error
public class ClassUsesFoo
{
private Foo f;
};
Run Code Online (Sandbox Code Playgroud)