超时警告通知后检索活动

时间:2014-10-01 13:13:43

标签: android android-webview activity-lifecycle onstart

我正在尝试实施超时通知。这就是我想要做的。如果应用程序转到后台心情,5分钟后应该警告用户该应用程序将退出。在此通知之后,如果用户打开应用程序,它应该要求输入密码,如果用户输入正确的密码,它应该检索他5分钟前离开的屏幕。我的问题是我无法保存用户输入密码后要检索的活动。这是我到目前为止所做的: 我在onSaveInstanceState()方法中添加了一个倒计时,并创建了一个当前意图的实例。然后在TimeOutActivity中我定义了一个名为savedActivity的属性,以便传递该实例中的当前活动。

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。我究竟做错了什么?有没有更好的方法来保存当前活动?

2014年10月31日更新 我定义了一个名为App.java的类,它扩展了Application。通过这个类,我可以使用setter和getter定义全局变量。它就像轰鸣声

public class NGVApp extends Application
{
    private WebView webView;

    public WebView getWebView()
    {
        return webView;
    }

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

然后在Application标签的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的实例并且它不再为null但是它不包含webView内容(用户在超时之前进行交互的内容)的想法吗?

2 个答案:

答案 0 :(得分:1)

最后我找到了解决方案。无法保存WebView的状态并拥有所有内容,因此我们需要阻止重新加载或重新创建webView。为了让我们的活动的一个实例包含webView,我们应该将以下代码添加到我们的清单文件中:

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

然后,如果通过您的应用程序,您需要完全重新创建实例以刷新webView,您可以使用finish();如果它在活动内部,或者如果您正在进行其他活动,并且想要重新创建webView活动,请阅读this link来执行此活动。

答案 1 :(得分:0)

首先,您应该使用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中,但两者都可以。