步骤

  • 系列文章
  • 前言
    • 1.实现效果
      • 1.1登录,勾选记住密码
      • 1.2进入内部界面
      • 1.3离线警告
      • 1.4回到登录界面,发现帐号密码已经输入好了
    • 2.项目结构
    • 3.xml外观文件
      • 3.1activity_login.xml(修改)
      • activity_main.xml
      • AndroidManifest.xml
    • 4.java功能文件
      • 4.1ActivityCollector.java
      • 4.2BaseActivity.java
      • 4.3LoginActivity.java(修改)注意包名可能要修改
      • 4.4MainActivity.java
    • 附录.参考资料
    • 下载资源
  • 总结

系列文章

提示:转到安卓学习专栏,观看更多内容!
点我直达–>安卓学习专栏


前言

    建议先观看专栏前面的文章

  1. 安卓学习专栏——利用广播实现强制下线功能
  2. 安卓学习专栏——安卓项目替换项目名

    结合上述的文章,新建一个remberpasswordtest项目,把我们的broadcastbestpractice项目的内容在remberpasswordtest中实现。
    或者可以在broadcastbestpractice的基础上直接修改实现记忆密码功能,只需要修改activity_login.xml 和LoginActivity.java 即可。最好新建一个remberpasswordtest项目便于区分和后面的学习。


1.实现效果

1.1登录,勾选记住密码

1.2进入内部界面

1.3离线警告

1.4回到登录界面,发现帐号密码已经输入好了


2.项目结构

创建名为BroadcastBestPractice的项目


3.xml外观文件

3.1activity_login.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"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="60dp"android:orientation="horizontal"><TextViewandroid:layout_width="90dp"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:text="账号:"android:textSize="18sp" /><EditTextandroid:id="@+id/account"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_weight="1" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="60dp"android:orientation="horizontal"><TextViewandroid:layout_width="90dp"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:text="密码:"android:textSize="18sp" /><EditTextandroid:id="@+id/password"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_weight="1"android:inputType="textPassword" /></LinearLayout><LinearLayoutandroid:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"><CheckBoxandroid:id="@+id/remember_pass"android:layout_width="wrap_content"android:layout_height="wrap_content" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="18sp"android:text="记住密码" /></LinearLayout><Buttonandroid:id="@+id/login"android:layout_width="match_parent"android:layout_height="60dp"android:text="登录" /></LinearLayout>

activity_main.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" ><Buttonandroid:id="@+id/force_offline"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="广播离线信息" />
</LinearLayout>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.broadcastbestpractice"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.BroadcastBestPractice"><activityandroid:name=".MainActivity"android:exported="true"></activity><activityandroid:name=".LoginActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

4.java功能文件

4.1ActivityCollector.java

创建一个ActivityCollector 类用于管理所有的活动

package com.example.broadcastbestpractice;import android.app.Activity;import java.util.ArrayList;
import java.util.List;public class ActivityCollector {public static List<Activity> activities = new ArrayList<>();public static void addActivity(Activity activity) {activities.add(activity);}public static void removeActivity(Activity activity) {activities.remove(activity);}public static void finishAll() {for (Activity activity : activities) {if (!activity.isFinishing()) {activity.finish();}}activities.clear();}
}

4.2BaseActivity.java

创建BaseActivity 类作为所有活动的父类。
先来看一下ForceOfflineReceiver中的代码,这次onReceive() 方法里可
不再是仅仅弹出一个Toast了,而是加入了较多的代码,那我们就来仔
细地看看吧。首先肯定是使用AlertDialog.Builder 来构建一个对话
框,注意这里一定要调用setCancelable() 方法将对话框设为不可取
消,否则用户按一下Back键就可以关闭对话框继续使用程序了。然后使
用setPositiveButton() 方法来给对话框注册确定按钮,当用户点击
了确定按钮时,就调用ActivityCollector的finishAll() 方法来销毁掉
所有活动,并重新启动LoginActivity这个活动。
再来看一下我们是怎么注册ForceOfflineReceiver这个广播接收器的,可
以看到,这里重写了onResume() 和onPause() 这两个生命周期函数,
然后分别在这两个方法里注册和取消注册了ForceOfflineReceiver。
那么为什么要这样写呢?之前不都是在onCreate() 和onDestroy() 方
法里来注册和取消注册广播接收器的么?

这是因为我们始终需要保证只有处于栈顶的活动才能接收到这条强制下线广播,非栈顶的活动不应该也没有必要去接收这条广播,所以写在onResume() 和onPause() 方法里就可以很好地解决这个问题,当一个活动失去栈顶位置时就会自动取消广播接收器的注册。(郭霖老师)

package com.example.broadcastbestpractice;import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;public class BaseActivity extends AppCompatActivity {private ForceOfflineReceiver receiver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityCollector.addActivity(this);}@Overrideprotected void onResume() {super.onResume();IntentFilter intentFilter = new IntentFilter();intentFilter.addAction("com.example.broadcastbestpractice.FORCE_OFFLINE");receiver = new ForceOfflineReceiver();registerReceiver(receiver, intentFilter);}@Overrideprotected void onPause() {super.onPause();if (receiver != null) {unregisterReceiver(receiver);receiver = null;}}@Overrideprotected void onDestroy() {super.onDestroy();ActivityCollector.removeActivity(this);}class ForceOfflineReceiver extends BroadcastReceiver {@Overridepublic 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() {@Overridepublic void onClick(DialogInterface dialog, int which) {ActivityCollector.finishAll(); // 销毁所有活动Intent intent = new Intent(context, LoginActivity.class);context.startActivity(intent); // 重新启动LoginActivity}});builder.show();}}
}

4.3LoginActivity.java(修改)注意包名可能要修改

将LoginActivity的继承结构改成继承自BaseActivity,然后调用findViewById() 方法分别获取到账号输入框、密码输入框以及登录按钮的实例。接着在登录按钮的点击事件里面对输入的账号和密码进行判断,如果账号是admin并且密码是123456,就认为登录成功并跳转MainActivity否则就提示用户账号或密码错误。

package com.example.remberpasswordtest;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;public class LoginActivity extends BaseActivity {private SharedPreferences pref;private SharedPreferences.Editor editor;private EditText accountEdit;private EditText passwordEdit;private Button login;private CheckBox rememberPass;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);//读取数据pref = PreferenceManager.getDefaultSharedPreferences(this);accountEdit = (EditText) findViewById(R.id.account);passwordEdit = (EditText) findViewById(R.id.password);rememberPass = (CheckBox) findViewById(R.id.remember_pass);login = (Button) findViewById(R.id.login);boolean isRemember = pref.getBoolean("remember_password", false);//如果勾选记住密码,将账号和密码都设置到文本框中if (isRemember) {String account = pref.getString("account", "");String password = pref.getString("password", "");accountEdit.setText(account);passwordEdit.setText(password);rememberPass.setChecked(true);}login.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String account = accountEdit.getText().toString();String password = passwordEdit.getText().toString();// 如果账号是admin且密码是123456,就认为登录成功if (account.equals("admin") && password.equals("123456")) {editor = pref.edit();if (rememberPass.isChecked()) { // 检查复选框是否被选中editor.putBoolean("remember_password", true);editor.putString("account", account);editor.putString("password", password);} else {editor.clear();}editor.apply();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();}}});}
}

4.4MainActivity.java

一个按钮,用于触发强制下线功能

package com.example.broadcastbestpractice;import androidx.appcompat.app.AppCompatActivity;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;public class MainActivity extends BaseActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button forceOffline = (Button) findViewById(R.id.force_offline);forceOffline.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent("com.example.broadcastbestpractice.FORCE_OFFLINE");sendBroadcast(intent);}});}
}

附录.参考资料

《第一行代码》5.5 广播的最佳实践——实现强制下线功能


下载资源

安卓初学者教程-利用广播实现强制下线功能实例

总结

大家喜欢的话,给个

安卓学习专栏——实现记住密码功能(图文+代码)相关推荐

  1. 安卓学习专栏——百度地图(1)获取SHA1指纹申请百度地图API Key使用百度LBS定位功能(图文保姆级)

    步骤 系列文章 前言 1.前期准备 2.创建应用 3.获取发布版SHA1和开发版SHA1 3.1找到.android文件夹位置 3.2Android Studio的Terminal中cd路径 3.3输 ...

  2. 安卓学习专栏——百度地图(6)移动到我的位置(图文+代码)

    步骤 系列文章 前言 介绍api 实现效果 activity_main.xml AndroidManifest.xml MainActivity.java(修改) 附录.参考资料 下载资源 总结 系列 ...

  3. 安卓学习专栏——从文件中读取数据、openFileInput(图文+代码)

    步骤 系列文章 前言 1.实现效果 1.1启动时初始化填写读取的数据,或是点击读取显示数据 1.2保存新数据 1.3点击读取按钮读取数据 1.4重启查看效果 2.xml外观文件 3.java功能文件 ...

  4. 安卓学习专栏——查看安卓数据库,用navicat premium与sqlitestudio可视化查看数据库(图文保姆级)

    步骤 系列文章 前言 1.找到数据库文件 1.1打开Device File Explerer 文件查找工具 1.2找到数据库资源路径 1.3保存在文件夹 2.navicat premium可视化 2. ...

  5. 安卓学习专栏——实战项目酷欧天气(2)遍历全国省市县数据

    步骤 系列文章 前言 1.实现效果 2.项目结构 util包 util包下新建HttpUtil util包下新建Utility 3.新建choose_area.xml布局 4.新建ChooseArea ...

  6. AppCan用cookie实现记住密码功能 [APP]

    今天想做个在应用上记住密码的功能.想了一下,先用COOKIE来测试.COOKIE保存在客户端. 关于COOKIE在手机上安不安全的问题,以后再讨论. 其实想过在手机上创建文件保存密码,但是,没有时间, ...

  7. vue 登录页面记住密码功能

    vue+iview/element 一般用来快速搭建后台管理系统,登录页的记住密码功能也是必不可少的. 记住密码快速登录功能(iview ui): 思路:首次登录,记住密码,将密码存储到cookie中 ...

  8. 安卓学习专栏——安卓报错Version 28 (intended for Android Pie and below) is the last version of the legacy suppor

    步骤 系列文章 前言 1.报错效果 2.修改方法 总结 系列文章 提示:转到安卓学习专栏,观看更多内容! 点我直达–>安卓学习专栏 前言 'com.android.support:appcomp ...

  9. 安卓学习专栏——安卓报错android.support.v4.widget.SwipeRefreshLayout飘红

    步骤 系列文章 1.报错效果 2.修改方法使用新的标签名 总结 系列文章 提示:转到安卓学习专栏,观看更多内容! 点我直达–>安卓学习专栏 1.报错效果 第一行代码酷欧天气实战时飘红 安卓报错a ...

  10. 安卓学习专栏——实战项目酷欧天气(4)给天气页面加上背景图片

    步骤 系列文章 前言 实现效果 项目结构 1.获取必应每日一图 1.1修改修改activity_weather.xml 1.2修改WeatherActivity 2.背景图和状态栏效果修改 2.1修改 ...

最新文章

  1. LAMP网站架构方案分析
  2. jstl 处理字符串函数 substring spli等
  3. JAVA关于父亲节的代码_关于父亲节的经典语录
  4. httplib 和 httplib2区别之 gzip解压
  5. 关于大龄程序员的谣言 新手必读
  6. php cdi_CDI中的事务异常处理
  7. 《全球互联网金融商业模式:格局与发展》——第3章,第3节互联网保险公司...
  8. 1 利用Anaconda完美解决Python 2与python 3的共存问题
  9. 选择分集matlab程序,瑞利衰落信道下采用MRC分集误码性能Matlab程序
  10. BZOJ3938 UOJ88:[集训队互测2015]Robot——题解
  11. qt creator纯C或C++项目在windows下的命令行中文乱码解决
  12. 网上商城项目总结报告
  13. drools-基本使用
  14. php判断字符串是否为空的方法
  15. 什么是生成式对抗神经网络GAN
  16. Unix平台下的常用命令技巧之五 资源与性能
  17. 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
  18. Git runner安装
  19. 如何爬取微博全部粉丝python_python 登录新浪微博爬取粉丝信息
  20. 分享12个Kindle书籍资源地址,你想要的这里都有

热门文章

  1. idea的tomcat改端口号_Tomcat修改端口
  2. Mac最好用的RSS阅读器Reeder使用方法
  3. prompt弹出输入框中文php,Prompt输入框
  4. php环境配置PHPWAMP
  5. js生成二维码,js 解析二维码,jsqrcode,js从url生成二维码
  6. 8uftp,8uFTP是什么软件
  7. 蓝牙模块配置串口通讯
  8. epoll文件服务器,使用epoll模型的服务器
  9. 6个裂变获客增长方法
  10. Aspose.PSD for Java 21.6 Crack