长话短说,我正在为亚马逊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;
}
}
答案 0 :(得分:1)
我设法解决了,希望它对某人有用。
Launcher: taskAffinity=".launcher" launchMode="normal"
Master Activity: taskAffinity=".workflow" launchMode="singleTop"
Child Activity: taskAffinity=".workflow" launchMode="singleTop"
从工作流任务中分离启动器,正常launchMode
似乎可以解决Kindle问题。 singleTop的东西特定于我的应用程序,可能与问题无关,但我最初也在启动器中使用了singleTop,这显然导致了我的问题的副作用。
答案 1 :(得分:0)
您可以使用SharedPreferences保存上一个状态,然后检查SharedPreferences以确定要启动的活动。我将在一分钟内添加一个示例代码。
编辑:以下是示例代码:
在您的启动器活动onCreateView函数中执行以下操作:
SharedPreferences reader = pActivity.getSharedPreferences( "PutDesiredPrefNameHere", Context.MODE_PRIVATE);
int lastState = reader.getInt( "LAST_STATE", 0 ); //if there is no last state saved it will return second parameter. 0 in this situation.
switch( lastState ){
case 0:
Intent i=new Intent( this, PlayModeActivity.class);
startActivity(i);
//Remove launcher activity
finish();
break;
case 1:
Intent i=new Intent( this, EditModeActivity.class);
startActivity(i);
//Remove launcher activity
finish();
break;
}
并在PlayModeActivity的onCreateView方法中调用:
SharedPreferences.Editor writer = pActivity.getSharedPreferences( "PutDesiredPrefNameHere" , Context.MODE_PRIVATE).edit(); //Don't forget pref names must be same
write.putInt( "LAST_STATE" ,0 );
write.comit();
并在您的EditModeActivity的onCreateView方法中调用:
SharedPreferences.Editor writer = pActivity.getSharedPreferences( "PutDesiredPrefNameHere" , Context.MODE_PRIVATE).edit(); //Don't forget pref names must be same
write.putInt( "LAST_STATE" ,0 );
write.comit();
以下是有关SharedPreferences的链接:
http://www.tutorialspoint.com/android/android_shared_preferences.htm