запустить приложение после установки, есть разные варианты поведения (android)

У меня есть приложение, и оно имеет 2 действия.

<activity android:name=".LauncherActivity"
          android:theme="@style/LauncherTheme"
          android:screenOrientation="portrait">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

<activity android:name="MainActivity"
          android:launchMode="singleTop"
          android:screenOrientation="portrait"/>

1.(Я ожидал)
Установите приложение через командную строку (adb install -r app).
Нажмите на значок приложения, чтобы открыть его, отобразится LauncherActivity, затем я перейду к MainActivity, отобразится MainActivity.
Нажмите ДОМОЙ, затем снова коснитесь значка приложения, снова отобразится MainActivity.

2.(исключение?)
Установите приложение через packageinstaller.
По завершении установки нажмите кнопку «Открыть» в пакетном инсталляторе, появится LauncherActivity, затем я перейду к MainActivity, отобразится MainActivity.
Нажмите ДОМОЙ, затем снова нажмите значок приложения, снова отобразится LauncherActivity!!

В моей LauncherActivity

private void startMainActivity() {
    Intent intent = new Intent(this, MainActivity.class);
    startActivity(intent);
    finish();
}

Я смотрю в источник, пакетный установщик запускает активность с помощью mLaunchIntent

InstallAppProgress.java

mLaunchIntent = getPackageManager().getLaunchIntentForPackage(mAppInfo.packageName);

ApplicationPackageManager.java

@Override
public Intent getLaunchIntentForPackage(String packageName) {
    // First see if the package has an INFO activity; the existence of
    // such an activity is implied to be the desired front-door for the
    // overall package (such as if it has multiple launcher entries).
    Intent intentToResolve = new Intent(Intent.ACTION_MAIN);
    intentToResolve.addCategory(Intent.CATEGORY_INFO);
    intentToResolve.setPackage(packageName);
    List<ResolveInfo> ris = queryIntentActivities(intentToResolve, 0);

    // Otherwise, try to find a main launcher activity.
    if (ris == null || ris.size() <= 0) {
        // reuse the intent instance
        intentToResolve.removeCategory(Intent.CATEGORY_INFO);
        intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER);
        intentToResolve.setPackage(packageName);
        ris = queryIntentActivities(intentToResolve, 0);
    }
    if (ris == null || ris.size() <= 0) {
        return null;
    }
    Intent intent = new Intent(intentToResolve);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setClassName(ris.get(0).activityInfo.packageName, ris.get(0).activityInfo.name);
    return intent;
}

У меня нет информационной активности, поэтому цель такова:

Intent intentToResolve = new Intent(Intent.ACTION_MAIN);
intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER);
intentToResolve.setPackage(packageName);

Я смущен. Почему существуют различия в поведении? Помощь!


person android_su    schedule 23.06.2016    source источник


Ответы (1)


Не уверен, что это все еще проблема для вас, но я решил это, включив это в свою MainActivity:

if (!isTaskRoot()) {
    final Intent intent = getIntent();
    if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(intent.getAction())) {
        finish();
        return;
    }
}

Это связано с тем, что в зависимости от того, как запускается приложение, запускаются разные намерения (открыть через экран установки или открыть или запустить).

person communistWatermelon    schedule 30.09.2016
comment
спасибо, это исправило мою проблему, активность запуска, вызываемая при возвращении из дома, происходит только тогда, когда приложение запускается после установки. Я добавляю это в onCreate моей активности запуска - person Fauzi Danartha; 17.06.2019