以编程方式恢复子活动

时间:2014-08-12 17:40:49

标签: android android-activity kindle taskaffinity

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

}

2 个答案:

答案 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