2

我正在尝试实施超时通知。这就是我想要做的。如果应用程序进入后台状态,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) 为空。我究竟做错了什么?有没有更好的方法来保存当前活动?

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;
    }
}

然后在 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 的实例,它不再为空,但它不包含 webView 内容(用户在超时之前交互的内容)有什么想法吗?

4

2 回答 2

1

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

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

然后,如果您需要通过您的应用程序完全重新创建实例以刷新 webView,您可以使用 finish(); 如果它在活动内部,或者如果您在另一个活动中并且您想重新创建您的 webView 活动,请阅读此链接以执行此操作。

于 2015-01-29T17:05:26.997 回答
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);

关于保存 Activity 的完整状态,这完全取决于您浏览每个 View 并保存状态。最好的方法是将它保存在一个特定的文件中,而不是保存在 SharedPreferences 中,但两者都可以工作。

于 2014-10-02T06:53:59.350 回答