Android 在超时警告通知后检索活动

Android 在超时警告通知后检索活动,android,android-webview,activity-lifecycle,onstart,Android,Android Webview,Activity Lifecycle,Onstart,我正在尝试实现超时通知。这是我想做的。如果应用程序进入后台状态,则在5分钟后应警告用户应用程序将被注销。在此通知之后,如果用户打开应用程序,它应该询问密码,如果用户输入正确的密码,它应该检索他5分钟前离开的屏幕。我的问题是,我无法保存用户在输入密码后为了检索而留下的活动。以下是我迄今为止所做的工作: 我在onSaveInstanceState()方法中添加了一个倒计时,并创建了一个当前意图的实例。然后在TimeOutActivity中,我定义了一个名为savedActivity的属性,以便在该实

我正在尝试实现超时通知。这是我想做的。如果应用程序进入后台状态,则在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的类来扩展应用程序。通过这个类,我可以用它们的setter和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内容(用户在超时之前交互的内容)。有什么想法吗?

首先,您应该使用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);

关于保存活动的完整状态,这实际上取决于您查看每个视图并保存状态。最好的方法是将其保存在特定的文件中,而不是保存在SharedReferences中,但两者都可以工作

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

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

这样做。

当应用程序在后台被终止时,您的savedinstance也将变为null。最好使用
SharedReferences
执行此操作,并在其中保存最后一个活动名称并从中检索。谢谢@BharathMg如果我只保存活动名称,它可以检索整个活动?请您解释一下好吗?您可以使用
Intent Intent=new Intent().setClassName(context,targetClassString)
将字符串类名转换为意图。targetClassString是您应该保存在
SharedReferences
@BharathMg中的活动的名称。在“我的活动”中,用户可以添加一些文本或更改背景色,此方法会将其与活动名称一起保存吗?