如何知道您何时因后退按钮返回到 activity?
How to know when you returned to an activity because of the back button?
我的 MainActivity 导致 SecondActivity。如果用户按下 phone 的后退按钮,应用程序将返回到 MainActivity。
发生这种情况时我该如何执行?
(我知道我可以在 SecondActivity 中添加代码以向后退按钮添加功能,以便将结果传递给 MainActivity,但我不想对每个可能返回 MainActivity 的屏幕都这样做。 )
也许是另一种提问方式,我怎么知道 MainActivity 正在显示是因为按下后退按钮而不是有意向地正式请求?
背景
我认为实现这个需求的逻辑是这样的:
当用户在当前 activity 上按下返回键时,我们会记住该操作。
当用户回到上一个activity,我们会检查是否有返回键按下动作退出。
实施
步骤 1. 创建一个名为 BaseActivity
的基地 activity class。您应用中的每个 activity 都应该从这个 class.
扩展
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. 创建一个名为 MyApp
的 class,它从应用程序 class 扩展而来。它的目的是通过使用 registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks)
来监听应用程序的所有 activity 生命周期
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) {
}
}
}
记得把这个class加到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);
}
}
编辑:检查是否有任何 activity (不知道是哪个) 返回到所需的 activity
要签入 Activity A,请使用:
@Override
protected void onResume() {
super.onResume();
// TODO: Work
}
如评论中所述,onResume
将在 activity/fragment 上调用,当:
- Activity 第一次运行
- Activity 重新成为焦点(来自另一个 activity、启动器、最近、另一个应用)
但是,您无法追踪是什么触发了它,也无法追踪它之前发生的事情。
------------ 已过时 ----------
在 Activity A 和 Activity B 之间
使用
startActivityForResult(intent, CHOOSE_AN_INT_VALUE_TO_INDICATE_IT_REQUESTS_FOR_BACK_PRESS);
在Activity A中,在Activity B中,使用
@Override
public void onBackPressed() {
setResult(CHOOSE_AN_INT_VALUE_TO_INDICATE_IT_CAME_FROM_BACK_PRESS);
finish();
}
然后再在ActivityA中,使用
@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个部分,就不需要检查是哪个activity触发了back press,直接比较request和result code就可以了
希望对您有所帮助!!
我的 MainActivity 导致 SecondActivity。如果用户按下 phone 的后退按钮,应用程序将返回到 MainActivity。
发生这种情况时我该如何执行?
(我知道我可以在 SecondActivity 中添加代码以向后退按钮添加功能,以便将结果传递给 MainActivity,但我不想对每个可能返回 MainActivity 的屏幕都这样做。 )
也许是另一种提问方式,我怎么知道 MainActivity 正在显示是因为按下后退按钮而不是有意向地正式请求?
背景
我认为实现这个需求的逻辑是这样的:
当用户在当前 activity 上按下返回键时,我们会记住该操作。
当用户回到上一个activity,我们会检查是否有返回键按下动作退出。
实施
步骤 1. 创建一个名为 BaseActivity
的基地 activity class。您应用中的每个 activity 都应该从这个 class.
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. 创建一个名为 MyApp
的 class,它从应用程序 class 扩展而来。它的目的是通过使用 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) {
}
}
}
记得把这个class加到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);
}
}
编辑:检查是否有任何 activity (不知道是哪个) 返回到所需的 activity
要签入 Activity A,请使用:
@Override
protected void onResume() {
super.onResume();
// TODO: Work
}
如评论中所述,onResume
将在 activity/fragment 上调用,当:
- Activity 第一次运行
- Activity 重新成为焦点(来自另一个 activity、启动器、最近、另一个应用)
但是,您无法追踪是什么触发了它,也无法追踪它之前发生的事情。
------------ 已过时 ----------
在 Activity A 和 Activity B 之间
使用
startActivityForResult(intent, CHOOSE_AN_INT_VALUE_TO_INDICATE_IT_REQUESTS_FOR_BACK_PRESS);
在Activity A中,在Activity B中,使用
@Override
public void onBackPressed() {
setResult(CHOOSE_AN_INT_VALUE_TO_INDICATE_IT_CAME_FROM_BACK_PRESS);
finish();
}
然后再在ActivityA中,使用
@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个部分,就不需要检查是哪个activity触发了back press,直接比较request和result code就可以了
希望对您有所帮助!!