Android的广播机制实践--强制下线功能的实现

强制下线功能实现是关闭所有活动,回到登录界面。
先展示效果图:
这里写图片描述
这里写图片描述
点击off即可回到登录界面。
下面给出逻辑代码。
1.登录界面布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@drawable/a">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp">
        <TextView
            android:layout_width="80dp"
            android:layout_height="40dp"
            android:text="账号"
            android:textColor="#000000"
            android:textSize="35sp"/>

        <EditText
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_weight="1"
            android:hint="请输入账号"
            android:id="@+id/et_user"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp">
        <TextView
            android:layout_width="80dp"
            android:layout_height="40dp"
            android:text="密码"
            android:textColor="#000000"
            android:textSize="35sp"/>

        <EditText
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_weight="1"
            android:hint="请输入密码"
            android:id="@+id/et_password"/>
    </LinearLayout>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:id="@+id/btn_login"
        android:text="登录"/>

</LinearLayout>

2.登录的逻辑功能,这里我们规定用户名为admin,密码为12345,否则登录失败

public class loginActivity extends AppCompatActivity{
    private EditText tv_user,tv_pass;
    private Button btn_login;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login_layout);

        tv_user=(EditText)findViewById(R.id.et_user);
        tv_pass=(EditText)findViewById(R.id.et_password);
        btn_login=(Button)findViewById(R.id.btn_login);

        btn_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String user=tv_user.getText().toString();
                String pass=tv_pass.getText().toString();
                if(user.equals("admin")&&pass.equals("12345")){
                    startActivity(new Intent(loginActivity.this,ActivityText.class));
                    //ActivityText是一个只有一个 button的布局,点击button即可发送广播
                }else{
                    Toast.makeText(loginActivity.this, "账号或密码不正确", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

3.广播的发送

public class ActivityText extends BroadCast {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.off_layout);

        Button button=(Button)findViewById(R.id.btn_off);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent("com.exaple.loginOff");
                sendBroadcast(intent);
            }
        });
    }
}

4.广播接收及强制下线功能实现
强制下线需要关闭所有活动。先写一个实体类用来用来实现关闭活动的功能

public class ActivityCollector {
    public static List<Activity> sActivities=new ArrayList<>();
    public static void addACtivity(Activity activity){
        sActivities.add(activity);
    }

    public static void removeActivity(Activity activity){
        sActivities.remove(activity);
    }

    public static void finishiAll(){
        for(Activity activity:sActivities){
            if(!activity.isFinishing()){
                activity.finish();
            }
        }
        sActivities.clear();
    }
}

接下来就是广播接收和活动关闭。

public class BroadCast extends AppCompatActivity{
    @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("com.exaple.loginOff");
        registerReceiver(mBroadcastReceiver,intentFilter);
    }

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

//广播一接收就弹出一个dialog,点击ok按钮跳转到login界面,并且关闭所有活动。
    private BroadcastReceiver mBroadcastReceiver=new BroadcastReceiver() {
        @Override
        public void onReceive(final Context context, Intent intent) {
            AlertDialog.Builder builder=new AlertDialog.Builder(context);
            builder.setMessage("login off");
            builder.setTitle("warning");
            builder.setPositiveButton("ok", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    ActivityCollector.finishiAll();
                    startActivity(new Intent(context,loginActivity.class));
                }
            });
            builder.show();
        }
    };
}

广播的生命周期很短,一般不超过十秒,所以一般不在广播接收时实现太多的功能。

猜你喜欢

转载自blog.csdn.net/ayangann915/article/details/80594497