Resolveinfo android что это

Somethings

problems and solutions

суббота, 1 октября 2011 г.

Работа с пакетами в Android

Мне время от времени приходится решать задачи, связанные с работой с пакетами в Android. В этой статье я приведу несколько сниппетов для решения этих задач.

AndroidManifest

В любом приложении под Android есть файл AndroidManifect.xml . В нём публикуется вся необходимая системе информация о приложении и его компонентах. Кроме того, при необходимости можно обратиться к системе и получить эти данные. Для этого в SDK существует класс PackageManager .

Объектная модель

Объектная модель манифеста содержится в пакете android.content.pm . Обозначу несколько классов:

PackageInfo Содержит данные о пакете приложения. Здесь: список активностей, сервисов, разрешений, имя и версия пакета и прочая информация, опубликованная в манифесте. ComponentInfo Базовый класс для хранения информации о различных компонентах приложения: активности ( ActivityInfo ), сервиса ( ServiceInfo ), контент-провайдера ( ProviderInfo ) ResolveInfo Класс для хранения информации об интентах, соответствующих компонентам приложения

PackageManager

Получить экземпляр PackageManager можно с помощью метода getPackageManager контекста. Обозначу методы этого класса, которые будут использоваться в статье:

PackageInfo getPackageInfo(String packageName, int flags) Возвращает данные об установленном приложении с заданным packageName. Если приложение не установлено, будет выброшено исключение. List queryIntentActivities(Intent intent, int flags) Возвращает список активностей, соответствующих заданному Intent-у.

Проверка существования приложения в системе

Это наиболее часто встречающаяся задача. Нужно узнать, установлено ли в системе приложение с заданным package name.

Не самое изящное решение, но единственно возможное.

Запуск приложения

С помощью этой копипасты можно запустить приложение с заданным package name:

Тут дело такое. Мы запускаем приложение при помощи метода startActivity , и потому обязательно должны указать имя класса активности, который должен быть запущен. Но внутренняя структура приложения может быть нам незнакома. Поэтому мы сначала формируем Intent , указав ему имя пакета, категорию CATEGORY_LAUNCHER и экшен ACTION_MAIN (необходимые значения для главной активности приложения), а потом получаем список всех возможных активностей с помощью вызова метода queryIntentActivities . В результате либо ничего не будет, либо будет всего одна активность. Имя этой активности мы и зададим как className нашему intent-у. А после этого его и запускать можно.

Проверка наличия Android Market

Бывает, что хочется узнать, установлен ли в системе маркет. Тут возможно два решения:

  1. По предложенной выше схеме проверить пакет com.google.process.gapps . Однако, не могу утверждать, что такое решение будет работать на всех устройствах.
  2. Решение, предложенное на Stackoverflow:

Заключение

Мы кратко разобрали наиболее часто встречающиеся задачи, связанные с работой менеджера пакетов. Исходников не прилагаю, ибо вся полезная копипаста и так в статье.

Источник

Как я одной кнопкой шарил разные данные в Android приложении

Как-то раз передо мной встала задача добавить экспорт в календарь к уже написанному экспорту обычных текстовых данных через ShareActionProvider кнопку. Сходу нашлись несколько вариантов, каждый из которых мне по каким-либо причинам не подходил.

SO 1 предлагал мне изменить MIME тип с «text/plain» на «*/*», чтобы охватить большее число установленных приложений. Это добавило очень много лишних приложений, и нужные терялись в море ненужных. Были предложения использовать библиотеки, также, SO предлагал создать свой собственный Intent Chooser, и в нём реализовать логику выбора, какие данные надо экспортировать. Мне не хотелось использовать диалоговое окно только для того, чтобы можно было выбирать из нескольких типов приложений — и я решил разобраться с исходниками ShareActionProvider.

Копание в исходниках:

Первым делом, мой взгляд упал на метод setShareIntent, который принимал собранный Intent с данными для экспорта. А что, если можно сделать универсальный intent, спросил я себя и ринулся искать, как объединить два интента в один, да ещё и с разными действиями (Intent.ACTION_INSERT и Intent.ACTION_SEND). Ни одно решение, что я нашёл (не так уж и глубоко я копал, если честно), поэтому я решил подсмотреть, что делается под капотом класса ShareActionProvider. Забегая вперёд, скажу, что получая от гугла исходники 2 , находя классы, работающие с нашим интентом, и повторяя шаги 1 и 2 несколько раз я выяснил, что всем заведуют три класса: собственно, ShareActionProvider, ActivityChooserView и ActivityChooserModel. Последние два отвечают за выбор нужных для нашего интента приложений, создания выпадающего списка и обработки выбора списка.

Само решение проблемы я решил начать с изменения типа данных, которые я буду передавать в setShareIntent(). По логике вещей, если я хочу экспортировать больше разных данных — мне нужны больше интентов и, следовательно, первое решение, которое приходит в голову — это использовать массив:

Первый шаг пройден, первый метод изменён, идём дальше по цепочке. Следующая проблема проявилась в объекте dataModel. Он (или она, модель) никак не хочет брать наш массив. Что поделать, идём внутрь ActivityChooserModel.get() и смотрим, что мы можем изменить там:

На самом деле, в этом методе мы изменили только название класса с ActivityChooserModel на наше. Отсюда наш путь идёт через sDataModelRegistry в метод get(), но sDataModelRegistry — это всего лишь множество Map, которое возвращает нам объект типа ActivityChooserModel. Замкнутый круг. Выходим из мысленного цикла и пробуем другой подход -> если dataModel — это объект типа ActivityChooserModel, значит, у него есть метод setIntent(). Нам остаётся (слишком наивно) только изменить тип его входного параметра на массив:

Продолжаем раскопки. Добавляем в нашу углеродную форму стека ещё один метод ensureConsistentState(), и погружаемся в него с головой для правки и находим два метода — loadActivitiesIfNeeded() и sortActivitiesIfNeeded(). Это как раз те, которые нам надо поправить. Мысленно надеемся, что тенденция не продолжится, и мы не закончим с шестнадцатью методами на пятом шаге.

Начинаем с первого метода:

Продвигаемся к методу сортировки, тут всё просто, добавляем цикл по массиву вместо единичного элемента. Теперь мы знаем, что всё у нас хранится в множестве, поэтому никаких входных параметров метода не требуется:

Чистим код за собой

Осматриваемся. У нас появились ещё методы, которые несогласны с нашими изменениями: getActivity(), getActivityIndex(), всё тот же chooseActivity(), уже с новой ошибкой, дальше — getDefaultActivity() и setDefaultActivity(). Посмотрев ближе — видим, что они ругаются только на изменения типа mActivities с ArrayList на LinkedHashMap, делов то:

Добавим метод для получения ActivityResolveInfo по индексу

Этот метод нам ещё поможет. После этого меняем:

Вспоминаем, что уже сделано, а что осталось:

  • getIntent()
  • sortActivitiesIfNeeded()
  • loadActivitiesIfNeeded()
  • getActivity()
  • getDefaultActivity()
  • setDefaultActivity()
  • getActivityIndex()
  • chooseActivity()

Займёмся дефолтными активити. Надо приспособить их для использования Map:

В методе setDefaultActivity() мы только берём ArrayList по первому ключу:

Что касается getDefaultActivity():

Нам надо получить первый элемент первого ключа:

Остаются два метода: getActivityIndex() и chooseActivity().

Чтобы получить индекс активити — нам надо взять строку

И расписать всё то же, только с несколькими ArrayList, которые мы держим в mActivities:

Теперь нам надо выбирать активити, изменений немало, поэтому приведу весь метод, простите за кучу кода 🙁

ActivityChooserView

Не устали? А ведь ActivityChooserView на пути!

Но всем нам повезло. В нашем искуственном ActivityChooserView нам надо только поменять все ActivityChooserModel на CustomActivityChooserModel. Если учесть, что само ActivityChooserView изменится на CustomActivityChooserView.

Тестирование

Теперь нам надо подготовить данные, которые мы хотим экспортировать:

Мини пример работы:

По такому же принципу можно использовать не только два, но больше интентов для разных типов данных, которыми мы хотим поделиться с приложениями-соседями на нашем или пользовательском устройстве.

Любые правки или предложения принимаются 24/7 в личке или в комментариях (на ваш страх и риск).

Источник

Resolve Info Class

Definition

Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.

Information that is returned from resolving an intent against an IntentFilter.

Remarks

Portions of this page are modifications based on work created and shared by the Android Open Source Project and used according to terms described in the Creative Commons 2.5 Attribution License.

Constructors

A constructor used when creating managed representations of JNI objects; called by the runtime.

Properties

The activity or broadcast receiver that corresponds to this resolution match, if this resolution is for an activity or broadcast receiver.

Returns the runtime class of this Object .

(Inherited from Object) Creator Filter

The IntentFilter that was matched for this ResolveInfo.

The handle to the underlying Android instance.

(Inherited from Object) Icon

A drawable resource identifier (in the package’s resources) of this match’s icon.

Return the icon resource identifier to use for this match.

Returns whether this resolution represents the intent forwarder activity.

This filter has specified the Intent.

Whether or not an instant app is available for the resolved intent.

A string resource identifier (in the package’s resources) of this match’s label.

The system’s evaluation of how well the activity matches the IntentFilter.

The actual string retrieve from labelRes or null if none was provided.

Order of result according to the user’s preference.

The declared priority of this match.

The provider that corresponds to this resolution match, if this resolution is for a provider.

Optional — if non-null, the #labelRes and #icon resources will be loaded from this package, rather than the one containing the resolved component.

The service that corresponds to this resolution match, if this resolution is for a service.

This API supports the Mono for Android infrastructure and is not intended to be used directly from your code.

This API supports the Mono for Android infrastructure and is not intended to be used directly from your code.

Methods

Creates and returns a copy of this object.

(Inherited from Object) DescribeContents()

Describe the kinds of special objects contained in this Parcelable’s marshalled representation.

Dispose() (Inherited from Object) Dispose(Boolean) (Inherited from Object) Dump(IPrinter, String) Equals(Object)

Indicates whether some other object is «equal to» this one.

(Inherited from Object) GetHashCode()

Returns a hash code value for the object.

(Inherited from Object) JavaFinalize()

Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.

(Inherited from Object) LoadIcon(PackageManager)

Retrieve the current graphical icon associated with this resolution.

Retrieve the current textual label associated with this resolution.

Retrieve the current textual label associated with this resolution.

Wakes up a single thread that is waiting on this object’s monitor.

(Inherited from Object) NotifyAll()

Wakes up all threads that are waiting on this object’s monitor.

(Inherited from Object) SetHandle(IntPtr, JniHandleOwnership)

Sets the Handle property.

(Inherited from Object) ToArray () (Inherited from Object) ToString()

Returns a string representation of the object.

(Inherited from Object) UnregisterFromRuntime() (Inherited from Object) Wait()

Causes the current thread to wait until another thread invokes the java.lang.Object#notify() method or the java.lang.Object#notifyAll() method for this object.

(Inherited from Object) Wait(Int64)

Causes the current thread to wait until another thread invokes the java.lang.Object#notify() method or the java.lang.Object#notifyAll() method for this object.

(Inherited from Object) Wait(Int64, Int32)

Causes the current thread to wait until another thread invokes the java.lang.Object#notify() method or the java.lang.Object#notifyAll() method for this object.

(Inherited from Object) WriteToParcel(Parcel, ParcelableWriteFlags)

Flatten this object in to a Parcel.

Explicit Interface Implementations

IJavaPeerable.Disposed() (Inherited from Object)
IJavaPeerable.DisposeUnlessReferenced() (Inherited from Object)
IJavaPeerable.Finalized() (Inherited from Object)
IJavaPeerable.JniManagedPeerState (Inherited from Object)
IJavaPeerable.SetJniIdentityHashCode(Int32) (Inherited from Object)
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) (Inherited from Object)
IJavaPeerable.SetPeerReference(JniObjectReference) (Inherited from Object)

Extension Methods

Performs an Android runtime-checked type conversion.

Источник

Читайте также:  Способы прошивка для андроид
Оцените статью