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

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

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

"com.testapp.ws" - это имя пакета "A" .

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

Ответ 1

Грант

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

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

Реагирование на намерение

Когда вы выбираете намерение для ответа, вы можете в буквальном смысле реагировать на любое намерение. Это называется действием. Если бы я создал намерение под названием "FOO", активность Bar могла поднять его и ответить. Однако у нас есть соглашения, и главным из них является добавление имени вашего пакета к любому намерению, которое вы делаете. Например, "com.company.package.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>

Кроме того, мы также устанавливаем категорию в DEFAULT, так что, если пользователь не изменит ее, мы будем единственным приложением, отвечающим нашему пользовательскому намерению. Способ, которым мы тогда называем Intent, заключается в использовании ИМЯ ИМЯ, которую мы создали (то есть "com.company.package.FOO" )

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

Как это работает! Вы просто изменили бы вышеуказанный "com.company.package.FOO" на название вашего пакета (определенное вашим приложением) и что-то значимое. Например, "com.testapp.ws.SWAT_FLIES".

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

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

Вышеприведенный код ищет конкретное действие KIND of Intent. Помните, когда вы создали AndroidManifest и первое действие, которое вы указали:

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

Ну... getLaunchIntentForPackage() получает только намерение для этого первого действия. Это ПОЧЕМУ мы делаем индивидуальное намерение... Во-первых, потому что мы действительно не хотим, чтобы наша 3-я деятельность стала нашим началом... И во-вторых, потому что OS расскажет нам только о запуске Activity. Мы должны сказать это с помощью нашего СОБСТВЕННОГО действия (т.е. "Com.testapp.ws.SWAT_FLIES" )

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

FuzzicalLogic

Ответ 2

Шаг # 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"));

Ответ 3

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

открытый класс 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);
    }
    });

} }

Ответ 4

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

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;
}