首页 » 技术分享 » 实现一个类似QQ的强制下线功能

实现一个类似QQ的强制下线功能

 

此处UI界面并不会写的很好看,就是一个简单的类似于强制下线功能,要用到的类如下:
在这里插入图片描述
这些类的主要做用:

  • ActivityCollector:用来管理Activity,添加和删除,全部销毁。
  • BaseActivity:这是一个中间类,用来实现将创建好的Activity添加到ActivityCollector中,此类继承AppCompatActivity,并且广播接收器也是写在这个类中的。
  • LoginActivity:主要功能就是一个登录界面的实现。
  • MainActivity:点击按钮发送一条广播。

此处要注意的是MainActivity,LoginActivity都是继承BaseActivity的,因为BaseActivity是继承AppCompatActivity的,所以并不会影响这两个活动的正常使用。

将主活动设置为LoginActivity,就是应用启动打开的第一个界面是LoginActivity的内容。

代码如下:

ActivityCollector:

/**
 * 此类用来管理活动
 */

public class ActivityCollector {
    // 创建一个Activity的列表
    public static List<Activity> activities = new ArrayList<>();

    // 添加activity到activities中去
    public static void addActivity(Activity activity) {
        activities.add(activity);
    }

    // 将activity从activities中移除
    public static void removeActivity(Activity activity) {
        activities.remove(activity);
    }

    // 销毁所有的Activity,也就是将activities中的activity都移除
    public static void finishAll() {
        for (Activity activity : activities) {
            if (!activity.isFinishing()) {
                activity.finish();
            }
        }
    }

}

BaseActivity:

/**
 * 将此类做为所有Activity的父类,就可以轻松的管理Activity了
 */

public class BaseActivity extends AppCompatActivity {

    private ForceOfflineReceiver forceOfflineReceiver;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //将继承BaseActivity类的Activity添加到ActivityCollector的列表中去
        ActivityCollector.addActivity(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 将销毁的Activity从列表中移除
        ActivityCollector.removeActivity(this);
    }

    /**
     * 在应用重新开始时注册广播接收器
     * 在应用暂停时取消注册广播接收器
     * 这样的好处是始终保证只有处于栈顶的活动才能接收到com.my.force_line这条广播
     */


    // 应用重新开始时调用
    @Override
    protected void onResume() {
        super.onResume();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.my.force_line");
        forceOfflineReceiver = new ForceOfflineReceiver();
        registerReceiver(forceOfflineReceiver, intentFilter);
    }


    // 应用暂停时所调用
    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(forceOfflineReceiver);
    }


    // 创建一个广播接收器
    class ForceOfflineReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(final Context context, final Intent intent) {
            // 写一个强制下线的警告框
            AlertDialog.Builder builder = new AlertDialog.Builder(context);
            builder.setTitle("警告");
            builder.setMessage("你以被强制下线,请重新登录");
            //使此警告框无法被移除
            builder.setCancelable(false);
            builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                        // 销毁所有活动
                        ActivityCollector.finishAll();
                        // 重新启动LoginActivity
                    Intent intent = new Intent(context,LoginActivity.class);
                       context.startActivity(intent);
                }
            });
            builder.show();
        }
    }

}

LoginActivity:

public class LoginActivity extends BaseActivity {
    private Button btn_login;
    EditText et_account, et_password;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        btn_login = findViewById(R.id.login);
        et_account = findViewById(R.id.account);
        et_password = findViewById(R.id.password);

        btn_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 如果帐号等于liang,密码等于12345就登录成功
                if (et_account.getText().toString().equals("liang") && et_password.getText().toString().equals("12345")) {
                    Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                    startActivity(intent);
                }else {
                    Toast.makeText(LoginActivity.this, "帐号或密码错误", Toast.LENGTH_SHORT).show();
                }
            }
        });


    }
}

LoginActivity的xml代码:

<?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"
    >

    <EditText
        android:id="@+id/account"
        android:hint="请输入帐号"
        android:inputType="text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <EditText
        android:id="@+id/password"
        android:hint="请输入密码"
        android:inputType="textPassword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/login"
        android:text="登录"
        android:textSize="20sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

MainActivity:

public class MainActivity extends BaseActivity {
    private Button force_offline;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        force_offline = findViewById(R.id.btn_force_offline);

        // 点击按钮发送一个为com.my.force_line广播
        force_offline.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 此处的com.my.force_line是自定义的一个广播
                Intent intent = new Intent("com.my.force_line");
                // 发送广播,此处发送的是标准广播
                sendBroadcast(intent);
            }
        });
    }
}

MainActivity的xml代码:

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

    <Button
        android:id="@+id/btn_force_offline"
        android:text="强制下线"
        android:textSize="20sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

转载自原文链接, 如需删除请联系管理员。

原文链接:实现一个类似QQ的强制下线功能,转载请注明来源!

0