Android - WallpaperService, почему мой Engine должен быть внутренним классом? - PullRequest
4 голосов
/ 16 августа 2010

Я работаю над простыми живыми обоями для Android, я следую главе 12 из Здравствуйте, Android в качестве руководства.

Основы сервиса обоев выглядят так:

public class MyWallpaper extends WallpaperService {

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

    //...

}

Согласно книге MyEngine должен быть внутренним классом MyWallpaper.У меня нет причин оспаривать это, но книга не дает объяснения, почему это должно быть так.Я предпочитаю не использовать внутренние классы исключительно по стилистическим / эстетическим причинам.

Мне было интересно, действительно ли MyEngine должен быть частным внутренним классом, и если да, то почему?

Ответы [ 2 ]

4 голосов
/ 16 августа 2010

Вы должны сделать это таким образом, потому что class Engine вложено в abstract class WallpaperService. Если вы попытаетесь сделать его не вложенным, ваш IDE / компилятор скажет вам что-то вроде этого:

Нет включающего экземпляра типа WallpaperService доступен для вызвать супер конструктор. Должен определить конструктор и явно квалифицировать его супер конструктор вызов с экземпляром WallpaperService (например, x.super () где x является экземпляром WallpaperService).

Что в переводе означает, что «вы могли бы сделать это таким образом, но в конечном итоге это будет хуже, чем если бы вы просто использовали вложенный класс».

0 голосов
/ 03 апреля 2013

Вы МОЖЕТЕ иметь свой Двигатель в отдельном классе. Я только попробовал это с моими собственными обоями, и он скомпилирован и работает нормально.

В переопределении onCreateEngine () в своем подклассе WallpaperService просто передайте this для конструктора Engine. Конструктор должен получить его как WallpaperService. В первой строке вашего конструктора вызовите wallpaperSvcObject.super ().

РЕДАКТИРОВАТЬ: После размышления о том, что сказал Джастин Бузер, я не уверен, что мой совет хорош. Ваш движок потерял бы доступ к членам WallpaperService, потому что все это должно проходить через wallpaperSvcObject. Я не знаю, имел ли он в виду это.

...