Начать ОСНОВНУЮ активность текущего приложения, не зная его имени - PullRequest
7 голосов
/ 26 июля 2011

Я пытаюсь написать служебный метод, который сможет запускать действия (принадлежащие текущему приложению), помеченные как "android.intent.action.MAIN". Утилита метод не должен принимать никаких параметров.

Желаемый код:

public void startMainActivity(Context context) {
    ...
}

Manifest:

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Есть идеи?

Ответы [ 3 ]

14 голосов
/ 27 июля 2011

Это работает с API уровня 3 (Android 1.5):

private void startMainActivity(Context context) throws NameNotFoundException {
    PackageManager pm = context.getPackageManager();
    Intent intent = pm.getLaunchIntentForPackage(context.getPackageName());
    context.startActivity(intent);
}
1 голос
/ 04 июля 2014

Некоторое время мы использовали симпатичное решение alex2k8, пока не обнаружили, что не работает на всех устройствах на выпущенной версии, загруженной из Google Play .

К сожалению, система не смогла:

  • выбросить любое исключение
  • записать причину ошибки

Мы использовали следующий обходной путьчтобы решить это:

protected void startMainActivityWithWorkaround() throws NameNotFoundException, ActivityNotFoundException {
    final String packageName = getPackageName();
    final Intent launchIntent = getPackageManager().getLaunchIntentForPackage(packageName);
    if (launchIntent == null) {
      Log.e(LOG_TAG, "Launch intent is null");
    } else {
      final String mainActivity = launchIntent.getComponent().getClassName();
      Log.d(LOG_TAG, String.format("Open activity with package name %s / class name %s", packageName, mainActivity));
      final Intent intent = new Intent(Intent.ACTION_MAIN);
      intent.addCategory(Intent.CATEGORY_LAUNCHER);
      intent.setComponent(new ComponentName(packageName, mainActivity));
      // optional: intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      startActivity(intent);
    }
}
0 голосов
/ 26 июля 2011

Я думаю, вам нужно найти список всех действий, объявленных в вашем манифесте, а затем использовать actionsIterator() в intentFilter, чтобы выполнить все действия фильтра намерений каждого действия, сопоставитьтот, который имеет intent.action.MAIN, а затем начать эту деятельность.

Проблема в том, что я не уверен, как получить список всех ваших объявленных активитов из манифеста.

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