Запущены два экземпляра моего приложения для Android …. Как этого избежать?

#android

#Android

Вопрос:

Вот моя проблема —

  1. Я скопировал свой файл .apk на карту памяти телефона и запустил свое приложение, нажав на него, и это позволяет мне установить мое приложение.Я устанавливаю свое приложение.Наконец, я получил всплывающее окно установки системы, содержащее две опции «Открыть» и «Готово».Когда я нажимаю «Открыть», мое приложение запускается.До этого момента все работает без каких-либо проблем.

  2. Теперь в моем приложении я нажимаю на кнопку, и в результате происходит некоторая загрузка (отображается диалоговое окно прогресса).Теперь я нажимаю кнопку «Домой», поэтому мое приложение переходит в фоновый режим.

  3. Теперь я снова запускаю свое приложение, зайдя внутрь меню и нажав на значок моего приложения.

  4. Ожидаемый результат — Все еще я должен увидеть диалоговое окно прогресса загрузки. Фактический результат — запускается новый экземпляр / сеанс моего приложения.

Итак, как избежать этого, чтобы запускался только один экземпляр / сеанс моего приложения.

Ответ №1:

@Palejandro, вот ты где. Поместите приведенный ниже код в свой метод main activity onCreate() :

 // Possible work around for market launches. See
// http://code.google.com/p/android/issues/detail?id=2373
// for more details. Essentially, the market launches the main activity
// on top of other activities.
// We never want this to happen. Instead, we check if we are the root
// and if not, we finish.
if (!isTaskRoot()) {
    final Intent intent = getIntent();
    final String intentAction = intent.getAction();
    if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) amp;amp; intentAction != null amp;amp; intentAction.equals(Intent.ACTION_MAIN)) {
        Log.w(TAG, "Main Activity is not the root. Finishing Main Activity instead of launching.");
        finish();
        return;
    }
}
  

Я использовал этот фрагмент кода в своих проектах, и он отлично работает!

Комментарии:

1. не могли бы вы, плз, объяснить, что такое флаг isTaskRoot? Как, что и когда установить?

2. Это означает, что текущая активность является корневой активностью текущей задачи. Другими словами, оно было запущено с флагом FLAG_ACTIVITY_NEW_TASK: goo.gl/QFkjp

3. Это спасло мне жизнь.

4. Спасибо! Это было именно то, что мне было нужно. Эта ОС продолжает меня удивлять…

Ответ №2:

Я считаю, что вам нужно поместить

 <activity
    android:launchMode="singleInstance"
</activity>
  

в файле манифеста.

Ответ №3:

что делают ваши OnPause , OnResume и OnCreate ? Готов поспорить на деньги, что вы ничего не сохраняете на Pause и все время запускаете новый экземпляр через onCreate.

Вам следует прочитать примечания к жизненным циклам активности.

Комментарии:

1. Я не могу рекомендовать читать и перечитывать эту ссылку новым разработчикам Android. Вам нужно это изучить.

2. Вышеописанный сценарий двух экземпляров приложения не произойдет, если я напрямую запущу свое приложение в Eclipse с USB, подключенным к устройству. В этом случае мое приложение запускается автоматически. Мне не нужно копировать файл .apk на карту памяти и вручную устанавливать его.

3. вы видите два отдельных действия, когда заходите в диспетчер задач? возможно, вы видите два разных действия, потому что вы устанавливаете как отладочный apk, так И релизный apk. Затем у вас может быть 2 варианта одного и того же действия.

Ответ №4:

Если вы еще не разобрались с этим, я бы сказал, что ваше приложение фактически отключается при нажатии кнопки home, или, возможно, у вас ошибка, которая не фиксируется на любом объекте, поддерживающем состояние.

Комментарии:

1. Извините, это не относится к проблеме этого парня. Обычно это связано с мастером установки.

Ответ №5:

// поместите приведенный ниже код в действие запуска перед вызовом super и setcontentview ()

ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);

     // get the info from the currently running task
    List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(10);
    boolean alreadyTask=false;
    for(ActivityManager.RunningTaskInfo info : taskInfo){
        ComponentName componentInfo = info.topActivity;
        String value= componentInfo.getPackageName();
        if(value.contains(getPackageName()) amp;amp; !info.topActivity.getClassName().contains(getPackageName() ".LauncherActivity")){
            alreadyTask=true;
            Log.i(TAG, "second instance found!!!");
            break;
        }
    }

    if(alreadyTask){
        finish();
    }
  

Ответ №6:

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

Быстрый способ обойти проблему — не нажимать «Открыть» после установки приложения. Нажмите «Готово», а затем найдите приложение самостоятельно.

Смотрите: http://code.google.com/p/android/issues/detail?id=2373