#android
#Android
Вопрос:
Вот моя проблема —
-
Я скопировал свой файл .apk на карту памяти телефона и запустил свое приложение, нажав на него, и это позволяет мне установить мое приложение.Я устанавливаю свое приложение.Наконец, я получил всплывающее окно установки системы, содержащее две опции «Открыть» и «Готово».Когда я нажимаю «Открыть», мое приложение запускается.До этого момента все работает без каких-либо проблем.
-
Теперь в моем приложении я нажимаю на кнопку, и в результате происходит некоторая загрузка (отображается диалоговое окно прогресса).Теперь я нажимаю кнопку «Домой», поэтому мое приложение переходит в фоновый режим.
-
Теперь я снова запускаю свое приложение, зайдя внутрь меню и нажав на значок моего приложения.
-
Ожидаемый результат — Все еще я должен увидеть диалоговое окно прогресса загрузки. Фактический результат — запускается новый экземпляр / сеанс моего приложения.
Итак, как избежать этого, чтобы запускался только один экземпляр / сеанс моего приложения.
Ответ №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