当前位置: 首页 > 知识库问答 >
问题:

如何知道何时由于“后退”按钮而返回到活动?

林博厚
2023-03-14

我的主要活动导致第二个活动。如果用户按下手机的后退按钮,应用程序将返回主活动。

发生这种情况时,我如何执行某些操作?

(我知道我可以在SecondActivity中添加代码,将功能添加到back按钮,以便它将结果传递给MainActivity,但我不想在每个可能导致返回MainActivity的屏幕上都这样做。)

也许是另一种提问方式,我如何知道MainActivity是因为按下后退按钮而显示的,而不是因为有意图而被正式请求的?

共有2个答案

松铭
2023-03-14

编辑:检查是否有任何活动(不知道哪个)返回到所需的活动

要签入活动A,请使用:

@Override
protected void onResume() {
    super.onResume();
    // TODO: Work
}

如注释中所述,在以下情况下,将对活动/片段调用onResume:

  1. 活动首次运行
  2. 活动回到焦点(从另一个活动,启动器,最近,另一个应用程序

然而,您无法跟踪是什么触发了它,或者在它之前发生了什么。

---------- 过时的 ----------

在活动A和活动B之间

使用

startActivityForResult(intent, CHOOSE_AN_INT_VALUE_TO_INDICATE_IT_REQUESTS_FOR_BACK_PRESS);

在活动A和活动B中,使用

    @Override
    public void onBackPressed() {
        setResult(CHOOSE_AN_INT_VALUE_TO_INDICATE_IT_CAME_FROM_BACK_PRESS);
        finish();
    }

然后在活动A中再次使用

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == CHOOSE_AN_INT_VALUE_TO_INDICATE_IT_REQUESTS_FOR_BACK_PRESS && resultCode==CHOOSE_AN_INT_VALUE_TO_INDICATE_IT_CAME_FROM_BACK_PRESS) {
        // TODO: Do your work
    }
}

如果实现了这三个部分,您不需要检查哪个活动触发了回按,您可以简单地比较请求和结果代码

我希望这有帮助!!

子车峰
2023-03-14

出身背景

我认为以下是实现这一要求的逻辑:

>

当用户返回到上一个活动时,我们将检查是否有后退键按下操作退出。

实施

第一步。创建一个名为BaseActive的基本活动类。应用中的每个活动都应从此类扩展。

class BaseActivity extends AppCompatActivity {

    public static String IS_BACK_KEY_PRESSED = "IS_BACK_KEY_PRESSED";

    @Override
    public void onBackPressed() {
        // Remember the user's press of the back key action
        getIntent().putExtra(IS_BACK_KEY_PRESSED, true);

        // Call the super's method
        super.onBackPressed();
    }

    /**
     * Called when the activity has been resumed from an activity
     * that has been destroyed because of user's press of the back key
     */
    public void onGoBackFromAnotherActivity() {
    }
}

第二步。创建一个名为MyApp的类,该类从应用程序类扩展而来。其目的是通过使用registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks)侦听应用程序的所有活动生命周期

public class MyApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacksImpl());
    }

    private static final class ActivityLifecycleCallbacksImpl implements ActivityLifecycleCallbacks {
        boolean isBackKeyPressed = false;

        @Override
        public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
        }

        @Override
        public void onActivityStarted(@NonNull Activity activity) {
            if (activity instanceof BaseActivity) {
                if (isBackKeyPressed) {
                    ((BaseActivity) activity).onGoBackFromAnotherActivity();
                    isBackKeyPressed = false;
                }
            }
        }

        @Override
        public void onActivityResumed(@NonNull Activity activity) {
        }

        @Override
        public void onActivityPaused(@NonNull Activity activity) {
            if (activity instanceof BaseActivity) {
                Bundle data = activity.getIntent().getExtras();
                if (data != null) {
                    isBackKeyPressed = data.getBoolean(BaseActivity.IS_BACK_KEY_PRESSED);
                } else {
                    isBackKeyPressed = false;
                }
            }
        }

        @Override
        public void onActivityStopped(@NonNull Activity activity) {
        }

        @Override
        public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
        }

        @Override
        public void onActivityDestroyed(@NonNull Activity activity) {
        }
    }
}

请记住将此类添加到AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.kotlinapp">

    <application
        android:name=".MyApp"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".SecondActivity" />

    </application>

</manifest>

用法

美娜ctivity.java

public class MainActivity extends BaseActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onGoBackFromAnotherActivity() {
        // Your code logic goes here.
    }
}

SecondActivity.java

public class SecondActivity extends BaseActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }
}
 类似资料:
  • 嗨,我已经在应用程序抽屉中创建了片段,现在当我按下一个片段上的后退按钮时,它正在关闭应用程序。

  • 我有一个活动,当我的应用程序首次启动时开始(只有一次)。该活动允许用户选择主题。然后当他们按下完成键时,我完成了这项活动。这会将用户引导到主活动。但是当用户按下返回按钮时,它会返回到第一次启动的活动(我使用完成()关闭的活动)。但我想要的是,应用程序应该关闭时,用户按下返回按钮从主活动(总是)。我在两个类中都重写了onBackPress。 这两个类中的onBackPressed方法如下所示: 主活

  • 我试图用这段代码来显示我的个人档案活动: 当我点击Profile菜单项时,我可以看到我的ProfileActivity,但我的ActionBar上没有任何back按钮来返回我以前的活动。 那么,我如何显示一些后退按钮?我的代码是否正确以显示菜单中的活动?

  • 这显然是我在这里的第一篇文章...好吧,我的问题如下:@android:我有一个用户输入文本的文本编辑器,我通过getText()获取文本,一切正常,但当我按下后退按钮,再次返回到文本编辑器的相同活动并尝试再次获取文本时,它返回空字符串"",尽管文本编辑器视图中显示了不同的文本。会不会是文本编辑仍然与旧的关闭活动“相关或对应”?有什么想法吗? 然后在 AsynckTask 中,我将文本发送到发送,

  • 我正在使用android 2.1,希望在Mapsavity上添加一个后退按钮。我在这一页上尝试了什么[在操作栏上显示后退按钮,但应用程序崩溃。我已经按照另一个论坛的建议将extends FragmentActivity替换为AppCompatActivity,但应用程序仍然崩溃。我知道这与操作栏有关,因为如果我删除它,应用程序就会工作。操作栏似乎为空。我被卡住了,已经启动了应用程序数次。下面是错误

  • 我正在使用android导航组件库。我用导航图设置了两个片段。我想在我的片段内按下后退按钮时做一些额外的动作。 我使用这段代码来处理工具栏上的按钮点击,但我也想处理后退按钮按下。我该怎么做?