Могут ли два разных приложения иметь одно и то же имя пакета?

У меня есть этот код, чтобы получить список всех приложений в системе:

    PackageManager pm = getPackageManager();

    Intent mainIntent = new Intent(Intent.ACTION_MAIN);

    List<ResolveInfo> installedApps = pm.queryIntentActivities( mainIntent, 0);

    for(ResolveInfo elem : installedApps) {
            String PackageName = elem.activityInfo.applicationInfo.packageName;
            Log.i("TAG",PackageName);
    }

но результат в installedApps показывает много повторяющихся PackageNames. Возможно ли это? Это потому, что" сбой " намерения или потому, что многие приложения packageNames имеют то же имя?

5 ответов


это возможно?

конечно.

это потому, что" неудача " намерения

нет, по крайней мере, не для меня определение "провал".

или потому, что многие приложения packageNames имеют то же имя?

нет.

Это потому, что вы не запрашиваете деятельность, а не приложения. Приложение может иметь ноль, один, два, или миллион действия, которые будут реагировать на ACTION_MAIN Intent.


нет , каждое приложение должно иметь уникальное имя пакета. Если вы установите приложение с именем пакета, которое уже используется в другом установленном приложении, оно заменит его.

поэтому должны быть и другие причины. Одна догадка queryIntentActivities извлекает все действия, которые могут быть выполнены для данного намерения. Таким образом, он может возвращать информацию activites с тем же именем пакета.

вы можете попробовать использовать getInstalledApplications метод. Он вернет список всех приложений пакеты, установленные на устройстве


каждое приложение должно иметь имя пакета uniqe. Цитата из руководство по API: "имя пакета служит уникальным идентификатором для приложения" и "после публикации приложения вы не можете изменить имя пакета. Имя пакета определяет идентификатор приложения, поэтому при его изменении оно считается другим приложением, и пользователи предыдущей версии не могут обновить его до новой версии."

обратите внимание, что наличие нескольких Записи ACTION_MAIN в одном манифесте абсолютно допустимы, поскольку они представляют альтернативные точки входа в приложение. См.этот вопрос для получения дополнительной информации.


имя пакета действует как структура папок. Вы можете увидеть его, когда заходите в папку data->data в устройстве или эмуляторе, я считаю.

нужны разные папки для разных приложений?

Я бы сказал, что лучше будет так. Поскольку я не хочу, чтобы вы файлы с одинаковым именем переопределяли друг друга и делали неожиданные поведения или сбои. Если вы уверены, что оба приложения не имеют столкновения в именах классов или около того, я считаю, что это то же самое.


нет,

внимание: после публикации приложения изменить имя пакета невозможно. Имя пакета определяет идентификатор приложения, поэтому при его изменении оно считается другим приложением, и пользователи предыдущей версии не могут обновить его до новой версии.

Docs

но есть разные точки входа, используя intent-filter в разных разных Деятельности.

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

имя пакета: полное имя пакета Java-language-style для приложения. Имя должно быть уникальным. Имя может содержать заглавные или строчные буквы ("A" - "Z"), цифры и символы подчеркивания ("_"). Однако отдельные части имени пакета могут начинаться только с букв. Чтобы избежать конфликтов с другими разработчиками, следует использовать владение доменом интернета в качестве основы для имен пакетов (в обратном порядке). Например, приложения, опубликованные Google start с com.гуглить. Вы также не должны использовать com.пример пространства имен при публикации приложений.

имя пакета служит уникальным идентификатором приложения. Это также имя по умолчанию для процесса приложения (см. <application> элемент process атрибут процесса) и сродство задачи по умолчанию для действия (см. <activity> элемент ).