Android: вызов активности другого приложения

У меня есть два приложения для Android, предположим, что они "A" и "B", "A"имеет пять действий, и я хочу вызвать его конкретную активность из события нажатия кнопки "B". Я протестировал этот способ вызова одного приложения из другого:

Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.testapp.ws");
startActivity(LaunchIntent);

"ком.файла testapp.с WS" имя пакета "а".

это запускает " A " из своего первого действия снова не из определенного действия. Как я могу назвать указанное действие A?

4 ответов


Грант

проблема здесь явно недоразумение модели приложения для Android. Commonsware абсолютно правильно о том, как решить эту проблему. Однако, не понимая основ Android, я понимаю, почему у вас возникли трудности с его применением. Итак, краткое объяснение:

каждое действие в Android начинается с намерения. Особенно это касается деятельности. Каждое действие имеет цель. Чтобы сделать интерфейс простым для разработчиков, вы может отвечать на намерение из ОС, или вы можете создать намерение из класса Activities для использования. В общем, лучше всего сделать первый вариант.

отвечая на намерение

выбирая намерение для ответа, вы можете буквально реагировать на любое намерение. Это называется действием. Если я создал намерение под названием "FOO", активность бара может поднять его и ответить. Однако у нас есть соглашения, и основное из них-добавить ваши имя пакета для любого намерения, которое вы делаете. Например, "com.компания.пакет.FOO." Проще говоря, это значит, что мы избегаем столкновений с другими приложениями.

каждое действие может реагировать на различные события. Это определено в AndroidManifest.XML.

<activity android:name="Activity3" ... >
    <intent-filter>
      <action android:name="com.company.package.FOO"/>
      <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

выше, мы также установить категорию по умолчанию, так что, если пользователь не изменяет его, мы будем единственным приложением, которое отвечает на наши пользовательские намерения. Затем мы вызываем намерение, используя то же имя, которое мы создали (т. е. "com.компания.пакет.FOO")

startActivity(new Intent("com.company.package.FOO"));

вот как это работает! Вы просто измените вышеуказанный " com.компания.пакет.FOO " к вашему имени пакета (определенному вашим приложением) и что-то значимое. Пример "ком.файла testapp.с WS.SWAT_FLIES".

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

Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.testapp.ws");

приведенный выше код ищет конкретный вид действия намерения. Помните, когда вы сделали AndroidManifest и первое действие вы поставить:

 <action android:name="android.intent.action.MAIN">
 <category android:name="android.intent.category.LAUNCHER">

хорошо... getLaunchIntentForPackage () получает только намерение для этого первого действия. Вот почему мы делаем заказное намерение... Во-первых, потому что мы на самом деле не хотим, чтобы это был наш третий вид деятельности, чтобы быть нашим запуском... И во-вторых, потому что ОС расскажет нам только о деятельности запуска. Мы должны сказать это с наших собственных действий (т. е. "ком.файла testapp.с WS.SWAT_FLIES")

надеюсь, это поможет,

FuzzicalLogic


Шаг #1: добавьте <intent-filter> к третьему действию с пользовательским действием:

<intent-filter>
  <action android:name="com.testapp.ws.SOMETHING_USEFUL"/>
  <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

Шаг #2: Начните эту деятельность, используя соответствующий Intent:

startActivity(new Intent("com.testapp.ws.SOMETHING_USEFUL"));

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

Intent intent = new Intent();
intent.setClassName("PACKAGE_NAME", "PACKAGE_NAME.TARGET_ACTIVITY");
if (isCallable(context, intent)) {
    // Attach any extras, start or start with callback
} else {
    // Respond to the application or activity not being available
}

где-то в основном классе или в подклассе, который обрабатывает общие методы:

public static boolean isCallable(Activity activity, Intent intent) {
    List<ResolveInfo> list = activity.getPackageManager().queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);
    return list.size() > 0;
}

вот код, чтобы открыть приложение (ex whatsapp) из другого приложения

public class MainActivity расширяет действие{

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button bClock = (Button) findViewById(R.id.button1);
    bClock.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
    Intent i = new Intent(Intent.ACTION_MAIN);
    PackageManager managerclock = getPackageManager();
    i = managerclock.getLaunchIntentForPackage("com.whatsapp");
    i.addCategory(Intent.CATEGORY_LAUNCHER);
    startActivity(i);
    }
    });

} }