Android 登录处理

2023-10-29

今天整理一下之前在项目中写的关于某些界面需要登录判断处理。这里整理了一个简易的 Demo 模拟一下 登录情况未登录情况 下的界面跳转处理, 效果如图:

这里写图片描述

以上分别模拟了,未登录和已登录 情况下的 界面跳转和当前界面事件处理。接下来我们来看一下实现方式。
先从核心代码开始看:

public class GoLoginUtil {

    public static final String CLASSNAME = "className";

    public static final int CODE_LOGIN = 1; // 登录成功回调  用于onActivityForResult 判断


    /**
     * 登录成功之后,通过 activityResult 回调到当前界面
     *
     * @param activity
     * @param intent
     * @param requestCode
     */
    private static void startActivity(Activity activity, Intent intent, int requestCode) {
        if (requestCode == -1) {
            String targetClass = intent.getComponent().getClassName();  // 目标类
            intent.putExtra(CLASSNAME, targetClass);
        }
        intent.setClass(activity, LoginActivity.class); // 跳转重定向到登录界面
        activity.startActivityForResult(intent, requestCode);
    }


    /**
     * 登录成功之后,直接跳转目标 Activity
     *
     * @param activity
     * @param intent
     */
    public static void startActivity(Activity activity, Intent intent) {
        startActivity(activity, intent, -1);
    }

    /**
     * 登录成功回调到当前界面
     * 使用 onActivityResult 方法接收, requestCode  = CODE_LOGIN
     *
     * @param activity
     * @param intent
     */
    public static void startActivityForResult(Activity activity, Intent intent) {
        startActivity(activity, intent, CODE_LOGIN);
    }

}

这里可以看到,最主要的就是第一个 private 修饰的 startActivity 方法,看过 Android Activity 的 startActivity 方法源码的应该知道,它里面其实就是调用的 startActivityForResult(intent , -1) . 所以我们这里也来用一下它的写法。如果 等于 -1 ,那么就说明是有跳转目标 Activity 的,那么我们就通过 Intent.getComponent().getClassName() 来获取目标 Activity 的类名,再次添加到 Intent参数中,用于我们登录成功之后的后续跳转目标。当然,intent 中的其他参数是会一直携带着的,这里不用担心其他参数。 不等于 -1 那么就是要进行 setResult 回调了。所以,我们是通过 requestCode 是否等于 -1 来区分是继续跳转,还是回调当前界面。 工具类中的下面两个方法,就把功能区分开了,这里基本上看着系统源码来的。

然后再来进行一下二次封装,这里就需要判断当前 登录状态了,这里我也是模拟一下登录状态,代码如下:

public class IntentUtil {

    public static boolean isLogin;  // 模拟获取当前用户登录状态。

    /**
     * 需要登录判断
     *
     * @param activity
     * @param clazz
     * @param bundle
     */
    public static void startToLogin(Activity activity, Class clazz, Bundle bundle) {
        Intent intent = new Intent(activity, clazz);
        if (bundle != null) {
            intent.putExtras(bundle);
        }
        if (isLogin) {
            activity.startActivity(intent);
        } else {
            GoLoginUtil.startActivity(activity, intent);
        }
    }

    /**
     * 登录成功会有回调
     * requestCode = Contants.CODE_LOGIN
     *
     * @param activity
     * @param bundle
     */
    public static void startToLoginResult(Activity activity, Bundle bundle) {
        Intent intent = new Intent();
        if (bundle != null) {
            intent.putExtras(bundle);
        }
        GoLoginUtil.startActivityForResult(activity, intent);
    }
}

写到现在这样,基本上需要进行登录跳转界面的,可以直接调用 startToLogin 方法,根据登录状态进行跳转。至于 startToLoginResult 方法,目前还需要在调用时进行判断一下登录状态,进行区分处理,然后还要在 onActivityForResult 方法中进行回调处理,这个暂时没想到其他好的方法,各位大神如果有什么好的处理方式还请多多指教。

这里还没完呢,我们的登录界面也是需要一定的处理逻辑去进行配合的。我们来看一下怎么去配合:

public class LoginActivity extends FragmentActivity {

    private String targetClass;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        targetClass = getIntent().getStringExtra(GoLoginUtil.CLASSNAME);  // 目标跳转类


    }

    public void onLoginClick(View view) {
        // 模拟登录成功操作
        if (!TextUtils.isEmpty(targetClass)) {
            // 这里就是执行继续跳转操作
            try {
                Class clazz = Class.forName(targetClass);
                getIntent().setClass(this, clazz);
                startActivity(getIntent());
                finish();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        } else {
            // 这里是登录成功,回调到之前界面 onActivityForResult()中 方法可根据自己需求处理。。
            setResult(RESULT_OK);
            finish();
        }
    }
}

最后来看一下我们的调用方式:

/**
     * 登录跳转
     *
     * @param view
     */
    public void onClick1(View view) {
        Bundle bundle = new Bundle();
        bundle.putString("content", et_content.getText().toString());
        IntentUtil.startToLogin(this, LoginSuccessActivity.class, bundle);
    }

    /**
     * 登录回调
     *
     * @param view
     */
    public void onClick2(View view) {
        if (!IntentUtil.isLogin) {
            IntentUtil.startToLoginResult(this, null);
        } else {
            tv_text.setText("登录成功");
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != RESULT_OK) {
            return;
        }
        if (requestCode == CODE_LOGIN) {
            tv_text.setText("登录成功");
        }
    }

基本上要整理的就这么多。写法上的一些不足,还请各位多多指点。

Demo 地址

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 登录处理 的相关文章

  • 输出罐子是空的。您是否指定了正确的“-keep”选项?

    我正在尝试从 ant 构建一个发布 APK 文件 这就是我在控制台中得到的内容 D AndroidSDK android sdk r18 windows android sdk windows tools ant build xml 595
  • Android 分享 Facebook 意图 - 分享文本和链接

    我正在尝试使用 Android 共享意图在 Facebook 上发布内容 它看起来像这样 shareIntent setFlags Intent FLAG ACTIVITY NEW TASK shareIntent setType text
  • 如何知道 Android TalkBack 是否处于活动状态?

    我正在开发一个使用 TalkBack 来指导人们完成的应用程序 然而 在这些情况下 我希望应用程序的布局有一些细微的差异 以便导航更容易 并且还有额外的语音输出 使用 TextToSpeech 来帮助指导用户 我的问题是 如果用户激活了 T
  • 如何在android中制作正在运行的应用程序的小部件?

    我想制作我正在运行的应用程序的小部件 我的意思是我想通过主屏幕上的小部件访问我的应用程序 我想拨打电话 向存储在我的应用程序中的特定号码发送短信 在安卓上可以吗 我被困在这个问题上 如果有人有任何类型的想法 请建议我 Edit 我想制作像电
  • Xamarin.Android 应用程序仅在干净编译时找到启动器活动

    我有一个Xamarin Android标记为 MainLauncher 的活动称为 Login 当我第一次按 F5 时 应用程序在模拟器中正常启动 然后我停下来 进行一些代码更改 再次按 F5 我可以看到应用程序在模拟器中启动 当我收到以下
  • Android Studio - 无法识别的 VM 选项“MaxPermSize=256m”

    我刚刚在 Elementary OS 0 3 Freya 上安装了 Android Studio 并使用终端运行它 然而 在我第一次启动时 显示一条错误消息 Gradle 测试 项目刷新失败 无法启动守护进程 这个问题可能是由 守护进程的配
  • 如何更改Android中开关的文本颜色

    我正在创建一个使用 Android 4 0 的应用程序 我想知道是否可以更改开关中文本的文本颜色 我尝试过设置文本颜色 但不起作用 有任何想法吗 提前致谢 你必须使用android switchTextAppearance属性 例如 and
  • 使用 6.0 API (Android) 从服务器发送和接收数据

    我真的很困惑 我正在尝试开发一个简单的功能 允许我从服务器发送和接收数据 操作如下 在一个活动中 我对服务器上的 PHP 文件执行 HTTP POST PHP 文件 获取我发送的数据 通常是字符串 并使用通过 http 发送的参数执行查询
  • 有什么方法可以发现网络上的 Android 设备吗?

    我希望能够发现网络上的 Android 设备 并可能检索有关它们的一些设备信息 对于 Apple 设备来说 这非常容易 因为它们运行 Bonjour 服务 但是 我似乎找不到在 Android 上运行的任何类似服务 这必须在不修改 Andr
  • 将 list_content 包含到列表布局中以保留 ListFragment 功能

    首先 我在 1 6 Donut 中使用 Android 兼容性库 V4 rev 3 当您第一次创建 ListFragment 时 它会显示不确定的进度指示器 直到您使用 setListAdabpter 根据ListFragment onCr
  • Android文件上传器与服务器端php

    我几个小时以来一直在寻找解决方案 但找不到任何解决方案 基本上 我想从我的 Android 设备上传文件到 http 网站 但是 我不知道如何做到这一点 我在设备上使用java 并且我想在服务器端使用PHP 我只想上传文件 而不是在服务器上
  • Android:如何自定义启动器图标下的标签

    我的 Android 应用程序的名称长度为 14 个字符 没有空格 因此 当显示在启动器图标下时 全名在主屏幕上不可见 我想使用一个备用名称来显示在启动器图标下 这样我就可以将名称分解为两个由空格分隔的字符串 这样单词就可以换行 如何才能做
  • 如何在 android 中使用 XML 形状创建向右箭头(V 形)? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 How to create a right facing arrow using xml shapes in android like
  • Espresso + Junit4 - 在运行所有测试之前登录一次

    我想为我的一个应用程序编写一些自动化测试 所有功能都需要登录 所以 我已经编写了测试 但对于每个测试 它都是进行登录并测试功能 有没有办法帮助我只登录一次然后运行所有测试 最简单的方法是仅用一种测试方法编写所有测试 但我认为实现这一目标的方
  • Android 中的 EditText onClickListener

    我想要一个 EditText 它在按下时创建一个 DatePicker 所以我写了下面的代码 mEditInit EditText findViewById R id date init mEditInit setOnClickListen
  • 检测应用程序的阶段(alpha、beta 或生产)

    我正在使用 cordova 开发一个 android 应用程序 我希望使用三个给定的阶段来逐步发布它 IT 测试的 Alpha 合作伙伴测试版 为其他人生产 但是 我正在使用 mixpanel 来跟踪一些用户输入 Mixpanel 需要一个
  • Espresso,查找对话框并将其关闭

    我试图找到一个对话框取消按钮并将其推入 Espresso UI 测试 但我做不到 这是我的代码 onView withId R id dialog close button check matches isDisplayed 最好的解决方案
  • Android ADT版本需要20.0.0及以上

    昨天我尝试安装钛appcelerator 在这个过程中我编辑了一些android sdk安装现在我已经将我的android sdk更新到rev 20 但是当我启动eclipse时我收到一个错误 指出sdk需要20 0 0或更高版本 我尝试使
  • Android 上可靠的重复后台任务

    我正在尝试运行一个后台任务 该任务每分钟左右运行一次 Android 应用程序 但我正在努力确保该任务实际上每分钟运行一次 我尝试了从使用 SystemClock sleep 到 AlarmManager 重复闹钟和固定闹钟 的各种方法 但
  • Android - 深色模式问题:深色背景上的黑色文本

    当我启用深色模式时 我的应用程序上的某些菜单看起来很糟糕 非常暗的背景上的黑色文本 我对颜色完全是一个初学者 我还没有接触过 android studio 上默认颜色设置的任何内容 所以我有默认的两个主题 XML 和 Color Xml

随机推荐

  • 哲学家问题(死锁问题)

    1 问题描述 有五个哲学家绕着圆桌坐 每个哲学家面前有一盘面 两人之间有一支筷子 这样每个哲学家左右各有一支筷子 哲学家有2个状态 思考或者拿起筷子吃饭 如果哲学家拿到一只筷子 不能吃饭 直到拿到2只才能吃饭 并且一次只能拿起身边的一支筷子
  • git从某个分支创建新分支

    如题 记录一下从某个分支创建新分支的方法 如从dev分支创建一个test分支 第一步 切换到你指定的分支 如我要从dev上拉一个分支 代码一模一样 git checkout dev 第二步 拉取dev的最新代码 git pull 第三步 在
  • Android Bitmap加载内存占用彻底分析

    背景 在某个版本应用上线后 偶然测得首页占用的内存非常的大而且一直不能回收掉 经过一轮的排查后最终确定是3张图片引起的 当时每张图片占用了将近20m内存 当时紧急处理好后还一直惦记着此事 后来对Android加载Bitmap的内存占用作了彻
  • Android系统源代码的下载与编译

    http www jianshu com p aeaceda41798
  • UVa 12955 Factorial

    Problem uva onlinejudge org index php option com onlinejudge Itemid 8 page show problem problem 4834 开始想多了 想着不能简单贪心 要用dp
  • C# Task异步编程

    Task任务用法 Task用的是线程池 线程池的线程数量的有上限的 这个可以通过ThreadPool修改 我们经常会用到task run new task 和task factory startnew方法来创建任务 Task Factory
  • 检查HDFS块状态

    hadoop集群运行过程中 节点的块状态或者上下线节点时集群都会受影响 如何查看当前的hdfs的块的状态 hadoop1 x时候的命令 hadoop2 x也可使用 hadoop fsck 在hadoop2 0之后 可以使用新命令 hdfs
  • 关于 JavaScript 中的 Promises

    在 JavaScript 中 Promise 是一个对象 它表示一个可能还不可用 但会在未来解决的值 Promises 用于处理异步操作 例如发出网络请求或访问数据库 其中结果不是立即可用的 如果你准备好了 我想开始我们的冒险 承诺如何运作
  • vc2010中开始执行不调试灰的_Intellij IDEA调试功能使用总结

    这段时间一直在使用Intellij IDEA 今天把调试区工具的使用方法记录于此 先编译好要调试的程序 1 设置断点 选定要设置断点的代码行 在行号的区域后面单击鼠标左键即可 2 开启调试会话 点击红色箭头指向的小虫子 开始进入调试 IDE
  • 快速傅里叶变换(FFT)

    前言 在学习FFT过程中看了很多博客 但发现在看博客的时候博客上的内容大多都晦涩难懂 于是乎想自己写一篇博客来记录一下自己学习的心得体会 知其源 先来讲讲FFT的起源 快速傅里叶变换是1965年由J W 库利和T W 图基提出的 采用这种算
  • 微服务项目之JVM Thread线程数飙升

    查找步骤如下 1 找到使用的jdk 在下面找到bin目录 之后双击bin目录下jvisualvm exe 2 启动本地项目 按照上图就可以监控线程数变化 如果项目部署在远程服务器上 那么则需要添加远程监控 选中远程 gt 右键添加远程主机
  • 目标检测跟踪算法--传统方法

    第一阶段 目标跟踪分为两个部分 一个是对指定目标寻找可以跟踪的特征 常用的有颜色 轮廓 特征点 轨迹等 另一个是对目标特征进行跟踪 1 静态背景 1 背景差 对背景的光照变化 噪声干扰以及周期性运动等进行建模 通过当前帧减去背景图来捕获运动
  • python使用hash256加密验证字符串

    这篇博客使用hash256加密一个固定的字符串 同一个字符串有固定的hash256 因此可以通过验证hash值 判断字符串是否发生变化 import hashlib def get hash256 data str 对data加密 hash
  • USB audio调试

    androidstudio打印的信息有如下 07 12 08 27 17 660 2284 2284 I AudioFlinger loadHwModule Loaded a2dp audio interface from A2DP Aud
  • Linux Foundation发布面向IoT的实时OS开发项目「Zephyr」

    本文翻译至 http japan zdnet com article 35078243 物联网 IoT 领域新的玩家出场了 这就是Linux Foundation的 Zephyr Project 本文考察该项目给开发者和消费者双方带来利益的
  • ObjectArx 自定义实体

    1 arx文档中规定的必须重写的几个函数 AcDbObject virtual Acad ErrorStatus dwgInFields AcDbDwgFiler filer virtual Acad ErrorStatus dwgOutF
  • 对数器(一种测试算法的技巧)

    当我们有两个算法 一个是暴力算法 一个是好的算法 我们想看是否这个好的算法存在有问题 因为暴力算法一般比较好写并且不会出错 但是会超时 当然暴力也可能错 我们就用一个随机样本产生器 生成数据分别用这两个算法跑 是否结果完全一样 不一样说明其
  • 5 分钟搭建一个简洁优雅的静态博客

    你可能会问 现在写作平台都这么多了 还有必要自己折腾博客么 一开始我遇到这个问题 总觉得自己弄个博客 太麻烦了 也不一定坚持写下去 直接在平台上写得了 于是 CSDN 简书 知乎上开始写 写着写着 我就发现他们有一些缺点 为什么需要博客 C
  • 网络安全——漏洞扫描工具(AWVS的使用)

    一 安全漏洞产生的原因 二 什么是0day漏洞 在安全漏洞生命周期内 从安全漏洞被发现到厂商发布补丁程序用于修复该漏洞之前 三 什么是安全漏洞生命周期 一共分为7个阶段 四 安全漏洞管理 1 2 安全漏洞等级 1 微软设置了4个等级 低危
  • Android 登录处理

    今天整理一下之前在项目中写的关于某些界面需要登录判断处理 这里整理了一个简易的 Demo 模拟一下 登录情况 和 未登录情况 下的界面跳转处理 效果如图 以上分别模拟了 未登录和已登录 情况下的 界面跳转和当前界面事件处理 接下来我们来看一