Giter VIP home page Giter VIP logo

broadcastbestpractice's Introduction

BroadcastBestPractice

Android 广播强制下线

新建ActivityCollector类和BaseActivity类

ActivityCollector用于管理活动, BaseActivity作为所有活动的父类,这在之前有讲过,可 以查看ActivityTest

实现登录功能

1.新建LoginActivity,修改活动的布局activity_login.xml,并在AndroidManifest.xml中将其修改为主活动;

2.修改MainActivityactivity_main.xml加入强制下线功能;需要注意的是我们是通过广播实现前置下线的,在这里,为了保证强制下线的功能功能能不会依附于任何一个界面,我们将其定义在BaseActivity里。

强制下线的广播

具体查看下列代码,需要注意的是这里的广播注册和取消注册是在onResume()和onPause()这两个生命周期函数的,这样做是为了保证只有处在栈顶的活动才能接受到这条广播。具体代码如下

public class BaseActivity extends AppCompatActivity {

    private ForceOfflineReceiver receiver;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityCollector.addActivity(this);
    }

    @Override
    protected void onResume() {
        //在这里注册广播是保证只有处于栈顶的活动才能收到强制下线的广播
        super.onResume();
        IntentFilter intentFilter= new IntentFilter();
        intentFilter.addAction("lyp.com.broadcastbestpracticce.FORCE_OFFLINE");
        receiver = new ForceOfflineReceiver();
        registerReceiver(receiver,intentFilter);//注册广播
    }

    @Override
    protected void onPause() {
        super.onPause();
        if(receiver!=null){
            unregisterReceiver(receiver);
            receiver=null;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ActivityCollector.removeActivity(this);
    }

    class ForceOfflineReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(final Context context, Intent intent) {
            AlertDialog.Builder builder = new AlertDialog.Builder(context);
            builder.setTitle("警告");
            builder.setMessage("你已经被强制下线,请重新尝试登陆。");
            builder.setCancelable(false);
            builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    ActivityCollector.finishAll();//销毁所有活动
                    Intent intent1=new Intent(context,LoginActivity.class);
                    context.startActivity(intent1);//重新启动LoginActivity
                }
            });
            builder.show();
        }
    }
}

最终运行截图:

login1 login2 login3

添加记住密码的功能,采用SharedPreferences存储

封装了一个关于 SharedPreferences 的工具类preUtils,同时修改了LoginActivity和布局文件,具体修改可见代码提交历史,关于SharedPreferences在另外一个项目SharePreferencesTest中讲解。 运行结果:

saves1 saves2 saves3

broadcastbestpractice's People

Contributors

ordinarylyp avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.