• Android连载25-强制下线具体实现


    一、回顾

    • 上次连载写了两个类,一个类ActivityCollector.java用于管理所有的活动;一个类是BaseActivity.java作为所有活动的父类;
    • 还有一个放在layout目录中的登录界面login.xml

    二、登录页面的活动

    • 接下来写一个登录页面的活动,继承自BaseActivity.java
    package com.example.broadcastbestpractice;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    public class LoginActivity extends BaseActivity{
     private EditText accountEdit;
     
     private EditText passwordEdit;
     
     private Button login;
     
     @Override
     protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.login);
      accountEdit = (EditText)findViewById(R.id.account);
      passwordEdit = (EditText)findViewById(R.id.password);
      login = (Button) findViewById(R.id.login);
      login.setOnClickListener( new OnClickListener() {
       @Override
       public void onClick(View v) {
        String account =accountEdit.getText().toString();
        String password = passwordEdit.getText().toString();
        //如果账号是admin,密码是12345,就认为登录成功
        if(account.contentEquals("admin") && password.equals("12345")) {
         Intent intent = new Intent(LoginActivity.this,MainActivity.class);
         startActivity(intent);
         finish();
        }else {
         Toast.makeText(LoginActivity.this,"account or password is invalid",Toast.LENGTH_SHORT).show();
        }
       }   
      });   
     }
    }
    • 使用findViewById方法分别获取输入框以及登录按钮的实例
    • 然后设置点击事件:先判断账号和密码对不对,对了就是用intent实例进入到主活动中;错了就重新进入登录页面,并且打印出一条提示语。
    • 接着改造一下主界面,当然加上强制下线功能就行,不要其他花里胡哨的。
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <Button
            android:id="@+id/force_offline"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Send force offline broadcast" />
    
    </LinearLayout>
    • 非常简单,就是加了一个按钮
    • 接下来修改主活动的逻辑
    package com.example.broadcastbestpractice;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends Activity {
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      Button forceOffline = (Button) findViewById(R.id.force_offline);
      forceOffline.setOnClickListener(new OnClickListener() {
       @Override
       public void onClick(View v) {
        Intent intent = new Intent("com.example.broadcastbestpractice.FORCE_OFFLINE");
        sendBroadcast(intent);
       }
      });
     }
    }
    • 在点击事件里面,我们发送了com.example.broadcastbestpractice.FORCE_OFFLINE广播,用于通知程序强制用户下线。
    • 这说明强制用户下线的功能,应该写在接收器中,不写在具体某个活动中,这样发出“下线”广播的时候,就能完成下线操作了。
    • 接下来创建一个广播接收器
    package com.example.broadcastbestpractice;
    
    import android.app.AlertDialog;
    import android.app.AlertDialog.Builder;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.view.WindowManager;
    import android.content.DialogInterface.OnClickListener;;
    
    public class ForceOfflineReceiver extends BroadcastReceiver{
     @Override
     public void onReceive(final Context context,Intent intent) {
      AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
      dialogBuilder.setTitle("Warning");
      dialogBuilder.setMessage("You are forced to be offline,Please try to login again.");
      dialogBuilder.setCancelable(false);
      //下面这句改了
      dialogBuilder.setPositiveButton("OK", new OnClickListener() {
       @Override
       public void onClick(DialogInterface dialog,int which) {
        ActivityCollector.finishAll();//销毁所有的活动
        Intent intent = new Intent(context,LoginActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);//重新启动LoginActivity
       }
      });
      AlertDialog alertDialog = dialogBuilder.create();
      //需要设置AlertDialog的类型,保证广播接收器中可以正常弹出
      alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
      alertDialog.show();
     }
    }

    25.125.1

    三、源码:

  • 相关阅读:
    一个先进的App框架:使用Ionic创建一个简单的APP
    Hexo NexT 博客本地搭建指南
    Spring Boot 2.0 入门指南
    1. 初识 Lucene
    Spring Framework 简介
    电脑软件推荐安装列表
    PHP 环境搭建篇
    C++ STL 容器之栈的使用
    0x02 译文:Windows桌面应用Win32第一个程序
    反射?切面?怎样对公共参数及行为进行封装
  • 原文地址:https://www.cnblogs.com/ruigege0000/p/13303311.html
Copyright © 2020-2023  润新知