2014-09-16 4 views
4

Кордовы, версия 3.5.0-0.2.6App ведет себя иначе после выхода и повторного входа

<body><script> 
    alert("documentready"); 
    document.addEventListener("deviceready", function() { 
      alert("deviceready"); 
      }, false); 
</script></body> 

Я вхожу в приложение после развертывания, я получаю «documentready» и «deviceready» оповещен. Я оставляю приложение с помощью кнопки «Назад». Я получаю только документ. Когда я принудительно закрываю приложение с помощью диспетчера задач или повторно развертываю его, я получаю оба предупреждения.

Я хочу, чтобы такое поведение произошло также после обычного повторного входа в приложение.

Я бы предпочел решение, в котором нет доказательств того, что приложение было открыто до того, как я его покину. Ничего не восстановлено из коллекции мусора и т. Д. Идеально выполняет тот же журнал, что и метод force-close из диспетчера задач.


OK: Я хочу, когда я закрыть мое приложение с помощью кнопки возврата, что точно такие же бывает, когда я открыть диспетчер задач и заставить мое приложение, чтобы закрыть. Возможно, это теоретически возможно?

В качестве альтернативы, я хотел бы, чтобы приложение, оставленное с помощью кнопки «Назад», находилось в состоянии «спящего режима», чтобы, если я снова его вхожу, он ведет себя абсолютно так, как никогда не осталось (звонок как при нажатии кнопки меню/дома).


ВОПРОС ЕЩЕ ОТКРЫТ - 50RS BOUNTY ЗАРАБОТАТЬ

+2

Похоже http://docs.phonegap.com/en/3.0.0/cordova_events_events.md.html#deviceready событие будет работать при PhoneGap (Кордова) был загружен. Если вы повторно запускаете приложение, Android, возможно, не убил или не убрал его, поэтому нет смысла ожидать, что это произойдет снова, пока не будет убито и не заработает. Может быть, вы должны называть финиш() в своем паспорте активности ... Но смотрите OUT! возможно, не то, что вы хотели! – eduyayo

+3

Вы должны использовать событие 'resume' для действий, которые должны срабатывать после того, как приложение перешло из фона: http://docs.phonegap.com/en/3.5.0/cordova_events_events.md.html#resume – Turnip

+0

@ eduayo: Uncaught ReferenceError: финиш не определен. – Ferenjito

ответ

1

Я не уверен, почему вы хотите, такое поведение, но вы можете убить приложение на задней прессе (или на финише). Вызов android.os.Process.killProcess(android.os.Process.myPid()) - это как принудительная остановка от диспетчера задач.

Добавьте это в CordovaActivity и он должен убить все без каких-либо остатков:

@Override 
public void onBackPressed() { 
    android.os.Process.killProcess(android.os.Process.myPid()); 
    System.exit(0); 
} 
+0

Нет, как я уже сказал выше, если я нажму, я оставлю приложение, но его не убивают. При повторном входе в приложение это не сработает, если я не закрою его с помощью диспетчера задач. (Вот почему я хочу такое поведение). – Ferenjito

+0

Я знаю об этом - я говорю, что вы должны явно называть 'killProcess()', когда пользователь нажимает назад, чтобы воспроизвести поведение kill менеджера задачи. Это решит вашу проблему. – nitzanj

+0

Хорошо, так как я не делал в Java на Android, не могли бы вы рассказать мне, где включить фрагмент кода с 'killProcess()'? – Ferenjito

0

Я реализовал то же самое, я использовал это событие BackButton от Кордовы. Вы можете узнать больше об этом событии: link. Я не могу найти документацию о функции app.exitApp(), но я знаю, что он доступен только для android и amazon-fireos.

См. Фрагмент кода ниже, вам нужно только знать, когда вы хотите выйти, но вы можете знать это из объекта document.location или что-то в этом роде. Надеюсь, поможет.

document.addEventListener("backbutton", function (evt) { 
    // replace this with some logic (maybe document.location) to now if you are on the main page or not 
    if (true) { 
     // Check if methods exists 
     if (typeof navigator.app !== "undefined" && typeof navigator.app.exitApp !== "undefined") { 
      evt.preventDefault(); 
      navigator.app.exitApp(); 
     } 
    } else { 
     history.back(); 
    } 
}, false); 
+0

К сожалению, это не убивает приложение. Это значит, что когда я вернусь и снова запустил приложение, у меня возникла проблема. – Ferenjito

+0

Вы действительно выполнили приложение app.exitApp()? Потому что он должен работать (он делает для меня), deviceready выполняется, и я запускал свой всплывающий экран при запуске. Можете ли вы обновить свой основной пост с помощью версии cordova? –

+0

Я уверен, что выполняется app.exitApp(). Если я отброшу это, приложение просто ничего не делает, когда я его оставляю. Я обновил основную должность, моя версия Кордовы - 3.5.0-0.2.6 – Ferenjito

1

Добавьте к этому ваш mainActivity.java (независимо от того, что называется в проекте):

@Override 
public void onBackPressed() { 
    finish(); 
} 
+0

публичный класс MyApp расширяет CordovaActivity { public void onCreate (Bundle savedInstanceState) { супер.OnCreate (savedInstanceState); super.init(); super.loadUrl (Config.getStartUrl()); } public void onBackPressed() { finish(); } }
К сожалению, это ничего не меняет. – Ferenjito

+0

он по-прежнему будет отображаться в списке taskmanager, но при повторном запуске его следует обрабатывать по-другому. – benka

+0

нет, это не :( – Ferenjito

0

Это должно работать:

В my_app_dir-> конфигурации.XML добавить

<preference name="KeepRunning" value="false" /> 

И ниже

document.addEventListener("deviceready", function() {...

добавить

document.addEventListener('backbutton', function() {      
     navigator.app.exitApp(); 
    }, false); 

Затем откройте cmd, перейдите в папку проекта и запустить cordova build android; cordova run --device android;

+0

К сожалению, он все еще не работает :( – Ferenjito

0

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

function domIsReady() { 
    alert('DOM is ready') 
} 

function deviceIsReady() { 
    alert('Device is Ready') 
} 

(function() { 
     if (document.readyState === "complete") { 
      domIsReady(); 
     } else { 
      if (window.addEventListener) { 
       window.addEventListener('DOMContentLoaded', domIsReady, false); 
      } else { 
       window.attachEvent('onload', domIsReady); 
      } 
     }; 
     document.addEventListener("deviceready", deviceIsReady, true); 
    }()); 
+0

извините, все еще не работает – Ferenjito

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