Вопрос касается Intent-атрибут data

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Ответить
kerk
Сообщения: 2
Зарегистрирован: 09 авг 2016, 19:24

Вопрос касается Intent-атрибут data

Сообщение kerk » 09 авг 2016, 20:01

Я только учусь, прошу отнестись с пониманием.
Сам ответа никак не могу найти. Вроде все перепробовал. Прошу учесть, что задача чисто учебная. Я понимаю, что могу легко добиться результата с помощью Extras. Но ведь и так как я хочу тоже должно работать. Помогите, плиз, разобраться.
Задача очень простая. Вызываю из одной активности другую и передаю второй данные. Использую неявное намерение.

Код: Выделить всё

intent = new Intent("ru.asko.SECOND");
intent.setData(Uri.parse("asko://данные из uri"));
startActivity(Intent.createChooser(intent, "Не попал!"));
В манифесте для второй активности настроил intent-filter
<activity android:name=".MainActivity" android:label="Передача данных">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity android:name=".SecondActivity" android:label="Переданные данные">
<intent-filter>
<action android:name="ru.asko.SECOND" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

В результате Андроид не может вызвать вторую активность. Не находит ее по манифесту.
Причем если добавляю скажем еще условие по схеме данных <data android:scheme="asko" /> - все работает.
Первый вопрос. Везде где я читал об этом говорится, что если в манифесте для активности на данные нет фильтра, тогда активность подходит (если конечно подходит Action и категория - Default). У меня почему-то это правило не работает :(
Второй вопрос. Я пытался дополнительно настроить фильтр по mime-типам. Вообще ничего не вышло :( Результат тот же -активность не находится.
Добавлял такую строчку в intent-filter

Код: Выделить всё

<data android:mimeType="text/*" />
Я наивно полагал, что тип переданной URI-строки - именно text. И опять промах :( Признаться, что я и так пробовал - <data android:mimeType="*/*" />. Все равно мимо.
Где я косячу?

Sergey777
Сообщения: 68
Зарегистрирован: 30 мар 2015, 17:16

Re: Вопрос касается Intent-атрибут data

Сообщение Sergey777 » 10 авг 2016, 20:14

kerk писал(а):Я только учусь, прошу отнестись с пониманием.
Сам ответа никак не могу найти. Вроде все перепробовал. Прошу учесть, что задача чисто учебная. Я понимаю, что могу легко добиться результата с помощью Extras. Но ведь и так как я хочу тоже должно работать. Помогите, плиз, разобраться.
Задача очень простая. Вызываю из одной активности другую и передаю второй данные. Использую неявное намерение.

Код: Выделить всё

intent = new Intent("ru.asko.SECOND");
intent.setData(Uri.parse("asko://данные из uri"));
startActivity(Intent.createChooser(intent, "Не попал!"));
В манифесте для второй активности настроил intent-filter
<activity android:name=".MainActivity" android:label="Передача данных">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity android:name=".SecondActivity" android:label="Переданные данные">
<intent-filter>
<action android:name="ru.asko.SECOND" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

В результате Андроид не может вызвать вторую активность. Не находит ее по манифесту.
Причем если добавляю скажем еще условие по схеме данных <data android:scheme="asko" /> - все работает.
Первый вопрос. Везде где я читал об этом говорится, что если в манифесте для активности на данные нет фильтра, тогда активность подходит (если конечно подходит Action и категория - Default). У меня почему-то это правило не работает :(
Второй вопрос. Я пытался дополнительно настроить фильтр по mime-типам. Вообще ничего не вышло :( Результат тот же -активность не находится.
Добавлял такую строчку в intent-filter

Код: Выделить всё

<data android:mimeType="text/*" />
Я наивно полагал, что тип переданной URI-строки - именно text. И опять промах :( Признаться, что я и так пробовал - <data android:mimeType="*/*" />. Все равно мимо.
Где я косячу?
Здравствуйте! Когда Вы вызываете неявное намерение с помощью собственной схемы: asko://данные из uri, - Андроид не может найти тип содержимого asko, который он определяет по scheme. Этот параметр типа данных должен быть указан в data, как Вы и писали выше. В противном случае Андроид не может определить какое ему действие нужно начать выполнять. Это всё равно Вы создали новый протокол и хотите чтобы Ваш браузер, ничего не зная о том как с новым запросом работать, открывал Вам страницы) Сама URI-строка должна быть составлена в соответствии с документом RFC 2396:
http://www.faqs.org/rfcs/rfc2396.html
И вообще не советую использовать неявные намерения для запуска своей же собственной активности из своего же собственного приложения. Они созданы не для этого))

kerk
Сообщения: 2
Зарегистрирован: 09 авг 2016, 19:24

Re: Вопрос касается Intent-атрибут data

Сообщение kerk » 10 авг 2016, 21:12

Sergey777, огромное спасибо. Нечто подобное я и сам начал подозревать. К сожалению, в большинстве источников об этом пишут вскользь. Причем утверждается, что раз в фильтре активности параметра data нет, то подходят любые данные. Теперь, понятно, что речь шла только о стандартных Action.
Но все-таки, как следует настроить <data android:mimeType ...>, чтобы "проглатывалась" моя строка?
Я игрался с методом setType и добился, чтобы вторая активность запускалась. Но при этом теряются сами данные :) Я использовал такой вариант:

Код: Выделить всё

intent.setData("text/*");
Ну и само собой в интент-фильтр второй активности добавлял такой же параметр data.
Активность открывается, но в прочитанном интенте данных не обнаруживается.
Я понимаю, что неявные намерения нужны для других целей. Но просто хочется понять этот механизм до конца. Если не сложно, подскажите. Ведь та же самая проблема будет, если я передам эту несчастную строку в другое приложение, используя неявное намерение. Нужно как-то настроить data.
И само собой пошел читать RFC 2396.
Еще раз, огромное спасибо!

Ответить