2013-12-16 2 views
1

У нас возникает странная проблема. Наше приложение уже загружено в Google Play. Когда я загружаю наше приложение из Google Play, я узнал, что для нашего приложения созданы 2 ярлыка. Один из них создается во время загрузки и установки нашего приложения в Google Play. Когда я нажму, чтобы запустить наше приложение в 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?, однако ответ на него не очень однако, полностью ответьте на вопрос.

Я действительно растерялся, мог ли кто-то пролить свет здесь?

Update 1 (17 декабря):

здесь андроида файл манифеста (я заменил какое-то название, чтобы удалить некоторую конфиденциальную информацию). 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> 

+0

В недавнем обновлении вы изменили имя (или имя пакета) корневой активности (с ACTION = MAIN и CATEGORY = DEFAULT)? –

+0

мы изменили имя пакета, чтобы сделать его все в нижнем регистре, чтобы совместить соглашение об именах java. поэтому я не опубликовал оригинальное приложение в Google Play и переиздал его. Однако перед установкой нового приложения я удалил старое приложение. Новое приложение впервые опубликовано в Google Play с этим именем пакета (имя нижнего регистра) – windfly2006

+0

, пожалуйста, поделитесь своим манифестом ... –

ответ

3

Потому что в манифесте вы объявляете 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> 

Это намерение фильтра, помещает ярлык в пусковом устройстве , Второй ярлык - это тот, который вы создаете во время выполнения.

+0

Спасибо за ответ. Отлично, что мы выяснили причину, хотя я немного смущен.Очевидно, что нам нужно иметь фильтр основного намерения для запуска первого действия, поэтому это означает, что нам не нужно, чтобы этот код создавал ярлыки для нашего приложения, просто задайтесь вопросом, почему еще есть много примеров кода для создания ярлыка. Кажется, это вообще не нужно. Другое дело, что я не видел, что ярлык всегда создан для приложения, установленного из Google Play, хотя я могу ошибаться (я думаю, что у них должен быть этот фильтр основного намерения). – windfly2006

+1

Потому что это зависит от запуска Launcher. Положим так. Android Launchers - это обычные приложения, упакованные в APK. Они прислушиваются к намерениям, как к другому приложению (I.E., когда вы нажимаете ссылку IMDB на CHROME, он попросит вас открыть приложение IMDB). Хорошо, если пользователь заменяет свою пусковую установку другой, которая НЕ СОЗДАВАЕТ ярлыки в своем приложении Drawer, этот код даст вам возможность создать значок на домашней странице пользователя. Очевидно, что большинство людей используют Launcher, которые показывают значки на своем ящике – noni

+0

Отличная информация, спасибо за понимание. Другой вопрос, для нашего кода, который используется для проверки того, создан ли ярлык или нет. Любая идея, почему мы не смогли найти ярлык, созданный Google Play? Я думаю, что мы могли бы удалить код для создания ярлыка, поэтому этот код может быть неактуальным для нашего приложения, однако я просто хотел бы узнать больше здесь. :-) – windfly2006

Смежные вопросы