首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >安装后启动应用程序,有不同的行为(android)

安装后启动应用程序,有不同的行为(android)
EN

Stack Overflow用户
提问于 2016-06-23 10:26:19
回答 1查看 1.3K关注 0票数 2

我有一个应用程序,它有2个活动。

代码语言:javascript
运行
复制
<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.(我想是的)

通过命令行安装app (adb Install -r app)。

点击应用程序图标打开它,LauncherActivity显示,然后I startActivity to MainActivity,MainActivity显示。

点击主页,然后再次点击应用程序图标,MainActivity再次显示。

2.(例外?)

通过packageinstaller安装app。

安装完成后,点击packageinstaller中的“打开”按钮,LauncherActivity显示,然后I startActivity to MainActivity,MainActivity显示。

点击主页,然后再次点击应用程序图标,LauncherActivity再次显示!!

在我的LauncherActivity

代码语言:javascript
运行
复制
private void startMainActivity() {
    Intent intent = new Intent(this, MainActivity.class);
    startActivity(intent);
    finish();
}

我查看了源码,包安装程序使用mLaunchIntent启动活动

InstallAppProgress.java

代码语言:javascript
运行
复制
mLaunchIntent = getPackageManager().getLaunchIntentForPackage(mAppInfo.packageName);

ApplicationPackageManager.java

代码语言:javascript
运行
复制
@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;
}

我没有信息活动,所以目的是:

代码语言:javascript
运行
复制
Intent intentToResolve = new Intent(Intent.ACTION_MAIN);
intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER);
intentToResolve.setPackage(packageName);

我很困惑。为什么会有不同的行为?帮助!

EN

回答 1

Stack Overflow用户

发布于 2016-10-01 02:14:31

不确定这是否仍然是您的问题,但我通过在我的MainActivity中包含以下内容来解决此问题:

代码语言:javascript
运行
复制
if (!isTaskRoot()) {
    final Intent intent = getIntent();
    if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(intent.getAction())) {
        finish();
        return;
    }
}

这是因为根据应用程序的启动方式,会触发不同的意图(通过安装屏幕打开还是通过启动程序打开)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37981321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档