微信扫码直接跳转前台实现

微信在Mac、PC、浏览器都实现了扫码登录的功能,过程如下:

当用户已经使用过一次扫码登录后可以直接点击“Log in via My Phone”,微信服务器会向App发送通知,调用确认界面,用户点击“确认在PC上登录微信”,App向服务器确认请求,服务器响应Mac、PC的登录请求成功。

其中微信Android客户端的一个环节为抢占式弹出确认界面,这个过程参与实现的几个要点:Service、PendingIntent,但是还有一个关键点就是如果微信App 处于前台如何抢占式的将确认界面置为task stack的最上面?如果此Activity如果已经位于stack的任意位置如何保证single in task而且还能置于栈顶?

最近在看Android官方例子才发现Intent其实已经提供了相关的Flag来解答这个疑问。

public static final int FLAG_ACTIVITY_REORDER_TO_FRONT = 0X00020000;

Intent类中提供这样一个Flag,官方解释它的作用:当某个Intent增加这个Flag会导致将要运行的Activity从当前task stack中置为栈顶,当然了由于stack数据结构先入先出的定义只能是进行多次出栈入栈的reorder,如果stack中不存在就直接创建。回到微信那个例子,如果确认Activity在stack中已经存在那么它将被从stack的任意位置置于栈顶,如果stack中不存在确认Activity则在栈顶创建,这样就保证了无论微信是否在前台运行还是确认Activity是否在栈顶都能抢占式的弹出请用户确认此次登录行为。