0

长话短说,我正在为 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;
    }

}
4

2 回答 2

1

我设法解决了它,希望它对某人有用。

Launcher: taskAffinity=".launcher" launchMode="normal"
Master Activity: taskAffinity=".workflow" launchMode="singleTop"
Child Activity: taskAffinity=".workflow" launchMode="singleTop"

将启动器从工作流任务中分离出来,正常launchMode似乎对 Kindle 有用。singleTop 特定于我的应用程序,可能与问题无关,但我最初也在启动器中使用了 singleTop,这显然导致了我的问题的副作用。

于 2014-08-12T21:24:38.900 回答
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

于 2014-08-12T17:44:28.137 回答