应用程序在1小时后失去当前活动

时间:2012-09-26 17:03:41

标签: java android service android-activity multitasking

我的应用程序非常简单,我有一些活动(LoginActivity是启动器和主要活动)。然后我有一些其他活动,最后是一个启动服务的活动RouteActivity

LocationService扩展了ServicestartForeground并发出通知。该服务只需启动LocationListener并注册每个新的GPS位置点。 该服务似乎工作正常,如果我触摸通知图标,它会将我带回到我的应用程序活动(从登录活动开始)。

现在问题是,如果我触摸应用程序图标(在Android启动器上),它有时会将我的应用程序设置为正确且当前激活RouteActivity,但是大约1小时后,如果我触摸应用程序图标它只是从头开始重新启动应用程序并启动LoginActivity

但如果我触摸我的服务通知,请将我带回右侧和后台活动。 此外,我的服务没有被杀死,从来没有,所以似乎工作得很好,与应用程序绑定的对象和变量仍然存在。

那又怎样?我有2个应用程序运行实例?我有点迷失在这一点上,特别是它似乎与时间有关。

这个“bug”是在Android 2.X上产生的,我无法在Android 4.X上重现它。它有点难以调试,因为我必须让应用程序运行大约1小时。在那段时间之后,我在logcat中没有特殊的消息。

我注意到了一些事情: ActivityManager消息非常奇怪,如果我通过通知中心的服务通知启动我的应用程序,它会记录:

Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x14000000 cmp=com.wayzup.wayzupapp/com.wayzup.activity.RouteActivity bnds=[0,149][320,213]

如果我通过应用程序图标启动它,那么它会被记录,但显示的实际活动不是登录,而是实际启动服务的实际RouteActivity。 (大约1小时后,它实际上是LoginActivity开始的。)

 Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.wayzup.wayzupapp/com.wayzup.activity.LoginActivity bnds=[3,338][77,417] 

每次启动RouteActivity时,我都会有这个日志

Activity idle timeout for HistoryRecord{44e78808 com.wayzup.wayzupapp/com.wayzup.activity.RouteActivity}

这与我的其他问题有关:Android foreground service lose context 但我认为这是真正的问题而且更准确。

如果你愿意,我可以发布一些代码。

2 个答案:

答案 0 :(得分:1)

听起来你依靠活动任务堆来维持你的所有状态。我建议您使用类似PreferenceManager.getDefaultSharedPreferences()之类的东西来维护登录/注销状态。这样,如果它的活动被终止并重新创建,你就可以生存。

我倾向于这样做是让您的主要活动成为您希望用户在登录后看到的活动。在onCreate()检查用户是否已登录,如果没有,startActivityForResult()将它们发送到登录活动。将登录状态保留在某处,以便您可以在主活动的onCreate()中进行检查。

答案 1 :(得分:0)

我终于解决了我的问题。 现在无论活动是否被杀死都没关系,只要服务还活着就没关系。 在我的LoginActivity我检查我的服务是否正常,如果它正在运行,我会启动绑定到它的RouteActivitysingleTop。我总是有一个相同的实例。

@Override
public void onResume(){
        super.onResume();
        if (checkMyServiceRunningOrNot()){
            restoreAcitivty();
        }
    }

public void restoreAcitivty(){
        Intent intent = new Intent(this, RouteActivity.class); 
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent); 
    }