以下是用例: 1.用户登录应用程序并按下硬件主页按钮,应用程序将被发送到后台 2.我在后台运行一个处理程序来检查不活动超时是否为5分钟。然后我需要调用logout API并启动loginactivity,不启动或将应用程序带到前台 这是我试过的
if (!mIsAppInForeground) {
Log.d("App in background", "App in background and timing out");
activity.startService(new Intent(activity,LogOutBackGroundService.class).addFlags( Intent.FLAG_ACTIVITY_MULTIPLE_TASK ));
}
public class LogOutBackGroundService extends Service {
public static final String HAS_SIGNED_OUT = "hasSignedOut";
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
intent.putExtra(HAS_SIGNED_OUT, true);
startActivity(new Intent(this, LoginActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
return START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
应用程序正常超时并且正在启动登录活动,但应用程序正处于前台(即应用程序正在启动)。我希望这只发生在后台。只有当用户重新启动应用程序时,他才会再次看到登录屏幕
答案 0 :(得分:0)
在典型的注销方案中,单击“注销”按钮应该只启动登录活动以清除登录详细信息。在您的情况下,在5分钟之后,您应该尝试清除存储的令牌以进行登录(假设您存储用户的登录详细信息以在需要时自动登录)。当用户下次启动应用程序时,您的LAUNCHER活动将检查存储的令牌以启动所需的活动。
答案 1 :(得分:0)
startactivity(intent)
弹出backstack活动或创建一个新活动(如果它不存在)。所以您的解决方案是onResume()
和onPause()
.. onPause()
在活动消失时调用,当你看到活动时调用onResume()
,所以我给你的建议是创建一个布尔值,它可以在一个单例类中
public class MySingletonClass {
public static boolean startloginpage; // by default its false
}
然后你进入主动或用户将启动或返回的活动,将代码放入其onresume
@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
if(MySingletonClass.startloginpage){ //check if your boolean is true
// if it checks out then call do what you want to do when the user times run out
}else{
// if it doesn't check out continue without telling user to login,
}
}
在您的服务中删除意图代码并将其放入
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
intent.putExtra(HAS_SIGNED_OUT, true);
MySingletonClass.startloginpage = true;
return START_NOT_STICKY;
}