【问题标题】:Android - WallpaperService why does my Engine have to be a inner class?Android - WallpaperService 为什么我的引擎必须是内部类?
【发布时间】:2010-08-16 14:55:21
【问题描述】:

我正在制作一个简单的 android 动态壁纸,我将按照 Hello, Android 的第 12 章作为我的指南。

壁纸服务的基本结构如下所示:

public class MyWallpaper extends WallpaperService {

    private class MyEngine extends Engine {
    //...
    }        

    //...

}

根据本书MyEngine 必须MyWallpaper 的内部类。我没有理由对此提出异议,但这本书没有解释为什么必须如此。我不喜欢纯粹出于风格/美学原因使用内部类。

我想知道MyEngine 是否真的必须是私有内部类,如果是,为什么?

【问题讨论】:

    标签: android inner-classes wallpaper


    【解决方案1】:

    您应该这样做,因为class Engine 嵌套在abstract class WallpaperService 中。如果你试图让它不嵌套,你的 IDE/编译器会告诉你这样的事情:

    没有封闭类型的实例 WallpaperService 可访问 调用超级构造函数。必须 定义一个构造函数并显式 限定其超级构造函数 调用实例 WallpaperService(例如 x.super() 其中 x 是 WallpaperService 的一个实例)。

    粗略的翻译,意思是“你可以那样做,但结果会比你只使用嵌套类更难看。”

    【讨论】:

    • 实际上它说你不能那样做,本质上如果你不能使用 WallpaperService.this 来引用父 WallpaperService 实例,那么它就不会在动态壁纸框架的限制下运行。跨度>
    【解决方案2】:

    你可以将你的引擎放在一个单独的类中。我刚刚用我自己的壁纸试了一下,它编译并运行良好。

    在您的 WallpaperService 子类的 onCreateEngine() 覆盖中,只需将“this”传递给您的引擎构造函数。构造函数应将其作为 WallpaperService 接收。在构造函数的第一行,调用 wallpaperSvcObject.super()。

    编辑:在考虑了 Justin Buser 所说的话之后,我不确定我的建议是否正确。您的引擎将失去对 WallpaperService 成员的访问权限,因为它都必须通过 wallpaperSvcObject。不知道他说的是不是这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多