2013-08-16 2 views
2

Я пишу приложение, которое устанавливает сеанс с веб-сайтом (сохранение куки-файлов в запросах). Контекст сеанса (объект, который контролирует все запросы) фактически хранится в члене класса приложения (мне нужно, чтобы все действия и службы могли получить доступ к этому объекту для извлечения данных).Как предотвратить андроид уничтожить мое приложение?

Но теперь, моя проблема заключается в следующем:

Когда я выход из Aplication (минимизируя или нажав на кнопку назад) мое приложение умирает, я имею в виду, выходы процесса и приложение уничтожается ... так , когда снова запускается приложение, необходимо снова войти в систему ...

Вопрос в том, может ли он поддерживать мое приложение в памяти во время сеанса?

Я думаю, хранить файлы cookie сеансов в SharedPreferences - это не очень хорошая идея, потому что я хочу использовать независимую реализацию контекста сеанса от android.

Спасибо.

ответ

0

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

Существует несколько сценариев, в которых ваша деятельность уничтожена из-за обычного поведения приложения, например, когда пользователь нажимает кнопку «Назад» или ваша активность сигнализирует о своем собственном разрушении, вызывая финиш(). Система также может уничтожить вашу деятельность, если она в настоящее время остановлена ​​и не использовалась в течение длительного времени, или для работы переднего плана требуется больше ресурсов, поэтому система должна отключить фоновые процессы для восстановления памяти.

http://developer.android.com/training/basics/activity-lifecycle/recreating.html

1

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

Операционная система Android автоматически удалит приложения из памяти, поскольку для этого требуется больше ресурсов.

Ваш лучший выбор: сохраните информацию о файлах cookie внутри файла в папке с данными Apps и прочитайте его, когда приложение запустится.

Использование состояния сохранения позволит избежать потери данных, если Android закрывает ваше приложение (нехватка ресурсов, бездействие).

public class MyActivity extends Activity { 
    public String cookieString; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Set Layout 
     setContentView(R.layout.main); 

     if(savedInstanceState!=null) { 
      // App has been closed by the OS before and is now being restored 

      // read your data here from the bundle 
      String cookieData = savedInstanceState.getString("CookieData"); 
      if(!TextUtils.isEmpty(cookieData)) { 
       cookieString = cookieData; 
      } 
     } else { 
      // App is newly started or has been closed by user (i.e. via finish()) 

      // Your code to read the cookie saved in a text file. 
     } 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) { 
     String cookieData = savedInstanceState.getString("CookieData"); 
     if(!TextUtils.isEmpty(cookieData)) { 
      cookieString = cookieData; 
     } 
     super.onRestoreInstanceState(savedInstanceState); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     // Save the critical data 
     outState.putString("CookieData", cookieString); 
     super.onSaveInstanceState(outState); 
    } 
} 

Это позволит вам сохранить данные куков, когда приложение получает приостановлено или свести к минимуму и восстановить его, когда App получить восстановлено тоже. Кроме того, когда пользователь входит в систему, вы должны также записывать данные cookie в файл и читать, когда Bundle пуст и если файл существует.

+0

I думаю, я могу переделать часть текущего кода, чтобы реализовать этот путь. –

0

eco system android имеет правило, согласно которому каждое приложение будет умирать в определенных случаях, в то время как один из них работает в фоновом режиме, а другое приложение работает на переднем плане.

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

here's Дополнительная информация о процессах на android.

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

вы также можете избежать прямого закрытия приложения при нажатии на кнопку «Назад», вызывая moveTaskToBack, когда вызывается onBackPressed. он не заставляет вас не убивать ваше приложение, но может потребоваться немного больше времени, чтобы его убить.

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

0

Пожалуйста, проверьте Не сохранять действия опция отключена в настройках -> Параметры разработчика -> на правой боковой панели можно найти флажок, под названием: Не сохранять действия

0

У вас нет для добавления дополнительного кода для этого нужно упомянуть

android:persistent="true" 

В вашем манифесте, который должен выполнять эту работу. Ниже приведен пример применения манифеста, который я тестировал

<application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/Theme.AppCompat" 
     android:persistent="true" 
     tools:ignore="AllowBackup,GoogleAppIndexingWarning"> 
     <activity 
      android:name="com.yours.yoursonly.youractivity" 
      android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     </application> 

Если вы хотите узнать подробнее, я сам ответил в одном из постов

Prevent activity from being destroyed as long as possible

Я надеюсь, что это помогает

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