Android 在超时警告通知后检索活动
我正在尝试实现超时通知。这是我想做的。如果应用程序进入后台状态,则在5分钟后应警告用户应用程序将被注销。在此通知之后,如果用户打开应用程序,它应该询问密码,如果用户输入正确的密码,它应该检索他5分钟前离开的屏幕。我的问题是,我无法保存用户在输入密码后为了检索而留下的活动。以下是我迄今为止所做的工作: 我在onSaveInstanceState()方法中添加了一个倒计时,并创建了一个当前意图的实例。然后在TimeOutActivity中,我定义了一个名为savedActivity的属性,以便在该实例中传递当前活动Android 在超时警告通知后检索活动,android,android-webview,activity-lifecycle,onstart,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的类来扩展应用程序。通过这个类,我可以用它们的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中的活动的名称。在“我的活动”中,用户可以添加一些文本或更改背景色,此方法会将其与活动名称一起保存吗?