• 强制下线功能


    有需要可以去 https://github.com/L0ngD3/BroadcastBestPractice.git 下载

    1.首先创建一个类用来管理所有的活动。

     1 public class ActivityCollector {
     2     public static List<Activity> activities = new ArrayList<>();
     3     public static void addActivity(Activity activity){
     4         activities.add(activity);
     5     }
     6     public static void  removeActivity(Activity activity){
     7         activities.remove(activity);
     8     }
     9     public static void finishAll(){
    10         for (Activity activity : activities){
    11             if (!activity.isFinishing()){
    12                 activity.finish();
    13             }
    14         }
    15     }
    16 }

    2.创建一个类作为活动的父类

    public class BaseActivity extends AppCompatActivity {
        private ForceOffLine receive;
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ActivityCollector.addActivity(this);
        }protected void onDestroy() {
            super.onDestroy();
            ActivityCollector.removeActivity(this);
       
        }
    }

    3.创建登录的布局

     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     android:orientation="vertical"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent">
     5     <LinearLayout
     6         android:layout_width="match_parent"
     7         android:layout_height="90dp">
     8         <TextView
     9             android:layout_gravity="center_vertical"
    10             android:layout_width="wrap_content"
    11             android:layout_height="wrap_content"
    12             android:text="账号:"
    13             android:textSize="20dp"
    14             />
    15         <EditText
    16             android:id="@+id/account"
    17             android:layout_width="0dp"
    18             android:layout_height="wrap_content"
    19             android:layout_weight="1"
    20             android:layout_gravity="center_vertical"
    21             android:hint="请输入账号"
    22             />
    23     </LinearLayout>
    24 
    25     <LinearLayout
    26         android:layout_width="match_parent"
    27         android:layout_height="90dp">
    28         <TextView
    29             android:layout_width="wrap_content"
    30             android:layout_height="wrap_content"
    31             android:text="密码:"
    32             android:textSize="20dp"
    33             />
    34         <EditText
    35             android:id="@+id/password"
    36             android:layout_width="0dp"
    37             android:layout_height="wrap_content"
    38             android:layout_weight="1"
    39             android:hint="请输入密码"
    40             />
    41     </LinearLayout>
    42     <Button
    43         android:id="@+id/login"
    44         android:layout_width="match_parent"
    45         android:layout_height="wrap_content"
    46         android:text="登录"
    47         android:textSize="20dp"
    48         />
    49 </LinearLayout>

    4.创建一个类用来判断登录

    public class LoginActivity extends BaseActivity {
        EditText password;
        EditText account;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_lohin);

    //找到控件 account
    = (EditText) findViewById(R.id.account); password = (EditText) findViewById(R.id.password); Button login = (Button) findViewById(R.id.login);

    //登录 login.setOnClickListener(
    new View.OnClickListener() { @Override public void onClick(View v) { String admin= account.getText().toString().trim(); String pwd= password.getText().toString().trim(); if (admin.equals("")||pwd.equals("")){ Toast.makeText(getApplicationContext(),"帐号或者密码为空",Toast.LENGTH_SHORT).show(); }else if (admin.equals("admin")&&pwd.equals("123456")){ //实现跳转 在登录界面跳转到主函数上去 你可以将MainActivity理解为登录后的界面 Intent intent = new Intent(LoginActivity.this,MainActivity.class); startActivity(intent); }else { Toast.makeText(getApplicationContext(),"帐号或者密码错误",Toast.LENGTH_SHORT).show(); } } }); }

    5.在main布局中设置一个点击按钮,点击后就会跳转到登录界面

      <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="欢迎进入系统"
            android:textSize="30dp"
            android:textColor="#ff00"
           />
        <Button
            android:id="@+id/offLine"
            android:text="下线"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="20dp" />
    

     6.实现跳转就是发送了一条广播,所以我们创建广播接收器来接收这条广播,实现跳转,并且弹出对话框给出提示。修改BaseActivity类

     1 public class BaseActivity extends AppCompatActivity {
     2     private ForceOffLine receive;
     3     @Override
     4     protected void onCreate(@Nullable Bundle savedInstanceState) {
     5         super.onCreate(savedInstanceState);
     6         ActivityCollector.addActivity(this);
     7     }
     8 
     9 //注册活动
    10     protected void onResume() {
    11         super.onResume();
    12         //广播
    13         IntentFilter intentFilter = new IntentFilter();
            //添加我们所需要的广播
    14 intentFilter.addAction("com.example.a13522.xiaxian.FORCE_OFFLINE"); 15 receive = new ForceOffLine(); 16 registerReceiver(receive,intentFilter); 17 18 } 19 protected void onPause() { 20 super.onPause(); 21 if (receive!=null){ 22 unregisterReceiver(receive); 23 receive = null; 24 } 25 } 26 //取消 27 protected void onDestroy() { 28 super.onDestroy(); 29 ActivityCollector.removeActivity(this); 30 } 31 32 33 //定义广播 34 class ForceOffLine extends BroadcastReceiver{ 35 public void onReceive(final Context context, final Intent intent) {
              //实现tan框的功能
    36 AlertDialog.Builder builder = new AlertDialog.Builder(context); 37 builder.setTitle("警告"); 38 builder.setMessage("你的账户多地登录,请修改密码重新登录"); 39 builder.setCancelable(false);//false表示不可取消
              //创建点击按钮事件
    40 builder.setNegativeButton("OK", new DialogInterface.OnClickListener() { 41 @Override 42 public void onClick(DialogInterface dialog, int which) { 43 ActivityCollector.finishAll();//销毁所有活动 44 //从此界面跳转到登录界面 45 Intent intent= new Intent(context,LoginActivity.class); 46 //重新启动活动 47 context.startActivity(intent); 48 } 49 }); 50 builder.show(); 51 } 52 } 53 }

    最后在清单文件中设置主布局

     1 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     2     package="com.example.a13522.xiaxian">
     3 
     4     <application
     5         android:allowBackup="true"
     6         android:icon="@mipmap/ic_launcher"
     7         android:label="@string/app_name"
     8         android:roundIcon="@mipmap/ic_launcher_round"
     9         android:supportsRtl="true"
    10         android:theme="@style/AppTheme">
    11         <activity android:name=".MainActivity">
    12         </activity>
    13         <activity android:name=".LoginActivity">
    14             <intent-filter>
    15                 <action android:name="android.intent.action.MAIN" />
    16                 <category android:name="android.intent.category.LAUNCHER" />
    17             </intent-filter>
    18         </activity>
    19     </application>
    20 
    21 </manifest>

     执行过程:首先启动onCreate()和onResume()方法  创建活动和发送一条广播

    点击按钮后:执行onPause(),取消一下,因为广播发送后必须取消一下。

    在调用onCreate()和onResume()方法  创建活动和发送一条广播。点击下线并且点击了ok

    先调用onPause(),,取消一下上一步创建活动和发送一条广播。

    2.调用onCreate()和onResume()方法  创建活动和发送一条广播

    3.调用onDestroy()因为点击ok后销毁所有活动,销毁后它跳转到登录界面重新创建一个活动

  • 相关阅读:
    .NET经销商实战(七)——获取商品类型接口开发
    .gitignore规则不生效
    .NET经销商实战(五)——linq分页查询
    .NET经销商实战(十)——根据物品小类筛选数据
    .NET经销商实战(十二)——优化用户体验,完善产品列表查询
    .NET经销商实战(八)——前端界面代码改造
    .NET经销商实战(三)——md5加密,反射注入仓储与服务,及生成token
    Ubuntu 22.04 MacOS Monterey 主题
    Dart 语言之旅
    Docker storage drivers
  • 原文地址:https://www.cnblogs.com/lyl123/p/7160860.html
Copyright © 2020-2023  润新知