问题描述
我正在尝试关闭蓝牙服务,但是Bluecove在连接关闭方法上有错误( https://code.google.com/p/bluecove/issues/detail?id=90 ),我正在尝试一些解决方法以重新启动服务.我认为重新启动蓝牙堆栈可以解决我的问题.我可以通过编程方式进行吗?我正在使用Microsoft蓝牙堆栈.
I'm trying to close bluetooth service, but Bluecove has bug on Connection close method (https://code.google.com/p/bluecove/issues/detail?id=90) and I am trying to do some workaround to restart service. I think restarting bluetooth stack will solve my problem. Can I do it programmatically? I'am using microsoft bluetooth stack.
推荐答案
以这种方式解决的问题.
Problem solved in this way.
我重新启动应用程序,但是首先手动关闭bluecove.
I restart the application, but firstly shut down bluecove manually.
BlueCoveImpl.shutdown();
如果我仅重新启动应用程序,bluecove将关闭,但无法在启动过程中初始化蓝牙堆栈.这是重启方法:
If I only restart application, bluecove shut down, but cannot initialize bluetooth stack during start. Here is restart method:
public static void restartApplication(Runnable runBeforeRestart)
throws IOException
{
try
{
// java binary
String java = System.getProperty("java.home") + "/bin/java";
// vm arguments
List<String> vmArguments = ManagementFactory.getRuntimeMXBean()
.getInputArguments();
StringBuffer vmArgsOneLine = new StringBuffer();
for (String arg : vmArguments)
{
// if it's the agent argument : we ignore it otherwise the
// address of the old application and the new one will be in
// conflict
if (!arg.contains("-agentlib"))
{
vmArgsOneLine.append(arg);
vmArgsOneLine.append(" ");
}
}
// init the command to execute, add the vm args
final StringBuffer cmd = new StringBuffer("\"" + java + "\" "
+ vmArgsOneLine);
// program main and program arguments
String[] mainCommand = System.getProperty(SUN_JAVA_COMMAND).split(
" ");
// program main is a jar
if (mainCommand[0].endsWith(".jar"))
{
// if it's a jar, add -jar mainJar
cmd.append("-jar " + new File(mainCommand[0]).getPath());
}
else
{
// else it's a .class, add the classpath and mainClass
cmd.append("-cp \"" + System.getProperty("java.class.path")
+ "\" " + mainCommand[0]);
}
// finally add program arguments
for (int i = 1; i < mainCommand.length; i++)
{
cmd.append(" ");
cmd.append(mainCommand[i]);
}
// execute the command in a shutdown hook, to be sure that all the
// resources have been disposed before restarting the application
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run()
{
try
{
Runtime.getRuntime().exec(cmd.toString());
}
catch (IOException e)
{
e.printStackTrace();
}
}
});
// execute some custom code before restarting
if (runBeforeRestart != null)
{
runBeforeRestart.run();
}
// at first shut down BlueCove manually
BlueCoveImpl.shutdown();
System.exit(0);
}
catch (Exception e)
{
// something went wrong
throw new IOException(
"Error while trying to restart the application", e);
}
}
这篇关于Bluecove:以编程方式重新启动蓝牙堆栈的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!