Intereting Posts
Файл конфигурации Android Studio ORMLite – не удалось найти Raw Directory Как загрузить файлы (pdf, doc и т. Д.) В SDCard и открыть файл с помощью volley in android? Как создать выпадающее меню, подобное этому в приложении Evernote? ClassCastException в support-library-v7, используя версию 21 Границы видового экрана на любом разрешении с OpenGL ES Android – Как запустить намерение с помощью JavaScript MediaRecorder.stop () висит на Samsung Galaxy Camera Получить идентификатор ресурса от имени Выравнивание текстовых изображений на левом и правом краях в макете Android Ошибка установки: INSTALL_FAILED_INSUFFICIENT_STORAGE? Во время запуска эмулятора База данных sqlite на персидском языке Отправить снятое изображение на веб-сервер в android Биллинг в приложениях Android: пустые данные, полученные после покупки Связь P2P NFC между галактикой S3 и ACR122 Как добавить пользовательский тег приложения в приложение для подключения к родному андроиду?

Почему эти функции абстрактны, где найти тело (конкретную реализацию) из них?

Скриншот

Я хочу знать реализацию функции getPackageInfo (потому что я хочу знать, где хранится пакет, на который они ссылаются), поэтому я пошел к этому, чтобы увидеть исходный код, но нашел там только абстрактный метод.

 public abstract PackageInfo getPackageInfo(String packageName, int flags) throws NameNotFoundException; 

Где реализуется метод?

Реализация метода getPackageInfo находится в com.android.server.pm.PackageManagerService

  @Override public PackageInfo getPackageInfo(String packageName, int flags, int userId) { // reader synchronized (mPackages) { PackageParser.Package p = mPackages.get(packageName); if (DEBUG_PACKAGE_INFO) Log.v(TAG, "getPackageInfo " + packageName + ": " + p); if (p != null) { return generatePackageInfo(p, flags); } if((flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0) { return generatePackageInfoFromSettingsLPw(packageName, flags, userId); } } return null; } 

Вы можете посмотреть здесь

Если вы просто посмотрите на документы для PackageManager , вы увидите, что у него есть прямой подкласс MockPackageManager . Это конкретный класс, поэтому он должен содержать реализацию метода getPackageInfo . Но если вы посмотрите ближе, в нем говорится, что все методы класса бросают UnsupportedOperationException !

В документах говорится, что вы сами реализуете это поведение, не так ли? Затем сделать его! Это точка абстрактных методов, позволяющая людям создавать пользовательские реализации!

Но почему ваш код работает?

Я думаю, наиболее вероятным объяснением является то, что метод getPackageManager в вашем коде возвращает анонимный класс, который расширяет MockPackageManager или MockPackageManager и обеспечивает реализацию там. Вы можете посмотреть источник getPackageManager помощью getPackageManager управления + щелчок на имени метода в Android Studio на Windows. В OS X это должно быть команда + клик.