长话短说,我正在为 Amazon Kindle开发一个多活动应用程序。Kindle 有一个有点异国情调的启动器,它不支持(正确)中的多个LAUNCHER
活动manifest
,所以如果您在子活动中,请转到主屏幕,然后再次按下应用程序图标,子活动被杀死并且主要活动重新启动。
我有 2 个活动:ACTIVITY_PLAY 和 ACTIVITY_DESIGNER。典型的会话从 ACTIVITY_PLAY 开始,然后用户可能会去 ACTIVITY_DESIGNER 做一些工作。此活动由 ACTIVITY_PLAY 实例化。如果他/她离开应用程序片刻(即检查邮件)然后尝试返回将导致 PLAY_MODE 启动。
为了解决这个问题,我创建了一个“启动器”活动(参见下面的源代码),它现在是唯一的应用程序入口点。此活动决定是否启动 ACTIVITY_PLAY 或 ACTIVITY_DESIGN 取决于我从这些活动的“onResume”更改的静态值:收到的最新 onResume 是用户正在处理的最后一个活动。
我的问题是,现在当我在启动器中选择应用程序图标时,它会启动正确的活动,但会重新启动它,即使所有涉及的活动都有android:launchmode = singleTask
. 并且所有涉及的活动都有相同的android:taskAffinity
。
有任何想法吗?用相同的 taskAffinity 声明 3 个活动(启动器/游戏/设计)是否正确?这不应该工作吗?
public class Launcher extends Activity {
private static final String TAG = "Launcher";
public static final int ACTIVITY_PLAY=1, ACTIVITY_DESIGN=2, ACTIVITY_QUIT=3;
private static int msFocused=FUNQ_PLAY;
private void launch() {
Bundle bundle=getIntent().getExtras();
switch (msFocused) {
case ACTIVITY_DESIGN:
Log.v(TAG, "*** Launcher launch DESIGNER");
Misc.runActivity(this, DesignActivity.class, bundle);
break;
case ACTIVITY_QUIT: // special code to quit instead of launching anything
finish();
setFocused(ACTIVITY_PLAY); // so next button press will launch play mode if the app is still alive
break;
case ACTIVITY_PLAY:
default:
Log.v(TAG, "*** Launcher launch PLAYER");
Misc.runActivity(this, PlayActivity.class, bundle);
break;
}
}
@Override
protected void onResume() {
super.onResume();
launch();
}
// called from the child activities' onResume.
public static void setFocused(int activityCode) {
Log.i(TAG, "*** CURRENTLY FOCUSED IS "+activityCode);
msFocused=activityCode;
}
}