如何在Android中一次完成多个活动?

6
我有一个Activity流程,如下:ACTIVITY A -> ACTIVITY B -> ACTIVITY C -> ACTIVITY D。当用户在Activity D并点击名为“退出”的按钮时,应用程序应返回到Activity B并结束Activities C和D。我该怎么做?
注意:ACTIVITY B和ACTIVITY D是相同的类但不同的实例。

4
可能是如何在单个按钮点击后结束多个活动?的重复问题。 - Rohit5k2
请参考此链接:https://dev59.com/pHA75IYBdhLWcg3wOWRd - Rohit5k2
你可以在C活动上调用finish(),如果你在D上按返回键,它会回到B吗? - Smashing
@Vigor,你明白了,我该怎么做? - Earwin delos Santos
请查看我的答案。希望它能帮到你。;) - Vigor
显示剩余3条评论
5个回答

4
在AndroidManifest.xml中,将Activity B、C和D的android:noHistory设置为true。将Activity A的android:noHistory设置为false(实际上,默认值为false)。
示例:
<activity android:name=".xx.xx.ActivityA" 
    android:noHistory="false"
    android:screenOrientation="nosensor">
</activity>

<activity android:name=".xx.xx.ActivityB" 
    android:noHistory="true"
    android:screenOrientation="nosensor">
</activity>        

<activity android:name=".xx.xx.ActivityC" 
    android:noHistory="true"
    android:screenOrientation="nosensor">
</activity>

<activity android:name=".xx.xx.ActivityD" 
    android:noHistory="true"
    android:screenOrientation="nosensor">
</activity>

关于退出的 按钮:
exitBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(getApplicationContext(),ActivityB.class);
        startActivity(intent);
        finish();
    }
});

1

When you back from activity D and go to activity A then you need to use these code.
 1. First create the instance of all activity using this code.

Activity A{

}

Activity B{
public static Activity activityB;

oncreate(){
activityB=this;
}
Activity C{
public static Activity activityC;

oncreate(){
activityC=this;
}

Activity D{

}

2. Please call this method on back press in Activity D

private finishActivity(){
Clear the instance of middle activity.
 B.activityB.finish();
 C.activityC.finish();
  finish();
}


1
使用静态变量作为Activity非常危险! - famfamfam

1

这是一个相当复杂的解决方案,但允许完全操纵后退栈。基本上,在你的Application中创建自己的“后退栈”:

public class MyApplication extends Application {

    private Set<Activity> runningActivities = new HashSet<>();

    onCreate() {
        // ...
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                runningActivities.add(activity);
            }
            @Override public void onActivityDestroyed(Activity activity) {
                runningActivities.remove(activity);
            }
        });
    }

    public void killActivities(Set<Class<?>> activitiesToRemove) {
        for (Activity stackActivity : runningActivities) {
            if (activitiesToRemove.contains(stackActivity.getClass())) {
                stackActivity.finish();
            }
        }
    }
}

现在你可以在ActivityD中调用类似这样的代码:
((MyApplication)getApplication()).killActivities(ActivityD.class, ActivityC.class)
如果类不是唯一确定要删除的活动,可以使用Map而不是Set...
如果我的解决方案有问题,请纠正我,但似乎在您的活动中不应该有泄漏和样板文件。
编辑-Kotlin版本:
class MyApplication : Application() {

    private val runningActivities = mutableSetOf<Activity>()

    
    override fun onCreate() {
        // ...
        registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
            override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle) {
                runningActivities.add(activity)
            }
            override fun onActivityDestroyed(activity: Activity) {
                runningActivities.remove(activity)
            }
        })
    }

    fun killActivities(activitiesToRemove: Set<Class<Activity>>) {
        runningActivities.forEach { activity ->
            if (activitiesToRemove.contains(activity.javaClass)) {
                activity.finish()
            }
        }
    }
}

非常好。你能提供Kotlin版本吗?谢谢。 - famfamfam

0

只需将此添加到您的ActivityD.class中

 finishButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getApplicationContext(),ActivityB.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);

            finish();

        }
    });

希望能对你有所帮助!


无法使用5个活动,它会返回到初始活动。 - sushant singh

-2

最佳和完全可靠的实现方法是创建扩展android.app.Application的Application类,并在那里维护已打开活动实例的列表。

接下来,在AndroidManifest.xml中的<application>中提及您创建的Application类名称

然后,每当您需要时,可以销毁已打开的活动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接