Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >项目需求讨论 -(登录 -> 主界面 -> 退出登录)

项目需求讨论 -(登录 -> 主界面 -> 退出登录)

作者头像
青蛙要fly
发布于 2024-02-18 00:22:54
发布于 2024-02-18 00:22:54
23900
代码可运行
举报
运行总次数:0
代码可运行
我估计百分之90的人做具体项目的时候,都会有A(登录界面) —> B(主界面) —> A(退出登录)。我想说明的是这个并不是很难,而且有很多实现方式,我只是写了我以前写的方式,及另外一种方式。。当然可能有更好的方式,大家可以留言。谢谢。

这里的B(主界面)我是笼统的讲了。比如微信,登录后,先是一个主界面,但是要在<我> —> <设置> —> <退出按钮> .这个时候,这个B界面也就有二级深度了。一个有四个Tab的主界面,然后一个设置的界面。有二个界面。

有这么几个需求:

  1. 在A(登录界面) 处直接按返回按钮是直接退出整个应用。
  2. 当A(登录界面) —> B(主界面)后,在B(主界面) 上不能直接返回退到A(登录界面)。且在B界面双击返回就要退出整个应用。即退出B界面和A界面。
  3. 当在B界面点击“退出登录”按钮后,需要回到A界面。这时候,在这个A界面处直接按返回键是会退出整个应用。
我的思路
  1. B界面中的退出按钮就一级深度 那太简单了。 A(登录界面) —> B(主界面) 的时候,把A给finish掉,然后B(主界面) —> A(退出登录)的时候,把先启动A(登录界面),然后把B(主界面)给finish掉即可。
  2. B界面中的退出按钮在很多级深度界面里面 如果想要像第一种情况那样处理的话,那么在B(主界面) —> A(退出登录)的时候,启动了A(登录界面)后,把那些打开的界面都要关闭,如果有二级深度,那要把二个Activity都要关闭。如果更多,也都要关闭。只留一个A登录界面。

我那时候觉得这样比较麻烦,我就想到了Activity的启动方式,如果把Activity的启动方式设置为"singleTask",然后启动这个Activity的时候,会把这个Activity上面的Activity都会给推出栈。这样就剩这一个了。

所以我想到了把A(登录界面)的启动方式设置"singleTask"不就好了。在登录到B(主界面)的时候,先不把A(登录界面)关闭,然后在退出登录的时候把A(登录界面)重新启动,这样A(登录界面)就把上面的所有的B所包含的Activity都关闭了。(PS:这里把A设为singleTask后面会有另外一个坑,等会后面解说)

好,我们就一步步来:

第一步

先在AndroidManifest.xml中把这个A(登录界面)设置为"singleTask"

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<activity
       android:name=".modules.view.activity.LoginActivity"
       android:launchMode="singleTask">
     <intent-filter>
          <action android:name="android.intent.action.MAIN" />
          <category android:name="android.intent.category.LAUNCHER" />
     </intent-filter>
</activity>

我们既然要退出登录的时候再次启动这个栈底的A,所以这时候在A这个Activity中调用startActivity的时候,不去调用finish()方法。

第二步

我们这时候已经启动了B(主界面),这时候如果你点击返回按钮,会发现,返回到了A界面,这样是有问题的。一般在主界面,都是点击返回会提示“请连续点击返回二次退出应用”。这种我想大家都是家常饭了。复写onKeyDown方法。执行自己的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
long SystemTime = 0;

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
     if(keyCode == KeyEvent.KEYCODE_BACK){
         if(System.currentTimeMillis()- SystemTime < 1000 && SystemTime != 0){
            Intent intent = new Intent();
            intent.setAction("ExitApp");
            intent.setClass(HomePageActivity.this,LoginActivity.class);
            startActivity(intent);
         }else{
            SystemTime = System.currentTimeMillis();
            Toast.makeText(aty, "双击返回按钮进行退出", Toast.LENGTH_SHORT).show();
         }
     }
     return false;
}

这时候大家发现我不仅重新startActivity了A(登录界面)这个Activity。而且还对intnet设置了 intent.setAction("ExitApp");为什么添加这个Action,因为在B(主界面)上双击返回的时候,要退出整个程序,要关闭所有的Activity,所以就是先启动了A(登录界面)这个Activity,然后再把A(登录界面)的Activity 给finish()即可。当时退出登录的时候,就单纯的启动A(登录界面)这个Activity即可,所以我要做个标记,判断这次启动A(登录界面)这个Activity是‘关闭应用’还是‘退出登录’。

第三步

对应的我们在“退出登录”这个按钮的点击事件也是启动A(登录界面)这个Activity即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Intent intent = new Intent();
intent.setClass(getActivity(),LoginActivity.class);
startActivity(intent);
第四步

然后我们知道,重新startActivity 一个已经启动的并且启动模式为"singleTask"的Activity。是会调用onNewIntent()方法。所以我们在A(登录界面)复写onNewIntent()方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    if ("ExitApp".equals(intent.getAction())) {
          finish();     
    } 
}
好了,这里要开启另外一个大坑了。不知道大家遇到过没有,请注意,前方高能!!!!!

按照上面写的,测试了下发现没有问题。完美的实现了我们的需求,然后这时候在B(主界面)的时候,我按钮home键,回到了桌面,然后我点击这个app的图标进入,而不是按了menu键在后台列表中选择这个app进入,你会发现,B(主界面)不见了!!!!,变为了A(登录界面)了!!!!而且如果还是刚才那样,在B(主界面)的时候,按home键回到了桌面,按了menu键在后台列表中选择这个app进入,就没问题!!!! 后来发现了这个问题的原因。 因为我们的A是登录界面,登录界面一般来说肯定是启动页,而启动页的启动方式直接设置成"singleTask",这时候你最小化应用后,并且已点击桌面图标的形式再次进入,就会重新回到启动界面。

所以我们这里对A不能设置为"singleTask",要设置为"singleTop",然后我们再把所有startActivity 这个A(登录界面)的intent都多加一句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

然后就OK了!!!!

后记:我觉得用RxBus也可以,每个界面都启动的时候订阅一个事件,内容是finish(),点击"退出登录"按钮,向所有订阅的Activity发送,然后Activity都执行了finish方法。不过自己没写。哈哈。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
FLAG_ACTIVITY_CLEAR_TOP的使用
多activity中退出整个程序,例如从A->B->C->D,这时我需要从D直接退出程序。 补充:finish()和system(0)都只能退出单个activity。
全栈程序员站长
2022/09/09
6230
Android技能树 — Activity小结
我估计如果面试面试官问你Activity的生命周期报一遍看,你心里一定暗骂mmp。因为这种一般菜鸟都知道有哪些常用的,虽然可能有些不常用的,不清楚也是很正常,而且面试官也就是想知道几个常用的而已。
青蛙要fly
2024/01/26
1610
Android技能树 — Activity小结
彻底明白Activity启动模式-SingleTop、SingleTask、SingleInstance具体使用场景[通俗易懂]
原创地址:http://blog.csdn.net/zivensonice/article/details/51569502
全栈程序员站长
2022/09/13
4.2K0
Android 学习笔记--android——Activity学习
Activity 创建的三要素: 1、创建的类要去继承activity 2、setContentView();应用布局文件 3、在清单文件中进行配置 android:name="com.example.ex_0310_01.MainActivity" (包名.类名)
易寒
2021/12/17
4470
项目需求讨论- 手机锁屏及APP退到后台后自动锁定功能
大家好,又到了新一期的项目需求讨论,很多APP都有安全的意识,比如一些银行的APP,你登录后,看一些东西,然后这时候锁屏了。或者是按了Home键退到了后台,这时候,再启动这个App,可能就会又到了这个APP的解锁的界面。或者重新登录的界面。防止安全。
青蛙要fly
2018/08/29
9240
项目需求讨论- 手机锁屏及APP退到后台后自动锁定功能
Android实现点击两次返回退出APP
这两天在做一个项目碰到这么个问题,需要主界面点击两次直接退出整个APP而不是返回上一个界面,查找了网上的资料,整合和修改了一下写了这篇博客。
全栈程序员站长
2022/09/07
1.5K0
AndroidStudio制作登录和注册功能的实现,界面的布局介绍
大家好,我是 Vic,今天给大家带来AndroidStudio制作登录和注册功能的实现,界面的布局介绍的概述,希望你们喜欢
达达前端
2019/07/03
12.6K2
AndroidStudio制作登录和注册功能的实现,界面的布局介绍
Android小技巧: 这里涵盖了所有实现 “一键退出 App” 的方法
即 需要2个步骤 才可 完成 一键退出 App 需求。下面,我将根据这两个步骤进行功能实现讲解。
用户2802329
2018/08/07
5810
Android小技巧: 这里涵盖了所有实现 “一键退出 App” 的方法
应用首页Activity的单例实现
背景 目前有一部分android APP需要这样一种场景,即应用需要保留一个应用首页主Activity,其它子Activity永远在主Activity之上,跳转到子Activity之后,不管以哪种方式跳转,最终都可以返回到主Activity,这种场景有点类似主桌面的概念。这种场景如果纯fragment来实现,需要管理fragment栈,中间如果发生嵌套跳转,fragment栈的管理会变得非常复杂,所以难免会需要使用部分Activity来实现,并且由于主Activity承载的内容比较丰富,初始化会比较耗时,因
QQ音乐技术团队
2018/01/30
2.7K1
应用首页Activity的单例实现
项目需求讨论 — 用Transition做一个漂亮的登录界面
一次在逛Github的时候,看到一个漂亮的登录界面,用的是Transition做的。我就直接贴上地址:
青蛙要fly
2018/08/29
1.9K0
项目需求讨论 — 用Transition做一个漂亮的登录界面
Android技能树 — Activity小结
这次是讲Activity的相关内容。还是老样子,先上脑图,然后具体一块块详细说明。
青蛙要fly
2018/08/29
5250
Android技能树 — Activity小结
【Android 应用开发】Android 返回堆栈管理 ( 默认启动模式 | 栈顶复用启动模式 | 栈内复用启动模式 | 单实例启动模式 | CLEAR_TOP 标识 )
默认模式 ( standard ) : 最简单的模式 , 每次启动一个 Activity 就创建一个新的 Activity 实例 , 放入返回堆栈中 ;
韩曙亮
2023/03/27
5780
[置顶] Activity 不只有跳转。功能篇(一)
standard,SingleTask,SingleTop,SingleInstance
cMusketeer
2022/03/11
1.2K0
[置顶]
        Activity 不只有跳转。功能篇(一)
如何让你的app在后台被干掉后优雅的启动
作为一名Android开发师,肯定在处理用户的体验上下一定的功夫。有这么一个场景,在用户用着你开发的app的时候,突然某个聊天工具来消息了,切换到聊天工具后长时间停留,并且可能做了一些你不知道的操作,比如看视频阿,刷刷消息圈什么的。一般这种情况下都很容易出现手机内存不足的情况,内存不足就会可能被干掉。这种时候用户切换到app准备继续操作时,如果开发师处理不好,就会引起崩溃的情况,肯定会出现返回的时候一瞬间的白屏,对于用户体验的来说,非常不好。
Android技术干货分享
2019/08/21
2.7K1
如何让你的app在后台被干掉后优雅的启动
Android-浅谈广播机制,实现强制下线功能
顾名思义,广播就像我们上学的时候每个班级里的喇叭一样,这些喇叭都是接入到学校的总的一个地方,比如说广播室啊什么的。一旦有什么通知,就会播放一条让全校师生都知道的广播。类似的工作机制其实很多,比如就像计算机的网络通信。
Petterp
2022/02/09
9650
Android-浅谈广播机制,实现强制下线功能
我所理解的Android 启动模式
首先,这是从 一个开源网站转载的,觉得写得不错,对我们之前理解的activity的启动模式是一个新的理解方式,并给出实际的应用场景。 任务栈是什么 任务栈Task,是一种用来放置Activity实例的容器,他是以栈的形式进行盛放,也就是所谓的先进后出,主要有2个基本操作:压栈和出栈,其所存放的Activity是不支持重新排序的,只能根据压栈和出栈操作更改Activity的顺序。 启动一个Application的时候,系统会为它默认创建一个对应的Task,用来放置根Activity。默认启动Activity会
xiangzhihong
2018/02/02
9540
我所理解的Android 启动模式
教育系统APP(二)
当我们面临制作登录和注册功能的实现时,我们需要先设计登录界面的布局和注册界面的布局,做到有完整的思路时才开始实现其功能效果会更好。
达达前端
2020/01/15
1.1K0
教育系统APP(二)
Android退出应用程序方法总结[通俗易懂]
在Android开发中,我们运行了应用程序后,都需要退出应用的,那么该如何退出应用,又都有哪些实现方式呢?今天就为大家整理分享一些退出应用程序的方法,一起来看看吧!
全栈程序员站长
2022/09/09
4.2K0
Activity 的启动方式和 flag 详解
活动的:Activity 在栈顶,它是可视、有焦点、可接受用户输入的。Android 试图尽最大可能保持它活动状态,杀死其它 Activity 来确保当前活动 Activity 有足够的资源可使用。 当另外一个 Activity 被激活,这个将会被暂停。
李林LiLin
2020/12/05
2K0
8.广播
广播接收者 现实中:电台要发布消息,通过广播把消息广播出去,使用收音机,就可以收听广播,得知这条消息 Android中:系统在运行过程中,会产生会多事件,那么某些事件产生时,比如:电量改变、收发短信、拨打电话、屏幕解锁、开机,系统会发送广播,只要应用程序接收到这条广播,就知道系统发生了相应的事件,从而执行相应的代码。使用广播接收者,就可以收听广播 创建广播接收者 定义java类继承BroadcastReceiver 在清单文件中定义receiver节点,定义name属性,指定广播接收者java类的全类名 在
六月的雨
2018/05/14
1.7K0
推荐阅读
相关推荐
FLAG_ACTIVITY_CLEAR_TOP的使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验