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);
}
}
分享到:
相关推荐
7. **FLAG_ACTIVITY_REORDER_TO_FRONT** 如果目标Activity已经存在于栈中,这个标志会将其移动到栈顶,但不会清除它上面的Activity。 8. **FLAG_ACTIVITY_NO_HISTORY** 设置这个标志,新启动的Activity将不会在...
这是一个小项目,用于演示通过正常调用 startActivity 在活动之间切换工作正常,但是当我在 PendingIntent 中发送带有该标志的意图然后调用mPendingIntent.send()该标志似乎是忽略:-(。 与 startActivity 一起快乐...
- **FLAG_ACTIVITY_REORDER_TO_FRONT**:如果Activity已经存在于栈中,将其移动到栈顶,但不会清除栈上其他Activity。 3. **Intent传值的影响**: - `Intent`可以通过`putExtra()`方法传递各种类型的数据,如字符...
以上所述,通过合理使用`FLAG_ACTIVITY_REORDER_TO_FRONT`和`FLAG_ACTIVITY_CLEAR_TOP`标志,以及重写`onNewIntent()`方法,我们可以避免频繁调用`onCreate()`,提高Activity之间的切换效率。同时,自定义动画能提供...
4. `FLAG_ACTIVITY_REORDER_TO_FRONT`:如果目标Activity已经在栈中,将其移动到栈顶,但不会清除其他Activity。 例如,如果我们希望在点击某个按钮时,即使当前Activity已经在栈中,也总是创建一个新的实例,可以...
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...
如果多个Activity的Intent Filter得分相同,系统还会参考Intent的FLAG_ACTIVITY_*标志,比如FLAG_ACTIVITY_REORDER_TO_FRONT、FLAG_ACTIVITY_CLEAR_TASK等,来决定最终启动哪个Activity。 此外,`ActivityInfo`类...
而FLAG_ACTIVITY_REORDER_TO_FRONT可以将Activity移动到栈顶,但不创建新的实例。 最后,我们需要注意避免内存泄漏和栈溢出问题。长时间持有Activity引用可能导致内存泄漏,影响应用性能。而无限制地创建Activity...
14. `FLAG_ACTIVITY_REORDER_TO_FRONT`:将栈中已存在的Activity移到栈顶,使其可见。 15. `FLAG_ACTIVITY_RESET_TASK_IF_NEEDED`:如果Activity在一个新任务中启动,但又可以在现有任务堆栈中找到,那么它会被置于...
5. **FLAG_ACTIVITY_REORDER_TO_FRONT**: 如果目标Activity已经在栈中,此标志会将它移动到栈顶,但不调用onNewIntent()。适用于希望Activity保持状态并迅速回到前台的情况。 6. **使用Extra数据进行区分**: 即使...
例如,`FLAG_ACTIVITY_REORDER_TO_FRONT`会将Activity移动到栈顶,而不需要创建新实例;`FLAG_ACTIVITY_CLEAR_TOP`会清除栈中位于目标Activity之上的所有Activity。 了解这些启动模式后,开发者可以根据应用场景...
6. **FLAG_ACTIVITY_REORDER_TO_FRONT**: 这个标志会将目标Activity移动到栈顶,即使它已经在栈中,但不是栈顶。这与FLAG_ACTIVITY_SINGLE_TOP不同,后者仅在Activity已经位于栈顶时调用onNewIntent()。 通过理解...
4. **服务重启**:对于后台运行的服务,我们可以通过设置Intent.FLAG_ACTIVITY_REORDER_TO_FRONT,确保服务在被杀死后能重新启动。同时,需要在服务的onStartCommand()方法中返回START_STICKY或START_NOT_STICKY,以...
此外,还可以利用FLAG_ACTIVITY_SINGLE_TOP或FLAG_ACTIVITY_REORDER_TO_FRONT等标志来控制Activity的启动模式,避免不必要的创建和销毁过程。 总之,理解并掌握Activity的工作原理和生命周期,以及如何高效地使用...
通过设置Intent的Flags,如FLAG_ACTIVITY_NEW_TASK或FLAG_ACTIVITY_REORDER_TO_FRONT,可以改变Activity的栈管理行为。 3. **Activity生命周期**:Activity的生命周期包括了onCreate(), onStart(), onResume(), ...
Intent Flag可以在跳转时改变Activity的行为,例如`FLAG_ACTIVITY_REORDER_TO_FRONT`可以使已存在的Activity移动到栈顶,避免重复创建;`FLAG_ACTIVITY_SINGLE_TOP`则允许新Intent唤醒栈顶的相同Activity,而不是...
为了避免这种情况,可以使用`FLAG_ACTIVITY_SINGLE_TOP` 或 `FLAG_ACTIVITY_REORDER_TO_FRONT` 来控制Activity的行为。 另外,对于某些特殊场景,如登录状态的检查,我们可能需要在用户点击通知后先验证其登录状态...
Android translate动画、scale动画、alpha动画、rotate切换动画和Activity动画效果实例,包括了...如果Activity已经启动,并且intent加了FLAG_ACTIVITY_REORDER_TO_FRONT,这样不会新启动Activity,也就没有动画效果。