1

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

LocationService扩展ServicestartForeground带有通知。该服务刚刚启动LocationListener并注册每个新的 GPS 定位点。该服务似乎工作得很好,如果我触摸通知图标,它会将我带回到我的应用程序活动从它开始的地方(而不是从登录活动)。

现在这是问题所在,如果我触摸应用程序图标(在 Android 启动器上),它有时会将我的应用程序启动到右侧和当前 activty RouteActivity,但大约 1 小时后,如果我触摸应用程序图标,它只会从头重新启动应用程序并启动LoginActivity.

但是,如果我触摸我的服务通知,如果让我回到右侧和后台活动。我的服务也没有被杀死,从来没有,所以它似乎工作得很好,与应用程序相关的对象和变量仍然存在。

所以呢 ?我有 2 个我的应用程序正在运行?我对这个有点迷茫,尤其是它似乎与时间有关。

这个“错误”是在 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前台服务失去上下文 但我认为这是真正的问题并且更准确。

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

4

2 回答 2

1

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

我倾向于这样做的方式是让您的主要活动成为您希望用户在登录后看到的活动。onCreate()检查用户是否已登录,如果未登录,则将startActivityForResult()其发送到登录活动。将登录状态保留在某处,以便您可以在主要活动的onCreate().

于 2012-09-26T17:44:17.353 回答
0

我终于解决了我的问题。现在,活动是否被杀死并不重要,只要服务还活着就可以了。在我的LoginActivity检查中,我检查我的服务是否正在运行,如果它正在运行,我将启动RouteActivity绑定到它的singleTop. Si 我总是有它的单一和相同的实例。

@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); 
    }
于 2012-09-28T14:52:34.113 回答