奇怪的行为:首次使用FLAG_ACTIVITY_NEW_TASK启动时,活动无法再次启动

时间:2015-06-19 12:09:59

标签: java android android-intent android-activity

我的情景是,

当应用程序启动时,用户登录后我将按以下方式启动活动,

Intent rangeFinderScreen = new Intent(YourLocationScreen.this, RangeFinderScreen.class);
rangeFinderScreen.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(rangeFinderScreen);

我正在使用Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK,以便清除所有先前的活动堆栈并将其作为新任务启动。

然后我有底栏在活动之间导航,所以我做了一个共同的监听器(Activity)并在所有活动中实现了它。它看起来如下,

public class CommonListenerForBottomButtons extends Activity implements View.OnClickListener{

    Context context;
    String buttonName;

    public CommonListenerForBottomButtons(Context context, String buttonName){
        this.context = context;
        this.buttonName = buttonName;
    }

    @Override
    public void onClick(View v) {
        switch(buttonName){
            case "play":
                Intent rangefinder = new Intent(context, RangeFinderScreen.class);
                rangefinder.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(rangefinder);
                break;

                // and so on more cases

        }
    }
}

如果我第一次开始活动时,我会执行以下操作,

Intent rangeFinderScreen = new Intent(YourLocationScreen.this, RangeFinderScreen.class);
startActivity(rangeFinderScreen);

然后一切正常

但如果我按照以下方式(就像我现在所做的那样),即使用rangeFinderScreen.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

然后活动再次开始

但是,如果我从任何其他活动开始活动而不是像

这样的公共监听器活动
Intent rangefinder = new Intent(MyGolflerScreen.this, RangeFinderScreen.class);
startActivity(rangefinder);

然后开始

修改

以下是我在所有活动中初始化Common Listener的方法:

homeLinearLayout.setOnClickListener(new CommonListenerForBottomButtons(getApplicationContext(), "home"));
playLinearLayout.setOnClickListener(new CommonListenerForBottomButtons(getApplicationContext(), "play"));
weatherLinearLayout.setOnClickListener(new CommonListenerForBottomButtons(getApplicationContext(), "weather"));
messageLinearLayout.setOnClickListener(new CommonListenerForBottomButtons(getApplicationContext(), "message"));
myGolflerLinearLayout.setOnClickListener(new CommonListenerForBottomButtons(getApplicationContext(), "mygolfer"));

除了最初以标志Intent.FLAG_ACTIVITY_NEW_TASK开始的那个活动之外,所有其他活动都会开始。

清单文件条目

<activity
    android:name=".RangeFinderScreen"
    android:label="@string/title_activity_range_finder_screen"
    android:screenOrientation="portrait" >
</activity>

2 个答案:

答案 0 :(得分:0)

从应用程序中的其他活动启动活动时,请勿设置标记Intent.FLAG_ACTIVITY_NEW_TASK。这不是必要的,可能会导致您的问题。

此外,如果您每次用户点击某个按钮时都开始新的Activity,您会发现每次都会创建这些活动的新实例,并且最终将会有大量的这些活动。一会儿。这可能也不是所希望的行为。要在可能已在任务堆栈中的活动之间切换,您可以设置标记Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

答案 1 :(得分:0)

如果您关心的是管理所有堆栈,我更愿意使用所有&#34; singleTop&#34;活动并以旗帜Intent.FLAG_ACTIVITY_CLEAR_TOP开始 它将管理您想要做的所有事情。

您可以在Manifest内部活动代码中添加launchMode,该代码等于"singleTop"

希望它有效......