gpt4 book ai didi

android - 与 WallpaperService 通信

转载 作者:搜寻专家 更新时间:2023-11-01 08:01:21 25 4
gpt4 key购买 nike

有什么方法可以从 Activity 直接与 WallpaperService 通信吗? 看起来我无法使用普通服务通信类,因为 onBind 方法在我扩展的 WallpaperService 类中被声明为 final。值得注意的是,我指的是我的 WallpaperService,而不是任何

如果这不可能,有什么变通办法吗?

最佳答案

我的解决方案是使用本地套接字。我在壁纸的 Engine 的构造函数中创建了一个 LocalServerSocket 的实例。这是一个快速实现。服务器在单独的线程上运行,并直接绑定(bind)到 MyEngine 的生命周期。当 continueSocket 设置为 false 时,线程将停止。这发生在 onDestroy 上。 Problem is that LocalServerSocket.accept() blocks until there's something to do.解决方法是向我们自己的服务器发送一条消息,以便它再次运行循环并检查 continueSocket(现在为 false),关闭服务器。检查 closeSocketServer 方法。我在示例中的 onDestroy 中运行它,但您可能想在其他地方使用它,例如 onSurfaceDestroyed 并添加您自己的完整性检查。

public class MyWallpaperService extends WallpaperService {
@Override
public Engine onCreateEngine() {
return new MyEngine();
}

private class MyEngine extends Engine {

private boolean continueSocket = true;

MyEngine() {
new Thread() {
@Override
public void run() {
try {
LocalServerSocket server = new LocalServerSocket("MyAddress");
Log.d("SERVER READY", "Server is ready.");
while(continueSocket) {
LocalSocket receiver = server.accept();
if(receiver != null) {
InputStream input = receiver.getInputStream();
byte[] data = IOUtils.toByteArray(input);
Log.d("GOT DATA", new String(data));
}
}
server.close();
} catch (IOException ex) {
Log.wtf("IOEXCEPTION", ex);
}
}
}.start();
}

@Override
public void onDestroy() {
closeSocketServer();
super.onDestroy();
}

private void closeSocketServer() {
continueSocket = false;
try {
LocalSocket socket = new LocalSocket();
socket.connect(new LocalSocketAddress("MyAddress"));
socket.getOutputStream().write(new byte[0]);
socket.getOutputStream().close();
socket.close();
} catch (IOException ex) {
//
}
}
}
}

在我的 Activity 中,它可以像这样简单...

try {
LocalSocket sender = new LocalSocket();
sender.connect(new LocalSocketAddress("MyAddress"));
String data = "Hello world!";
Log.d("SENT DATA", data);
sender.getOutputStream().write(data.getBytes());
sender.getOutputStream().close();
sender.close();
} catch (IOException ex) {
Log.wtf("IOEXCEPTION", ex);
}

Logcat 最终看起来像这样:

D/SERVER READY﹕ Server is ready. (when the wallpaper starts up)
D/SENT DATA﹕ Hello world! (when the activity sends data)
D/GOT DATA﹕ Hello world! (when the wallpaper gets the data)

关于android - 与 WallpaperService 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20915926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com