Получение активности после предупреждения об отключении времени

Я пытаюсь реализовать уведомление о тайм-ауте. Вот что я хочу сделать. Если приложение переходит в фоновое настроение, через 5 минут он должен предупредить пользователя о том, что приложение будет выписано. После этого уведомления, если пользователь открывает приложение, он должен запросить пароль, если пользователь вводит правильный пароль, он должен получить экран, который он оставил 5 минут назад. Моя проблема в том, что я не могу сохранить активность, которую пользователь оставил, чтобы получить после ввода пароля. Вот что я сделал до сих пор: Я добавил обратный отсчет внутри метода onSaveInstanceState() и создаю экземпляр текущего намерения. Затем в TimeOutActivity я определил свойство, называемое saveActivity, чтобы передать текущую активность в этом экземпляре.

private boolean isTimedOut;
private TimeOutActivity timOutActivity;
private CountDownTimer timer;

@Override
protected void onSaveInstanceState(Bundle state) 
{
    super.onSaveInstanceState(state);
    if (timOutActivity == null)
    {
        timOutActivity = new TimeOutActivity();
        timOutActivity.setIntent(new Intent(getApplicationContext(), TimeOutActivity.class));
        **timOutActivity.savedActivity = this;**
        initializeTimer();
    }
}
private void initializeTimer()
{
    timer = new CountDownTimer(60000, 1000)
    {        
        public void onTick(long millisUntilFinished)
        {
            if (millisUntilFinished / 1000 == 55)
            {
                showSignOutWarning();
                isTimedOut = true;
            }
        }

        public void onFinish()
        {
            // Push local notification
            isSignedOut = true;
        }
    }.start();
}

Затем в метод OnStart() я добавил следующий код:

@Override
public void onStart()
{
    super.onStart();
    if (isTimedOut)
    {
        // Load timedOut activity
        startActivity(timOutActivity.getIntent());
        isTimedOut = false;
    }
}

Но когда я хочу получить активность внутри TimeOutActivity, мое свойство (savedActivity) равно null. Что я делаю не так? Есть ли лучший способ сохранить текущую активность?

Обновление 31 октября 2014 года Я определил класс под названием: App.java, который расширяет приложение. В этом классе я могу определить глобальные переменные с их сеттерами и getter. Это как внизу

public class NGVApp extends Application
{
    private WebView webView;

    public WebView getWebView()
    {
        return webView;
    }

    public void setWebView(WebView webView)
    {
        this.webView = webView;
    }
}

Затем в AndroidManifest.xml в теге приложения я добавил это

android:name="your.app.bundle.name.App"

Затем в моем методе WebViewActivity onStop() я устанавливаю экземпляр webView, как показано ниже:

((App) this.getApplication()).setWebView(webView); 

И, наконец, в методе onCreate() я добавил:

@Override
    protected void onCreate(Bundle savedInstanceState)
    {
        if(((NGVApp) this.getApplication()).getSavedInstanceBundle() != null)
        {
            savedInstanceState = ((NGVApp) this.getApplication()).getSavedInstanceBundle();
        }
}

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

Ответ 1

Наконец, я понял решение. Невозможно сохранить состояние WebView и иметь весь контент, поэтому нам нужно предотвратить перезагрузку или воссоздание webView. Чтобы иметь один экземпляр нашей деятельности, который содержит webView, мы должны добавить следующий код в наш файл манифеста:

<activity ...
        android:launchMode="singleInstance"
        android:alwaysRetainTaskState="true">

Затем, если через ваше приложение вам нужно было полностью воссоздать экземпляр, чтобы обновить webView, вы можете использовать finish(); если он находится внутри действия или если вы находитесь в другом действии и хотите воссоздать активность в веб-браузере, прочитайте эту ссылку, чтобы сделать это.

Ответ 2

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

Intent intent = new Intent(context, YourNotifService.class);
PendingIntent pendingService = PendingIntent.getService(context, 0, intent, 0);
AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
long triggerTime =  SystemClock.elapsedRealtime()  + (5 * 60 * 1000);
alarm.set(AlarmManager.ELAPSED_REALTIME, triggerTime, pendingService);

О сохранении полного состояния вашей деятельности, которое действительно зависит от вас, чтобы просмотреть каждый вид и сохранить состояние. Лучший способ - сохранить его в определенном файле, а не в SharedPreferences, но оба могут работать.