- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
有什么方法可以从 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/
我有一个显示图像的动态壁纸。我在 Activity 中更改了该图像。然后我需要通知动态壁纸,以便它知道重新加载资源。 Intent 似乎是完美、简单的解决方案: Intent intent = new
我试图使带有加速度计的移动位图更平滑,但无意中注意到,当我在 onDraw() 方法末尾调用 invalidate(); 而不是调用它时在 onSensorChanged() 结束时,即使我没有任何类
我正在制作一个简单的 Android 动态壁纸,我正在按照 Hello, Android 的第 12 章作为我的指南。 墙纸服务的基本结构如下所示: public class MyWallpaper
我正在为 Android 开发动态壁纸。代码有效,但我遇到了性能问题。基本上我正在绘制位图并移动它们。有 15 张小图像,效果很好。但是有了 50 张更大的图像,它就开始滞后了。 在我的移动对象中,我
我有一个壁纸类WallpaperService#onCreateEngine(在 init 中,我从 sharedprefs 读取了背景图像和颜色。 现在,如果我启动我的应用程序,我会设置可选择的背景
有什么方法可以从 Activity 直接与 WallpaperService 通信吗? 看起来我无法使用普通服务通信类,因为 onBind 方法在我扩展的 WallpaperService 类中被声明
我正在尝试扩展 android.service.wallpaper.WallpaperService.Engine Kotlin 中的类,但我收到“未解析的引用”错误: 即使上面清楚地导入了它。 有没
长话短说: 我正在使用 WallpaperService 制作动态壁纸,我想从 WebView 绘制它。但是,当我创建 WebView 时,它的宽度和高度为 0,因此除了 WebView 的背景颜色外
我正在尝试将 webview 设置为动态壁纸,但我在调整它的大小时遇到了问题。 在引擎中,我使用 WallpaperService 的上下文创建了一个 webview: public Wallpa
我正在制作动态壁纸。墙纸要求小的可移动图像位于具有透明区域的大的固定图像后面。较小的图像只有在大图像的透明部分时才可见。 到目前为止,我是这样做的: Canvas c = holder.lockCan
我想将文本从 MainActivity 发送到 WallpaperService 类以绘制文本。 主要 Activity 类--> Intent in = new Intent(); in.s
在动态壁纸的开发过程中,我遇到了两个问题,想找到最好的解决方法。 问题#1:WallpaperService.Engine.onSurfaceCreated()和 WallpaperService.E
WallpaperService.Engine.onTouchEvent 在使用动态壁纸时不会收到 ACTION_MOVE 事件,但事件在预览时效果很好。 有没有人遇到过类似的问题并且知道如何解决?
背景 我有一个基于网络的动画,我已经把它变成了一个带有动态壁纸的 Android 应用程序: http://pixfabrik.com/livingworlds/ 我已通过创建 WebView 并定期
我一直在尝试寻找一种方法,将消息从设置 Activity 传递到我的墙纸服务。 在设置中我这样做: Context context = getApplicationContext(); Intent
我正在尝试从自定义 WallpaperService 访问 native 代码中的 Assets 。 native 代码编译并工作,但尝试从传递给 native 函数的 AssetManager 对象
我是一名优秀的程序员,十分优秀!