Android finish方法后代码还会执行?

本文详细介绍了 Android 开发中 Activity 的两种关键方法:finish() 和 onDestory()。finish() 方法用于关闭当前 Activity 并将其从栈中移除,但并不立即释放资源;onDestory() 则标志着 Activity 的彻底销毁,其占用的资源也被回收。

Activity.finish()

Call this when your activity is done and should be closed.
在你的activity动作完成的时候,或者Activity需要关闭的时候,调用此方法。
当你调用此方法的时候,系统只是将最上面的Activity移出了栈,并没有及时的调用onDestory()方法,其占用的资源也没有被及时释放。因为移出了栈,所以当你点击手机上面的“back”按键的时候,也不会再找到这个Activity。
Activity.onDestory()
the system is temporarily destroying this instance of the activity to save space.
系统销毁了这个Activity的实例在内存中占据的空间。
在Activity的生命周期中,onDestory()方法是他生命的最后一步,资源空间等就被回收了。
当重新进入此Activity的时候,必须重新创建,执行onCreate()方法。

 

 

 

注:出自网络。感谢原作者的分享!

<think> 我们已知用户的问题:如何监听Activity finish执行退出动画? 从引用内容中,我们可以得到以下相关信息: 1. 引用[1]提到了通过一个集合来管理所有Activity,当需要退出所有Activity时遍历集合并finish。但用户需求是监听单个Activityfinish执行退出动画。 2. 引用[2]提到在Application中注册ActivityLifecycleCallbacks,这样可以监听所有Activity的生命周期。因此,我们可以利用这个回调来监听Activityfinish事件(即onActivityDestroyed),但注意:finishActivity会经历onPause, onStop, onDestroy,而退出动画应该在Activity结束前执行(比如在onStop或onPause中执行?),但用户希望在finish执行退出动画,这个时机需要明确。 3. 引用[3]展示了在Activity中重写onBackPressed方法实现双击退出,并在其中执行finish。这里我们可以得到启发:如果我们想要在Activity结束时执行一个退出动画,可以在finish之后(或者之前)执行一个动画,但注意,finish之后Activity会立即销毁,所以动画应该在finish之前执行,或者通过延迟执行(但延迟执行可能会因为Activity销毁而导致问题)。 4. 引用[4]提到通过广播来通知所有Activity退出,但用户需求是单个Activity结束时的退出动画。 实际上,执行退出动画的标准做法是在调用finish()之后立即调用overridePendingTransition方法。这个方法用于设置Activity进入和退出的动画。但是,用户提到“监听Activity finish后”,这个时机实际上是在finish方法被调用之后。然而,overridePendingTransition必须在finish()之后立即调用,且不能在finish()之前调用。 因此,解决方案是在调用finish()之后紧接着调用overridePendingTransition来设置退出动画。 但是,用户可能是在问:如何监听一个Activityfinish(可能是由其他逻辑触发,比如点击返回键、或者调用了finish())并执行退出动画?实际上,当我们需要在Activity结束时使用退出动画,我们通常就是在finish()后面直接加上overridePendingTransition。所以,我们可以在以下地方添加: 1. 如果用户点击了返回键(系统返回键),我们可以重写onBackPressed方法,在调用super.onBackPressed()(或者finish())之后,调用overridePendingTransition。但是注意,overridePendingTransition必须在finish()之后立即调用。 2. 如果是在代码中调用了finish(),那么我们可以在每个调用finish()的地方后面都加上overridePendingTransition。但是这样比较繁琐,而且容易遗漏。 另一种方法:我们可以创建一个基类Activity,在基类中重写finish方法,在finish方法执行退出动画,然后调用super.finish()。但是注意,overridePendingTransition必须在finish()之后调用,而重写finish方法时,我们在super.finish()之后写的代码可能不会被执行(因为Activity已经销毁)。所以,正确的做法是在super.finish()之后立即调用overridePendingTransition。 但是,根据Android文档,overridePendingTransition方法必须在startActivity(Intent)或finish()之后立即调用,且仅对当前Activity有效。 因此,我们可以在基类中重写finish方法,如下: ```java @Override public void finish() { super.finish(); overridePendingTransition(R.anim.enter_anim, R.anim.exit_anim); } ``` 但是,这里有一个问题:当调用super.finish()后,Activity会立即销毁,那么overridePendingTransition还能生效吗?实际上,overridePendingTransition是立即调用的,它告诉系统在Activity退出时使用指定的动画。所以,这样写是可行的。 然而,需要注意的是,overridePendingTransition必须紧跟在finish()或startActivity()之后调用。所以,在基类的finish方法中这样写是符合要求的。 另外,对于用户按返回键的情况,我们同样可以在onBackPressed中处理,但是如果我们已经在finish方法中统一处理了,那么在onBackPressed中我们只需要调用finish()即可,因为按返回键默认会调用finish()。但是,如果我们重写了onBackPressed,并且没有调用super.onBackPressed()(它会调用finish()),那么我们就需要自己调用finish(),这样也会触发我们重写的finish方法。 因此,我们可以在基类Activity中这样写: ```java public class BaseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void finish() { super.finish(); // 设置退出动画 overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right); } @Override public void onBackPressed() { super.onBackPressed(); // 这会调用finish() // 或者直接调用finish(); } } ``` 这样,无论是通过代码调用finish(),还是通过按返回键(调用了super.onBackPressed(),而它内部会调用finish()),都会执行我们重写的finish方法,从而设置退出动画。 注意:overridePendingTransition的两个参数分别是下一个Activity进入的动画和当前Activity退出的动画。如果只想设置退出动画,可以把第一个参数设为0(没有进入动画),第二个参数设为退出动画的资源ID。 另外,如果用户希望在Activityfinish后(即已经销毁后)再执行一些操作(比如播放一个声音等),那么可以使用ActivityLifecycleCallbacks监听onActivityDestroyed,但是此时Activity已经销毁,不能再执行动画了。所以,退出动画必须在finish的同时设置。 因此,回答用户问题:监听Activity finish执行退出动画,实际上我们不需要监听,而是应该在finish的同时设置退出动画。我们可以通过重写Activityfinish方法,并在其中调用overridePendingTransition来实现。 如果用户希望在不同的Activity中使用不同的退出动画,可以在子类中重写finish方法,但记得调用super.finish(),或者不调用而自己处理,但这样会破坏统一管理。另一种做法是在基类中定义一个方法提供动画资源,由子类重写。 例如: ```java public class BaseActivity extends AppCompatActivity { @Override public void finish() { super.finish(); overridePendingTransition(getEnterAnimation(), getExitAnimation()); } protected int getEnterAnimation() { return R.anim.slide_in_left; // 默认进入动画 } protected int getExitAnimation() { return R.anim.slide_out_right; // 默认退出动画 } } ``` 然后在子类中重写getExitAnimation方法返回自定义的退出动画。 综上所述,我们不需要监听finish事件,而是主动在finish时设置动画。 因此,回答如下: </think> 在Android中监听Activity的`finish()`后执行退出动画,可以通过以下方法实现: ### 解决方案(使用`overridePendingTransition`) 在调用`finish()`后立即使用`overridePendingTransition`方法指定退出动画: ```java // 在需要结束Activity的地方(如按钮点击/返回键) finish(); // 结束当前Activity overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right); // 设置动画 ``` #### 参数说明: 1. **第一个参数**:新Activity进入动画(当前场景无用可设为`0`) 2. **第二个参数**:当前Activity退出动画(需自定义) --- ### 完整实现步骤 1. **创建退出动画资源** 在`res/anim/`目录下创建动画XML文件(如`slide_out_right.xml`): ```xml <!-- slide_out_right.xml --> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="300" android:fromXDelta="0%" android:toXDelta="100%"/> </set> ``` 2. **在基类Activity中统一处理**(推荐) 创建`BaseActivity.java`继承`AppCompatActivity`: ```java public class BaseActivity extends AppCompatActivity { @Override public void finish() { super.finish(); // 设置退出动画(0表示无进入动画) overridePendingTransition(0, R.anim.slide_out_right); } } ``` 3. **让所有Activity继承基类** ```java public class MainActivity extends BaseActivity { // 业务逻辑无需修改finish() } ``` --- ### 其他场景处理 1. **监听返回键退出动画** 重写`onBackPressed()`: ```java @Override public void onBackPressed() { finish(); // 触发基类的动画逻辑 } ``` 2. **使用Activity生命周期监听** 通过`Application.registerActivityLifecycleCallbacks`全局监听(适用于跨Activity操作): ```java public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityDestroyed(@NonNull Activity activity) { if (activity instanceof MainActivity) { // 可在此执行全局操作 } } // 其他生命周期方法需空实现... }); } } ``` --- ### 注意事项 1. **调用顺序** `overridePendingTransition()`必须紧跟在`finish()`或`startActivity()`之后调用 2. **动画资源** 退出动画需使用`android:toXDelta="100%"`(从右滑出)或`android:toYDelta="100%"`(下滑出) 3. **兼容性** 此方案支持所有Android版本,无需额外权限 > **提示**:若需定制不同Activity的动画效果,可在子类重写`finish()`方法并调用`super.finish()`前修改动画资源[^1][^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值