【问题标题】:How to finish multiple activities at once in android?如何在android中一次完成多个活动?
【发布时间】:2015-08-25 07:33:19
【问题描述】:

我的 Activity 流程像这样 ACTIVITY A -> ACTIVITY B -> ACTIVITY C -> ACTIVITY D。当用户在 Activity D 上并单击一个名为 exit 的按钮时,应用程序应该返回到 Activity B 并完成活动 C 和 D。我该怎么做?

注意:活动 B 和活动 D 是同一个类但不同的实例

【问题讨论】:

标签: android android-intent android-activity


【解决方案1】:

AndroidManifest.xml中,Activity B、C、D设置android:noHistorytrue,ActivityA设置为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>

退出Button

exitBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(getApplicationContext(),ActivityB.class);
        startActivity(intent);
        finish();
    }
});

【讨论】:

    【解决方案2】:

    相当复杂的解决方案,但允许完全操作 backstack。基本上在你Application中创建你自己的“backstack”:

    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)

    如果 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版本吗?谢谢
    【解决方案3】:

    只需将其添加到您的 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 个活动它会回到初始活动。
    【解决方案4】:

    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();
    }
    
    

    【讨论】:

    • 使用静态变量作为Activity非常危险!
    【解决方案5】:

    实现这一点的最佳和完整证明方法是创建扩展 android.app.Application 的 Application 类,并在那里维护您打开的 Activity 实例的列表。

    接下来是在 AndroidManifest.xml 中的&lt;application&gt; 中提及您创建的应用程序类名称

    然后你可以随时销毁打开的活动。

    【讨论】:

      猜你喜欢
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多