需求:一个账户先在A设备登录,然后在B设备上登录,这时候需要给A上的账户推送透传消息logout,进行挤掉下线。下面是一些个人思考,抛砖引玉,真心想知道企鹅的下线是怎么做的。
百度推送架子已经搭完,只需要在onMessage()中接收logout,开始进行下线通知处理---弹框给用户两条路,改对话框不能取消,不能点其他地方消失。那么,问题来了:线程1,挖掘机到底哪家强。。。线程2,你不知道用户当前在哪个Activity上下文,想要弹框,两种方案
1、每个activity都标配一个对话框,不管用工具类还是在每个activity类直接new 对话框,反正得埋伏一对话框。
2、不管用户当前在哪个activity,统一跳转到MainActivity,在MainActivity上弹框。QQ就是这种,跳转到主页后,弹框。
第一种方案我没试,说一下第二种方案吧。
--------跳转
尝试1,直接在Receiver中跳转
Intent i = new Intent();
i.putExtra("logout", true);
i.setClass(context.getApplicationContext(), MainFrameBasicActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//在Service或Receiver中跳转,这种flag是必须的
context.getApplicationContext().startActivity(i);
新问题出现了,我的MainFrameBasicActivity的launchMode是标准模式,new task跳转完可以出现qq这种弹框效果,但是点退出,框消失页面关闭,出现的还是MainFrameBasicActivity页面,就是这次跳转新建了一个MainFrameBasicActivity页面实例,但是原来的实例同样存在。
这种情况点击重新登录后还是正常流程,不过总感觉有个影子在盯着你,不过用户感受不到,前提是点击退出的时候能全退。发广播方式退出可以全退。
尝试2,不直接在Receiver中处理,接到推送后,发出跳转广播
第一、用户当前在不在主页activity
if(NSCConstants.MAINFRAME_ON_TOP){
Intent intent = new Intent();
intent.setAction(NSCConstants.ACTION_MAINFRAME); //
context.sendBroadcast(intent);// 主页下线通知广播
} else{
Intent intent = new Intent();
intent.setAction(NSCConstants.ACTION_BACK_TO_MAIN); //
context.sendBroadcast(intent);// 跳转到主页广播
}
在的话,直接弹框;不在就跳转,带上标记数据
第二、如果项目中的每个Activity都继承了BaseActivity,直接在BaseActivity中:1、定义广播实例;2、注册广播;3、解除广播;
第三、特殊处理
现在想一个问题:正常打开软件进入MainActivity,点击什么进入BActivity,在B中点击什么进入CActivity,过程中没有使用finish(),现在内存中有三个Activity:Main、B、C。现在推送下线标记,虽然C在最前端,但B、C都会跳转的(我的项目Main没有继承BaseActivity,也没有注册跳转广播),B、C、跳转后,就产生了两个弹框的MainActivity。所以,如果一个项目纵向只有两层Activity,上面步骤就够了;但如果有三层及以上,就需要使用标记(C是否在最前端)做特殊处理了:在BActivity的广播接受者中,如果C在最前端,直接return;否则就跳转。
---------跳转完,弹框,点退出,发退出广播即可。