start Activity慢和finish Activity慢的原因

现有两个Activity, ActivityA和ActivityB.
1. 先说startActivity慢
    假如从ActivitA跳转到ActivityB很慢,大概5秒或更长, 两个Activity的生命周期大概是这样的:
    ActivityA: onPause()....然后等几秒后才执行onStop()
    这几秒钟在干吗呢?
    在执行ActivityB的onCreate(),onStart(),onResume()三个生命周期方法。完了再执行ActivityA的onStop();
    如果ActivityB的这三个生命周期方法没有做任何耗时事情,其实跳转是很快的。
	慢的原因就是在onCreae(),onStart(),onResume()三个生命周期方法中的其中一个做了耗时操作或者发了handler消息,
	然后在handler消息处理的地方做了耗时的事情。
	应对方案:
	1)不要在onCreate(),onStart(),onResume()中做任何耗时的事情
	2) 不要在onResume()发handler消息然后在handler中处理耗时工作。当然,如果只是发个handler处理简单逻辑是没问题的。系统要等待这个handler消息处理完了在往下走。
	2)如果要做耗时的事情(有些初始化工作必须要做),建议在onCreate()中发延时的handler消息,然后在handler消息接收中处理。
	startActivity慢跟ActivityA没多大关系。主要原因在你要跳转的那个ActivityB。
	
2. finish Activity慢
   接着前面说的,此时我们按back键从ActivityB退出到ActivityA, 大概也是5秒或更长,两个Activity的生命周期大概是这样的:
   ActivityB: onPause()....然后等几秒后才执行onStop(), onDestroy().
   这几秒钟在干吗呢?
   在执行ActivityA的onRestart(),onResume()两个生命周期方法。执行完了后再执行ActivityB的onStop()和onDestory();
   其实原因也是因为在onRestart()或onResume()做了耗时的操作,跟ActiviyB没多大关系。
   解决方案跟前面一样的,不要在onCreate(),onStart(),onResume()中做任何耗时的事情。
   另外,在退出ActivityB的时候,在onPause()中判断if(isFinishing()), remove所有handler消息,停掉长运行的子线程,把对象全部置为null(这样做其实没多大改善,只是能优化几毫秒也不能放过)
   finish ActivityB跟当前的ActivityB没多大关系,主要原因在你要返回的那个ActivityA. 网上说的那些要在finish的ActivityB中做各种回收,其实没点卵用。
   如果你从Launcher用命令启动ActivityB, 再按back键退出ActivityB, 即使不做任何回收操作,你会发现退出很快。因为launcher界面的onResume()没有任何耗时的操作。

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
startActivitystartActivityForResult是Android开发中常用的两个方法,它们的区别如下[^1]: 1. startActivity( ):这个方法用于启动另一个Activity,它不会自动返回到原来的Activity。如果需要返回到原来的页面,必须再次使用startActivity( )来启动原来的Activity。 2. startActivityForResult( ):这个方法也用于启动另一个Activity,但它可以在启动的Activity结束后返回结果给原来的Activity。在启动Activity时,可以传递一个请求码(requestCode),当启动的Activity结束后,可以通过onActivityResult( )方法获取返回的结果。 下面是一个示例代码,演示了startActivitystartActivityForResult的使用: ```java // 启动另一个Activity Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); // 启动另一个Activity并获取返回结果 Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivityForResult(intent, REQUEST_CODE); // 在启动的Activity中设置返回结果 Intent intent = new Intent(); intent.putExtra("result", "Hello World"); setResult(RESULT_OK, intent); finish(); // 在原来的Activity中获取返回结果 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) { String result = data.getStringExtra("result"); // 处理返回结果 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LakeSideHu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值