Як розпочати діяльність в іншій програмі?


77

У мене є програма A, визначена нижче:

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name="com.example.MyExampleActivity"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Тепер у програмі B, як я можу написати код, щоб розпочати діяльність у програмі A? Дякую!

Відповіді:


152

Якщо ви, хлопці, стикаєтеся з помилкою "Відмова у дозволі: запуск наміру ..." або якщо програма запускає програму без будь-якої причини під час запуску програми - Тоді використовуйте цей однорядковий код у Manifest

android:exported="true"

Будьте обережні з фінішем (); , якщо ви пропустили його, програма заморожується. якщо його згадували, програма була б плавною панеллю запуску.

finish();

Інше рішення працює лише для двох видів діяльності, які знаходяться в одному додатку. У моєму випадку програма B не знає класу com.example.MyExampleActivity.classв коді, тому компіляція не вдасться.

Я шукав в Інтернеті і знайшов щось подібне нижче, і це працює добре.

Intent intent = new Intent();
intent.setComponent(new ComponentName("com.example", "com.example.MyExampleActivity"));
startActivity(intent);

Ви також можете використовувати метод setClassName:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClassName("com.hotfoot.rapid.adani.wheeler.android", "com.hotfoot.rapid.adani.wheeler.android.view.activities.MainActivity");
startActivity(intent);
finish();

Ви також можете передавати значення з одного додатка в інший:

Intent launchIntent = getApplicationContext().getPackageManager().getLaunchIntentForPackage("com.hotfoot.rapid.adani.wheeler.android.LoginActivity");
if (launchIntent != null) {
    launchIntent.putExtra("AppID", "MY-CHILD-APP1");
    launchIntent.putExtra("UserID", "MY-APP");
    launchIntent.putExtra("Password", "MY-PASSWORD");
    startActivity(launchIntent);
    finish();
} else {
    Toast.makeText(getApplicationContext(), " launch Intent not available", Toast.LENGTH_SHORT).show();
}

1
Радий бачити цю відповідь! Однак у моєму випадку (Android 4.2) я отримав помилку "Відмова в дозволі: запуск наміру ...". Будь-яка підказка?
JackWM

11
@JackWM додає android: exported = "true" до властивості вашої активності
Evan_HZY

3
@JackWM також буде працювати, якщо діяльність, яку ви намагаєтеся запустити, має фільтр намірів. Це пов’язано з тим, що значенням за замовчуванням для android:exportedатрибута XML є trueнаявність фільтра намірів.
Требор Руде

Тепер, коли ви розпочали діяльність 2-го додатка з 1-го додатка, будь-який підказка про те, як програмно отримати у 2-му додатку те, яка діяльність (або додаток) розпочало цю діяльність? Відповідь буде 1-м додатком, звичайно, але як його отримати у вашому другому додатку програмно?
Sash_KP

3
Хм, не працює у мене. У мене є дві програми, кожна з однією діяльністю: com.examplea.MainActivityAі com.exampleb.MainActivityB. З MainActivityA я запускаю ваш фрагмент коду із рядками "com.exampleb" та "com.exampleb.MainActivityB". Однак я просто розуміюandroid.content.ActivityNotFoundException: Unable to find explicit activity class {com.exampleb/com.exampleb.MainActivityB}; have you declared this activity in your AndroidManifest.xml?
Ерханніс

15

Якщо обидва додатки мають однаковий підпис (це означає, що обидва додатки є вашими і підписані одним і тим же ключем), ви можете викликати інші дії в додатку таким чином:

Intent LaunchIntent = getActivity().getPackageManager().getLaunchIntentForPackage(CALC_PACKAGE_NAME);
startActivity(LaunchIntent);

Сподіваюся, це допоможе.


7
Вам не потрібно, щоб обидва додатки мали однаковий підпис. Наприклад, ви можете запустити Карти Google таким чином: Intent i = getPackageManager (). GetLaunchIntentForPackage ("com.google.android.apps.maps");
Тім Отін

1
@TimAutin Що робити, якщо мені потрібно запустити певну діяльність, яка належить програмі, над якою я не маю контролю?
Епічність

1
Мені ніколи не доводилося цього робити, тому я не знаю. Ви пробували цю відповідь stackoverflow.com/a/2210073/1356106 ?
Тім Аутін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.