Android实现强制下线(不同应用之间)功能————简易微信聊天示例

具体需要看具体的实际情况,这是曾经遇到的问题以及解决方案

实现强制下线(不同应用之间)功能----简易微信聊天示例

强制下线功能需要先关闭所有活动,然后在回到登录界面。

新建一个ActivityCollector类管理所有活动下见代码段:

//需要用到一个专门的集合类对所有的活动进行管理
public class ActivityCollector {
    public  static List<Activity> activities = new ArrayList<>();//通过一个List来暂存活动

    public static void addActivity(Activity activity){
        activities.add(activity);//提供了一个addActivity()方法用于向List中添加一个活动
    }


    public static void removeActivity(Activity activity){
        activities.remove(activity);//提供了一个addActivity()方法用于从List中移除一个活动

    }

    public static void finishAll(){//finish()方法用于将List中存储的活动全部销毁掉
        for (Activity activity : activities){
            if (!activity.isFinishing()){
                activity.finish();
            }
        }
        activities.clear();
    }
}

BaseSActivity.java中调用ActivityCollector方法

 

首先需要我们希望在另外一个应用点击了[强制下线]的按钮时,当前应用不论在哪个页面,都可以接受到此类广播。如果在每个活动上都注册一个广播接受器时,常会导致代码冗余。

 

答案其实很明显,只需新建一个类(命名:BaseSActivity.java),注册一个广播接受器,并且,让所有活动都继承BaseSActivity.java这样强制下线的功能就不会依附任何界面

 

在同一个Model下的应用,接受广播是使用onResume()和onPause()方法注册和取消注册广播。因为页面跳转的时候,不会调用onPause()方法,可以实现需求。

 

如果在不同Model之间联系的应用,使用上述方法会出现问题。

采用动态注册的广播接受器

例如:一个应用:发送广播乙应用:接受广播

A应用发送广播,B应用等待接收。当执行切换程序(A→B)的操作时,系统就会调用的的onPause()方法。此时,广播已经被注销。在B应用也就无法接收来自甲应用的广播。

因此,选择在的的onCreate()和onDestory()方法执行广播的注册和注销。

 

以下是部分代码:

一个应用:发送广播

  forceOffline.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent =
                        new Intent("com.example.danser.mywechat.ForceOfflineReceiver");
                sendBroadcast(intent);

            }
        });

 

乙应用:接受广播

public class BaseActivity extends AppCompatActivity {

    private ForceOfflineReceiver receiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityCollector.addActivity(this);

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.danser.mywechat.ForceOfflineReceiver");//接受广播
        receiver = new ForceOfflineReceiver();//注册广播器
        registerReceiver(receiver,intentFilter);
    }


    @Override
    protected void onDestroy() {///取消注册广播器
        super.onDestroy();
        if (receiver != null){
            unregisterReceiver(receiver);
            receiver = null;
        }
        ActivityCollector.removeActivity(this);
    }


    class ForceOfflineReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(final Context context, Intent intent) {

                AlertDialog.Builder builder = new AlertDialog.Builder(context);//使用Builder构建一个对话框
                builder.setTitle("提示");
                builder.setMessage("你的微信号在其他设备上登录," +
                        "如不是本人操作,请及时更改密码!");
                builder.setCancelable(false);//将对话框设置为不可取消
                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        ActivityCollector.finishAll();//销毁所有活动
                        Intent i = new Intent(context, LoginActivity.class);
                        context.startActivity(i);//重启登录界面
                    }
                });
                builder.show();
            }
    }
}

 

接下来需要,好好补遗漏的知识了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值