要说onNewIntent(), 就不得不提到Activity的四种启动模式.分别是:
1, standard, 标准模式 (也是系统默认的模式)
每次都会新建Activity放置任务栈中.
2, singleTop 模式
这个模式能够确保每次使用的Activity都处于任务栈的栈顶.如果Activity已经处于栈顶则不再创建,否则会创建新的Activity实例并放置在栈顶.
3, singleTask 模式 - 常用的模式
如果当前栈中已经有该Activity ( 即使并不处于栈顶 ),则将该Activity之上的其他实例移除, 使它能处于栈顶.否则直接创建新的实例并放于栈顶.
4, singleInstance - 比较少用到
这个模式下会新建栈专门放Activity,使其他应用能够共享并访问该Activity.其他任何应用只要需要访问该Activity的实例都会进到该栈使用该Activity.
综合上面简述,singleTask是比较常用的模式, 因为它保证了栈中始终只有一个所访问的Activity实例,并且比较少存在其他没访问到的Activity.所以即使我们即使不是连续的多次访问某个Activity,也能保证它始终唯一.
而onNewIntent(Intent intent)方法就是提供给singleTask 模式这种特定实现的有效保持intent上下文的方法. 比如Activity A,首次访问A,并不会执行方法onNewIntent(), 而当用户退出A, 假如系统内存足够,没有在用户退出A之后Kill 掉A,而是短暂的继续保存A. 过了一小段时间,用户又打开A了, 这个时候A就会这么走: onNewIntent()---->onResart()------>onStart()----->onResume(). 当然,如果A已经被系统回收了, 用户再打开A的时候 A就会从onCreate() 走正常的生命周期了.
要注意的是, 使用onNewIntent()时, 方法体内要使用setIntent( Intent intent )将系统的intent重新给予A, 不然后面调用getIntent() 可能为空.