Позволить стороннему приложению начать мою деятельность напрямую? - PullRequest
1 голос
/ 21 февраля 2010

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

Прямо сейчас это действие перехватывает URL через фильтр намерений, например:

<activity android:name=".MyActivity">
  <intent-filter> 
    <action android:name="android.intent.action.VIEW"></action>
    <category android:name="android.intent.category.DEFAULT"></category>
    <category android:name="android.intent.category.BROWSABLE"></category>
    <data android:host="www.mysite.com" android:pathPrefix="/test/" android:scheme="http"></data>
  </intent-filter>
</activity>

Это работает, когда пользователь нажимает на ссылку в моем приложении, например:

"mysite.com/test/blah.html"

Мое приложение вместе с браузером предлагает открыть ссылку.

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

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://mysite.com/test/somedata"));
startActivity(intent); 

Хотя это будет работать, это, вероятно, не даст им желаемого эффекта перехода непосредственно к моей деятельности из их - появится диалоговое окно выбора андроида, спрашивающее, хотят ли они открыть данные намерений с помощью браузера или моего приложения .

Как я могу позволить сторонним организациям напрямую вызывать мои действия, не передавая подобные намерения? Я бы хотел, чтобы они по-прежнему передавали мне точно такую ​​же схему данных, но просто позволяли им напрямую открывать мою деятельность.

Спасибо

Ответы [ 2 ]

3 голосов
/ 21 февраля 2010

Скорее всего, вам понадобится, чтобы они позвонили вам напрямую

Class yourClass = Class.forName("com.yourdomain.yourapp.YourClass");
Intent intent = new Intent(this, yourClass);

Если у них нет банки для ссылки. В противном случае они могли бы просто использовать

Intent intent = new Intent(this, YourClass.class);    

А потом положил туда несколько дополнений. Вся концепция намерения просмотра (наряду с другими) состоит в том, чтобы предоставить пользователям выбор того, как они хотели бы что-то просматривать / использовать. Это похоже на то, что происходит, когда вы нажимаете «поделиться» в средстве просмотра мультимедиа. Вся идея в том, чтобы дать им выбор. Если кто-то хочет просто начать свою деятельность, ему нужно будет явно позвонить.

Редактировать: Мой пример отражения выше не будет работать напрямую, если загрузчик классов Dalvik не знает о вашем классе (что, вероятно, не будет). На самом деле вам нужно будет конкретно указать ВМ, чтобы он загружал класс из стороннего пакета. Вы можете сделать это с помощью следующего кода

Context foreignContext = createPackageContext("com.yourdomain.yourapp", Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
Class<?> yourClass = foreignContext.getClassLoader().loadClass("com.yourdomain.yourapp.YourClass");

Теперь, когда у них есть объект класса, они могут запустить намерение, как и раньше. Таким образом, полный код выглядит примерно так:

Context foreignContext = createPackageContext("com.yourdomain.yourapp", Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE);
Class<?> yourClass = foreignContext.getClassLoader().loadClass("com.yourdomain.yourapp.YourClass");
Intent intent = new Intent(this, yourClass);
startActivity(intent);
0 голосов
/ 13 сентября 2011

Решение, описанное выше Крисом Томпсоном, не сработало для меня. Вот что сделал: Android: запуск активности для другого стороннего приложения

На всякий случай, если кто-нибудь столкнется с той же проблемой, что и я.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...