为什么我的应用程序快捷方式在Google Play下载并安装我的应用时创建了两次

时间:2013-12-16 17:46:24

标签: android google-play

我们遇到了一个奇怪的问题。我们的应用已上传到Google Play。当我从Google Play下载我们的应用时,我发现为我们的应用创建了2个快捷方式。一个是在我们的应用程序下载和安装Google Play时创建的。当我点击在Google Play中运行我们的应用时,我们会启动启动屏幕活动,这将创建另一个快捷方式(我们的代码会检查是否已创建快捷方式)。

现在两个快捷方式都在那里,并且表现不同。如果我从第一个快捷方式启动了我的应用程序,并在屏幕上输入了一些信息,然后返回主屏幕。然后再次单击相同的快捷方式,这些输入的信息仍然存在。但是,如果我在进入主屏幕后单击另一个快捷方式,则会再次显示启动画面,所有输入的数据都将消失。如果我看到正在运行的应用程序(按住并按住),我只能看到一个正在运行的应用程序。

以下是我们创建快捷方式的代码:

    public static void createShortcut(Activity activity, int iconResId,
        int appNameResId) {
    Intent shortcutIntent = new Intent(
            "com.android.launcher.action.INSTALL_SHORTCUT");
    shortcutIntent.putExtra("duplicate", false);
    shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME,
            activity.getString(appNameResId));
    Parcelable icon = Intent.ShortcutIconResource.fromContext(
            activity.getApplicationContext(), iconResId);
    shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
    Intent extraIntent = new Intent(activity.getApplicationContext(),
            activity.getClass());
    extraIntent.setAction("android.intent.action.MAIN");
    extraIntent.addCategory("android.intent.category.LAUNCHER");
    shortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, extraIntent);

    activity.sendBroadcast(shortcutIntent);

}

这里是我们正在检查是否已创建重复快捷方式的代码,基本上我们正在检查是否已经创建了具有我们的应用名称的快捷方式,我知道它不是防弹的,因为其他应用程序将使用与我们的应用程序相同的名称好吧,比如我看到几个“手电筒”应用程序。另一件事是很明显我们的应用程序没有检测到从Google Play应用程序创建的快捷方式:

    public static Boolean isShortcutInstalled(Activity activity,
        int appNameResId) {
    final ContentResolver cr = activity.getContentResolver();
    String authorityString = null;
    if (Build.VERSION.SDK_INT >= 8) {
        authorityString = "com.android.launcher2.settings";
    } else {
        authorityString = "com.android.launcher.settings";
    }
    Uri contentUri = Uri.parse("content://" + authorityString
            + "/favorites?notify=true");
    Cursor cursor = cr.query(contentUri, new String[] { "title",
            "iconResource" }, "title=?",
            new String[] { activity.getString(appNameResId) }, null);
    if (cursor != null && cursor.getCount() > 0) {
        return true;
    }
    return false; 
}
顺便说一下,这是关于SO的另一个问题:Is it possible to prevent the Google Play app from creating a shortcut of my App on install?,但是答案并没有真正完全解决这个问题。

我现在真的很困惑,有人可以在这里点灯吗?

更新1(12月17日):

这里是android清单文件(我替换了一些名称来删除一些敏感信息)。 SplashActivity是我们应用的切入点。

<?xml version="1.0" encoding="utf-8"?>

<uses-sdk
    android:minSdkVersion="9"
    android:targetSdkVersion="17" />

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT"/>
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS"/>

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

<application
    android:name=".xxApplication"
    android:allowBackup="true"
    android:icon="@drawable/xx_logo"
    android:label="@string/app_label"
    android:theme="@style/xxTheme.Holo" >
    <activity
        android:name="com.xx.xx.android.MainActivity"
        android:screenOrientation="portrait" >
    </activity>
    <activity
        android:name="com.xx.xx.android.TestActivity"
        android:label="TestActivity"
        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="com.LS.zxing22.android.CaptureActivity"
        android:configChanges="orientation|keyboardHidden"
        android:screenOrientation="portrait"
        android:theme="@style/xxTheme.NoTitleBar"
        android:windowSoftInputMode="stateAlwaysHidden" >
    </activity>
    <activity
        android:name=".ui.EnrollmentActivity"
        android:screenOrientation="portrait"
        android:theme="@style/xxTheme.NoTitleBar" >
    </activity>
    <activity
        android:name=".ui.LoginActivity"
        android:screenOrientation="portrait"
        android:theme="@style/xxTheme.NoTitleBar" >
    </activity>
    <activity
        android:name=".ui.AgreementActivity"
        android:screenOrientation="portrait" >
    </activity>
    <activity
        android:name=".ui.UsagePolicyActivity"
        android:screenOrientation="portrait" >
    </activity>
    <activity
        android:name=".ui.FinishActivity"
        android:screenOrientation="portrait" >
    </activity>
    <activity
        android:name=".ui.MainActivity"
        android:screenOrientation="portrait"
        android:theme="@style/xxTheme.Holo.Menu" >
    </activity>
    <activity
        android:name=".ui.AccessPasswordActivity"
        android:label="@string/activity_label_access_password"
        android:screenOrientation="portrait" >
    </activity>
    <activity
        android:name=".ui.LoginCodeActivity"
        android:label="@string/activity_label_login_code"
        android:screenOrientation="portrait" >
    </activity>
    <activity
        android:name="org.wordpress.passcodelock.PasscodeUnlockActivity"
        android:screenOrientation="portrait"
        android:theme="@style/xxTheme.NoTitleBar" >
    </activity>
    <activity
        android:name="org.wordpress.passcodelock.PasscodePreferencesActivity"
        android:screenOrientation="portrait" >
    </activity>
    <activity
        android:name="org.wordpress.passcodelock.PasscodeManagePasswordActivity"
        android:screenOrientation="portrait"
        android:theme="@style/xxTheme.NoTitleBar" >
    </activity>
    <activity
        android:name=".ui.SplashActivity"
        android:screenOrientation="portrait"
        android:theme="@style/xxTheme.NoTitleBar.Splash" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".ui.TutorialActivity"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="com.xx.xx.android.ui.TutorialActivity.Action" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

    <service
        android:name="com.xx.xx.android.services.xxService"
        android:enabled="true" >
        <intent-filter>
            <action android:name="com.xx.xx.android.services.IxxServiceRemoteInterface" />
        </intent-filter>
    </service>
    <service
        android:name="com.xx.xx.android.services.NetworkIntentService"
        android:enabled="true" >
    </service>
    <service
        android:name="com.xx.xx.android.services.xxAppIntentService"
        android:enabled="true" >
    </service>
    <service
        android:name="com.xx.xx.android.services.DeviceAttributeUploadIntentService"
        android:enabled="true" >
    </service>
    <service
        android:name="com.xx.xx.android.services.HeartbeatIntentService"
        android:enabled="true" >
    </service>
    <service
        android:name="com.xx.xx.android.services.DeviceWipeIntentService"
        android:enabled="true" >
    </service>
</application>

1 个答案:

答案 0 :(得分:3)

因为在你的Manifest中你用一个主意图过滤器声明你的SplashActivity

<activity
        android:name=".ui.SplashActivity"
        android:screenOrientation="portrait"
        android:theme="@style/xxTheme.NoTitleBar.Splash" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

该意图过滤器,在设备的启动器中放置一个快捷方式。第二个快捷方式是您在运行时创建的快捷方式