Предисловие
В этой статье в основном представлены намерения Android и анализируют процесс соответствия запросов намерения с точки зрения исходного кода Android.
Intten введение
Китайский намерение означает «намерение», а намерение - очень абстрактная концепция. Следовательно, система Android четко указывает, что намерение может быть измерено двумя аспектами.
Основные атрибуты: включая действия и данные. Среди них действие используется для представления намерения действия, выраженного намерением, и данные используются для представления данных, управляемых действием.
Вторичные атрибуты: включая категорию, тип, компонент и дополнения. Категория представляет категорию, тип представляет тип данных типа данных, и компоненты могут использоваться для указания ответа конкретного намерения (например, указание намерения быть классом класса в пакете), а дополнения используются для проведения других информация.
В системе Android есть два основных типа намерений, которые показывают намерение (явное намерение) и скрытые намерения (неявное намерение).
Явное намерение: этот тип намерения четко указывает, какой компонент найти. В коде вы можете заблокировать целевой объект через SetClassName или SetComponent.
Неявное намерение: этот тип намерения не четко указывает, какой компонент запустить, но устанавливает действие, данные и категорию, чтобы сделать экран системы подходящим компонентом.
Далее напишите два примера кода, чтобы представить намерение expllict и подразумевать. Первое - явное намерение:
Private void startExplicitIntEntwithComponent () {intent intent = new intent (); Intent);} private void startexplicitintententwithClassname () {intent intent = new intent ();Тем не менее, из исходного кода я обнаружил, что SetClassName также использовал компонент имени для достижения явных намерений. Исходный код заключается в следующем:
Public Intent SetClassName (String PackageName, String ClassName) {mComponent = New ComponentName (PackageName, ClassName);Затем код пример намерения IMPTICT. Здесь я использую действие, чтобы отметить некоторый фильтр намерений в качестве примера, а затем пишу намерение запустить его.
<Activity Android: name = ". SendIntentType"> <intent-filter> <action android: name = "justtest"/> <категория Android: name = "justCategory" </intent-f ilter> </activity>
В настоящее время в Androidmanifest.xml в классе SendIntEntType добавляется намерение. Код, который начинается, деятельность, заключается в следующем:
Private void startImpllictIntent () {intent = new intent ();В процессе сопоставления процесса Implict Entration три элемента, перечисленные фильтром намерений, будут использоваться в качестве эталонного стандарта.
Управление информацией о деятельности
Из приведенного выше анализа видно, что в процессе намерения соответствия системы вам сначала необходимо управлять всей информацией о деятельности в текущей системе. Информация о деятельности была собрана и управлялась PackageManagerservice при сканировании APK. Связанный исходный код заключается в следующем:
// Обработайте прикрепленную информацию n = pkg.activities.size (); A .info.processname = fixprocessname (pkg.applicationInfo.processName, a.info.processname, pkg.applicationinfo.uid);
В приведенном выше коде есть две важные структуры данных, как показано на рисунке ниже.
В сочетании со структурой данных кода и приведенной выше рисунка можно увидеть:
Macitivity - это тип активности. В этой структуре данных также существует переменная Mactivies.
Вся информация, связанная с информацией, полученная из APK (включая метку IntentFilter, объявленную в XML), сохраняется с помощью PackerParser.Activity.
Предыдущий код вызывает функцию аддентации для завершения рекламы частной информации. Код функции аддентации заключается в следующем:
Public Final Addactivity (PackageParser.Activity A, String Type) {Final Boolean SystemApp = IssystemApp (A.Info.ApplicationInfo); Int j = 0; / Не -системный приоритет APK должен быть 0 intent.setPriority (0);} addFilter (intent);}}Давайте посмотрим на функцию addfilter. Исходный код функции заключается в следующем:
Public void AddFilter (f f) {// mfilters для сохранения всей информации intentfilter mfilters.add (f); Тип: "); if (nums == 0 && numt == 0) {register_intent_filter (f.actionsitertor (), mactintofilter," action: ");} if (numt! = 0) {filter (f, f.actionitatrator (), MtypedActintOfilter, "typedAction:");}}}}Здесь есть еще несколько структур данных.
После понимания приблизительной структуры данных давайте посмотрим на реализацию функции Register_intent_filter:
Private Final int Register_intent_filter (фильтр, итератор <string> i, arraymap <string, f [] dest, string, string, if (i == null) {return 0;} int num = 0; while (i.hasnext () {String name = ipxt ();Тогда это еще одна функция AddFilter, которая, очевидно, является функцией тяжелой нагрузки.
Private Final void AddFilter (ArrayMap <String, F [] Map, String name, Filter) {f [] Array = Map.get (name); (Имя, массив); if (i <n) {array [i] = filter;} else {f [] newa = newsray ((n*3)/2); n] = filter;На самом деле, код все еще очень прост. Если массив F не существует, создайте массив с емкостью 2 и назначите элемент № 0 фильтру.
Анализ соответствия намерений
Клиент через функцию QueryIntEntActivity выводится с помощью приложения.
@Override public list <sorleyinfo> QueryIntEntActivities (намерение, намерение, int flags) {return quryintitititisaSer (намерение, flags, mcontext.get userid ());} / ** @hide То же, что и выше, но для конкретного пользователя* / @override public Список <ResolveInfo> QueryIntEntActivitiesAsuser (намерение, намерение, int flags, intimeId) ifneededed (mcontext.getContentresolver ()), флаги, пользовательские);} catch (remoteexception e) {throw runtimeexception («Умер пакета умер», E);};};};};};};};}; }Видно, что реальная реализация QueryIntEntActivity находится в PackageManagerservice.java.
Общедоступный список "); Componentnetname comp = intent.getComponent (); if (comp == null) {if (intent.getSelector ()! = Null) {intent = intent.getSelect или (); comp = intent.getComponent ();} } if (comp! Null) {infort resolveinfo ri = new Resulity (); null) {// неявное намерение возвращать mactivities.queryintent (intent, resolvedType, flags, userId);} окончательный па. Имя намерения возвращать mactivities.quryintentforpackage (намерение, ResolvedType, Flags, Pkg.Activities, UserId);Видно, что реализация явных намерений относительно проста. Неявное намерение назвало «Запрос».
Общедоступный список )!
Продолжайте отслеживать заданный метод intersolver.java, исходный код заключается в следующем:
Общественный список Раунды соответствующей операции F Slashpos = ResolvedType.indexof ('/'); .length ()! = Slashpos+2 || Тип совпадает. ;} // Любые типы всегда применяются, но нам нужно сделать это // Если тип не был Almedy */ *. ) !! ); ;} // Если в интерфейсе не указывается какие -либо данные - либо тип MIME, либо // uRI - тогда мы будем искать совпадающие пустые // данные. Null) {firsttypecut = mactiontofilter.get (intent.get.get ()); SecondTyTepecut! , ThirdTyPecut, финалист, userId);} if (schemecut!Конкретный процесс соответствия запросов завершается функцией BuildReSolvist. Я не публикую код для соответствующей реализации запроса.