我正在尝试实施超时通知。这就是我想要做的。如果应用程序转到后台心情,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内容(用户在超时之前进行交互的内容)的想法吗?
答案 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中,但两者都可以。