如何知道您何时因为后退按钮而返回活动



My MainActivity导致SecondActivity。如果用户按下手机的后退按钮,应用程序将返回到MainActivity。

发生这种情况时,我该如何执行?

(我知道我可以在SecondActivity中放入代码,为后退按钮添加功能,这样它就可以将结果传递给MainActivity,但我不想对所有可能返回MainActivity的屏幕都这样做。(

也许还有另一种提问方式,我怎么能知道MainActivity之所以显示是因为按下了后退按钮,而不是出于某种意图被正式请求的?

背景

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

  1. 当用户按下当前活动的后退键时,我们将记住该操作。

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

实施

步骤1.创建一个名为BaseActivity的基本活动类。应用程序中的每个活动都应该从此类扩展。

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

步骤2.创建一个从Application类扩展而来的名为MyApp的类。其目的是使用registerActivityLifecycleCallbacks(Application.ActivityLifecycleCall backs(监听应用程序的所有活动生命周期

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>

用法

MainActivity.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);
}
}

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

要检查活动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
}
}

如果实现了这3个部分,您不需要检查触发反按的活动,只需比较请求和结果代码

我希望这能有所帮助

最新更新