`
enuoCM
  • 浏览: 21450 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

FLAG_ACTIVITY_REORDER_TO_FRONT之ANR问题(Android L)

阅读更多
Issue: https://code.google.com/p/android/issues/detail?id=169768

问题摘要:
===============================================================
1)The app starts with Activity A, which simply shows a button called "Launch B". 2)Press this button -- this executes startActivity(FLAG_ACTIVITY_REORDER_TO_FRONT, ActivityB.class). 3)Activity B becomes active, which do some UI and backhand loading operation on UI thread. 4)After pressing back from Activity B, OnBackPressed Of Activity B, this executes startActivity(FLAG_ACTIVITY_REORDER_TO_FRONT, ActivityA.class). 5)Activity A's onResume() is called as expected and everything looks fine (I can see Activity A content again). 6)Press the device's Back key and App freezes for around 10 seconds or more and comes out of application. Without calling onPause(), onDestroy(). (So it may be anr with certain logs) 7)Sometime or may be repeating same above step for 4-5 times it also unfortunately force close googlequicksearchbox

After looking at system logs: found some important logs:

E/ActivityManager( 958): Reason: Input dispatching timed out (Waiting because no window has focus but there is a focused application that may eventually add a window when it finishes starting up.)
===============================================================

解决方式(workaround):
在FLAG_ACTIVITY_REORDER_TO_FRONT的目标Activity的onNewIntent中用FLAG_ACTIVITY_NEW_TASK start一个创建即消失的activity

示例:
 @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
         if ((intent.getFlags() & Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
          Intent trickIntent = new Intent(context, TrickActivity.class);
         trickIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         startActivity(trickIntent);
         }
    }

其中
public class TrickActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        finish();
    }

    @Override
    public void finish() {
        super.finish();
        // disable the animation
        overridePendingTransition(0, 0);
    }
}


分享到:
评论

相关推荐

    android Intent.FLAG大全

    7. **FLAG_ACTIVITY_REORDER_TO_FRONT** 如果目标Activity已经存在于栈中,这个标志会将其移动到栈顶,但不会清除它上面的Activity。 8. **FLAG_ACTIVITY_NO_HISTORY** 设置这个标志,新启动的Activity将不会在...

    switchactivities:从 PendingIntent 发送时,演示 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 的小项目不起作用

    这是一个小项目,用于演示通过正常调用 startActivity 在活动之间切换工作正常,但是当我在 PendingIntent 中发送带有该标志的意图然后调用mPendingIntent.send()该标志似乎是忽略:-(。 与 startActivity 一起快乐...

    Activity启动模式及Intent的Flag属性对Intent传值的影响

    - **FLAG_ACTIVITY_REORDER_TO_FRONT**:如果Activity已经存在于栈中,将其移动到栈顶,但不会清除栈上其他Activity。 3. **Intent传值的影响**: - `Intent`可以通过`putExtra()`方法传递各种类型的数据,如字符...

    Android编程实现两个Activity相互切换而不使用onCreate()的方法

    以上所述,通过合理使用`FLAG_ACTIVITY_REORDER_TO_FRONT`和`FLAG_ACTIVITY_CLEAR_TOP`标志,以及重写`onNewIntent()`方法,我们可以避免频繁调用`onCreate()`,提高Activity之间的切换效率。同时,自定义动画能提供...

    Android 改变Activity切换方式

    4. `FLAG_ACTIVITY_REORDER_TO_FRONT`:如果目标Activity已经在栈中,将其移动到栈顶,但不会清除其他Activity。 例如,如果我们希望在点击某个按钮时,即使当前Activity已经在栈中,也总是创建一个新的实例,可以...

    Android 两种启动模式的实例详解

    Intent的FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_REORDER_TO_FRONT Activity的两种启动模式:FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_REORDER_TO_FRONT 1. 如果已经启动了四个Activity:A,B,C和D。在D Activity...

    安卓Android源码——Activity设置相同的action进行判断源码.zip

    如果多个Activity的Intent Filter得分相同,系统还会参考Intent的FLAG_ACTIVITY_*标志,比如FLAG_ACTIVITY_REORDER_TO_FRONT、FLAG_ACTIVITY_CLEAR_TASK等,来决定最终启动哪个Activity。 此外,`ActivityInfo`类...

    多个Activity跳转的小结

    而FLAG_ACTIVITY_REORDER_TO_FRONT可以将Activity移动到栈顶,但不创建新的实例。 最后,我们需要注意避免内存泄漏和栈溢出问题。长时间持有Activity引用可能导致内存泄漏,影响应用性能。而无限制地创建Activity...

    Android activity堆栈及管理实例详解

    14. `FLAG_ACTIVITY_REORDER_TO_FRONT`:将栈中已存在的Activity移到栈顶,使其可见。 15. `FLAG_ACTIVITY_RESET_TASK_IF_NEEDED`:如果Activity在一个新任务中启动,但又可以在现有任务堆栈中找到,那么它会被置于...

    Android Activity设置相同的action进行判断源码.rar

    5. **FLAG_ACTIVITY_REORDER_TO_FRONT**: 如果目标Activity已经在栈中,此标志会将它移动到栈顶,但不调用onNewIntent()。适用于希望Activity保持状态并迅速回到前台的情况。 6. **使用Extra数据进行区分**: 即使...

    activity的启动方式

    例如,`FLAG_ACTIVITY_REORDER_TO_FRONT`会将Activity移动到栈顶,而不需要创建新实例;`FLAG_ACTIVITY_CLEAR_TOP`会清除栈中位于目标Activity之上的所有Activity。 了解这些启动模式后,开发者可以根据应用场景...

    Android Activity设置相同的action进行判断源码.zip

    6. **FLAG_ACTIVITY_REORDER_TO_FRONT**: 这个标志会将目标Activity移动到栈顶,即使它已经在栈中,但不是栈顶。这与FLAG_ACTIVITY_SINGLE_TOP不同,后者仅在Activity已经位于栈顶时调用onNewIntent()。 通过理解...

    android重启程序

    4. **服务重启**:对于后台运行的服务,我们可以通过设置Intent.FLAG_ACTIVITY_REORDER_TO_FRONT,确保服务在被杀死后能重新启动。同时,需要在服务的onStartCommand()方法中返回START_STICKY或START_NOT_STICKY,以...

    Android系统中的Activity探究.pdf

    此外,还可以利用FLAG_ACTIVITY_SINGLE_TOP或FLAG_ACTIVITY_REORDER_TO_FRONT等标志来控制Activity的启动模式,避免不必要的创建和销毁过程。 总之,理解并掌握Activity的工作原理和生命周期,以及如何高效地使用...

    模拟Activity进出栈

    通过设置Intent的Flags,如FLAG_ACTIVITY_NEW_TASK或FLAG_ACTIVITY_REORDER_TO_FRONT,可以改变Activity的栈管理行为。 3. **Activity生命周期**:Activity的生命周期包括了onCreate(), onStart(), onResume(), ...

    android开发页面跳转

    Intent Flag可以在跳转时改变Activity的行为,例如`FLAG_ACTIVITY_REORDER_TO_FRONT`可以使已存在的Activity移动到栈顶,避免重复创建;`FLAG_ACTIVITY_SINGLE_TOP`则允许新Intent唤醒栈顶的相同Activity,而不是...

    Android推送Activity跳转控制处理

    为了避免这种情况,可以使用`FLAG_ACTIVITY_SINGLE_TOP` 或 `FLAG_ACTIVITY_REORDER_TO_FRONT` 来控制Activity的行为。 另外,对于某些特殊场景,如登录状态的检查,我们可能需要在用户点击通知后先验证其登录状态...

    Android translate、scale、alpha、rotate切换Activity动画效果实例.rar

    Android translate动画、scale动画、alpha动画、rotate切换动画和Activity动画效果实例,包括了...如果Activity已经启动,并且intent加了FLAG_ACTIVITY_REORDER_TO_FRONT,这样不会新启动Activity,也就没有动画效果。

Global site tag (gtag.js) - Google Analytics