2012-06-09 2 views
10

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

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

«com.testapp.ws» это имя пакета «A».

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

ответ

30

Гранта,

Проблема здесь явно непонимание модели приложений для 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, так что если пользователь не изменит его, мы будем единственным приложением, которое отвечает на наше пользовательском Намерение. Таким образом, что мы тогда называем Намерение состоит в использовании того же имени, которое мы создали (т.е. «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"); 

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

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

Ну ... getLaunchIntentForPackage() только получает Intent для этой первой деятельности. Вот почему мы делаем индивидуальный подход ... Во-первых, потому что мы действительно не хотим, чтобы наша 3-я деятельность стала нашим началом ... И, во-вторых, потому что OS расскажет нам только о запуске Activity. Мы должны сказать это с нашим собственным действием (например, «com.testapp.ws.SWAT_FLIES»)

Надеется, что это помогает,

FuzzicalLogic

+0

Благодарим Mr.Fuzzical Logic за подробное описание. После ссылки на ваше объяснение я успешно реализовал приложение. Спасибо огромное! – Grant

+0

, как это может быть достигнуто, если я хочу отправить данные из одной активности в одном приложении на службу в другое приложение. ??? – Aada

+0

На самом деле вам просто нужно выполнить намерение и отправить данные через setExtra перед тем, как вы запустите startService(). Возможно, вам придется сначала сконструировать Intent (т. Е. Intent myIntent = new Intent («com.company.app.ACTION») –

20

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

Что я должен добавить Вот ?? «SOMETHING_USEFUL» в xml и классе Activity? Не могли бы вы объяснить больше? Благодаря! – Grant

+1

Как насчет 'категории', нужно ли это здесь? –

+1

@ Eng.Fouad: Да, вам понадобится элемент '' для категории 'DEFAULT' в этом' '- мои извинения. – CommonsWare

0

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

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

здесь код, чтобы открыть приложение (бывший 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); 
    } 
    }); 

} }

Смежные вопросы