2

アプリがあり、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 が表示され、次に StartActivity から MainActivity が表示され、MainActivity が表示されます。
ホームをタップし、アプリのアイコンをもう一度タップすると、MainActivity が再び表示されます。

2.(例外?)
packageinstaller からアプリをインストールします。
インストールが完了したら、packageinstaller の [開く] ボタンをタップすると、LauncherActivity が表示され、次に StartActivity から MainActivity が表示され、MainActivity が表示されます。
HOMEをタップし、アプリのアイコンをもう一度タップすると、LauncherActivityが再び表示されます!!

私の LauncherActivity で

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

ソースを調べると、packageinstaller は 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);

よくわかりません。行動に違いがあるのはなぜですか?ヘルプ!

4

1 に答える 1

1

これがまだ問題であるかどうかはわかりませんが、これを MainActivity に含めることで解決しました:

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

これは、アプリの起動方法 (インストール画面から開く、開く、ランチャー) に応じて異なるインテントが起動されるためです。

于 2016-09-30T18:14:31.387 に答える