接触过Android的应该都知道关闭一个Activity直接调用finish()就好啦!但项目中偶尔会遇到在某个Activity中关闭另一个Activity的需求。举个栗子,比如开发某个APP,用户从“登录界面A”跳转到“主界面B”,然后在“主界面B”跳转到"个人中心C",此时用户在"个人中心C"点击了“注销”按钮,那么这个时候应该是要跳转到“登录界面A”,并且“主界面B”和“个人中心界面C”都应该关闭,只保留登录界面A,否则用户点击返回的时候还可以返回主界面那就不是我们想要的了。那么问题来了从"个人中心C"跳转的时候关闭当前"个人中心C界面"直接finish就好了,但如何在"个人中心C"界面finish"主界面B"呢?

方式一:

在Activity中声明一个Activity类型的静态变量,onCreate的时候赋上当前的Activity对象,在需要关闭这个Activity的时候直接调用这个Activity类型的静态变量finish掉

需要关闭的Activity代码:

public class TestActivity extends Activity{

public static TestActivity testActivity;

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_login);

testActivity=this;

}

}

在其他地方关闭TestActivity时调用:

if(TestActivity.testActivity!=null){

TestActivity.testActivity.finish();

}

这种方式针对只关闭一两个特定Activity倒还算简单方便,假如APP界面多了之后,要求用户点击注销后跳转到登录界面,并且关闭除登录界面外其他所有Activity的话,或者类似这种要求同时关闭多个Activity的需求,这种方式就比较麻烦了,总不能在每个Activity都加上这么一段,然后调用的时候一个一个关?显然太繁琐。

方式二:

这也是网上比较常用的方式,创建一个Activity的集合,对所有的Activity进行统一的管理。

大致思路:创建一个存放Activity对象的集合,当某个Activity创建时就在集合里面添加当前的Activity,当某个Activity销毁时就在集合里面清除掉当前Activity,这样集合里面存在的都是未销毁的Activity对象,我们需要的时候就可以针对这些对象进行操作。

第一步:

创建一个ActivityCollector的工具类,声明一个存放Activity对象的集合,当然这个集合肯定得是单例的。然后在ActivityCollector中添加从集合删除、添加Activity对象的方法

kotlin代码:

/**

* 一个专门对所有的活动( Activity)进行管理的

*/

object ActivityCollector {

var activities = mutableListOf()

/**

* 添加Activity

* @param activity 添加的Activity对象

*/

fun addActivity(activity: Activity) {

activities.add(activity)

}

/**

* 删除Activity

* @param activity 删除的Activity对象

*/

fun removeActivity(activity: Activity) {

activities.remove(activity)

}

}

java代码:

/**

*一个专门的集合类对所有的活动( Activity)进行管理

*

* */

public class ActivityCollector {

public static List activities = new ArrayList();

/**

* 添加Activity

* @param activity 添加的Activity对象

* */

public static void addActivity(Activity activity) {

activities.add(activity);

}

/**

* 删除Activity

* @param activity 删除的Activity对象

* */

public static void removeActivity(Activity activity) {

activities.remove(activity);

}

}

第二步:

创建一个自定义的Activity类MyActivity,其他所有界面的Activity都继承MyActivity,并且在MyActivity的onCreate()生命周期中调用ActivityCollector的addActivity()方法,在MyActivity的onDestroy()生命周期中调用ActivityCollector的removeActivity()方法。这样每创建一个Activity都会在Activity的集合activities中添加一个当前Activity对象,每销毁一个Activity都会从activities中清除掉当前Activity。

kotlin代码:

open class MyActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

//添加activity到活动管理器

ActivityCollector.addActivity(this)

}

override fun onDestroy() {

super.onDestroy()

//从activity的活动管理器清除

ActivityCollector.removeActivity(this)

}

}

java代码:

public class MyActivity extends AppCompatActivity {

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//在活动管理器添加当前Activity

ActivityCollector.addActivity(this);

}

@Override

protected void onDestroy() {

super.onDestroy();

//从活动管理器删除当前Activity

ActivityCollector.removeActivity(this);

}

}

不要忘了要将其他Activity都继承MyActivity,这个活动管理器才会有意义。

第三步:

在活动管理器ActivityCollector中添加各种方法用于管理Activity。

比如:关闭某个指定的Activity,那我们就在ActivityCollector中添加一个关闭指定Activity的方法

kotlin代码:

/**

* 关闭指定的Activity

* @param activityName 需要关闭的Activity类名

*/

fun finishOneActivity(activityName: String) {

//在activities集合中找到类名与指定类名相同的Activity就关闭

for (activity in activities) {

val name = activity.javaClass.name//activity的类名

if (name == activityName) {

if(activity.isFinishing){

activities.remove(activity)

}else{

activity.finish()

}

}

}

}

java代码:

/**

* 关闭指定的Activity

* @param activityName 需要关闭的Activity包名类名

* */

public static void finishOneActivity(String activityName){

//在activities集合中找到类名与指定类名相同的Activity就关闭

for (Activity activity : activities){

String name= activity.getClass().getName();//activity的包名+类名

if(name.equals(activityName)){

if(activity.isFinishing()){

//当前activity如果已经Finish,则只从activities清除就好了

activities.remove(activity);

} else {

//没有Finish则Finish

activity.finish();

}

}

}

}

调用:

kotlin:

//关闭Test2Acticity

ActivityCollector.finishOneActivity(Test2Acticity::class.java.name)

java:

//关闭Test2Acticity

ActivityCollector.finishOneActivity(Test2Acticity.class.getName())

再比如:只保留某个Activity,关闭其他所有Activity

kotlin代码:

/**

* 只保留某个Activity,关闭其他所有Activity

* @param activityName 要保留的Activity类名

*/

fun finishOtherActivity(activityName: String) {

for (activity in activities) {

val name = activity.javaClass.name //activity的类名

if (name != activityName) {

if(activity.isFinishing){

activities.remove(activity)

}else{

activity.finish()

}

}

}

}

java代码:

/**

* 只保留某个Activity,关闭其他所有Activity

* @param activityName 要保留的Activity类名

* */

public static void finishOtherActivity(String activityName){

for (Activity activity : activities){

String name= activity.getClass().getName();//activity的类名

if(!name.equals(activityName)){

if(activity.isFinishing()){

//当前activity如果已经Finish,则只从activities清除就好了

activities.remove(activity);

} else {

//没有Finish则Finish

activity.finish();

}

}

}

}

调用和上面那个方法类似,我就不写了,大家如此聪明我就懒一点。写到这里我想如果再需要延伸一些什么需求大家应该也能举一反三了。

贴上ActivityCollector类的完整代码

kotlin代码:

/**

* 一个专门对所有的活动( Activity)进行管理的

*/

object ActivityCollector {

var activities = mutableListOf()

/**

* 添加Activity

* @param activity 添加的Activity对象

*/

fun addActivity(activity: Activity) {

activities.add(activity)

}

/**

* 删除Activity

* @param activity 删除的Activity对象

*/

fun removeActivity(activity: Activity) {

activities.remove(activity)

}

/**

* 关闭指定的Activity

* @param activityName 需要关闭的Activity类名

*/

fun finishOneActivity(activityName: String) {

//在activities集合中找到类名与指定类名相同的Activity就关闭

for (activity in activities) {

val name = activity.javaClass.name//activity的类名

if (name == activityName) {

if(activity.isFinishing){

activities.remove(activity)

}else{

activity.finish()

}

}

}

}

/**

* 只保留某个Activity,关闭其他所有Activity

* @param activityName 要保留的Activity类名

*/

fun finishOtherActivity(activityName: String) {

for (activity in activities) {

val name = activity.javaClass.name //activity的类名

if (name != activityName) {

if(activity.isFinishing){

activities.remove(activity)

}else{

activity.finish()

}

}

}

}

/**

* 关闭所有Activity

*/

fun finishAll() {

for (activity in activities) {

if (!activity.isFinishing) {

activity.finish()

}

}

activities.clear()

}

}

java代码:

/**

*一个专门的集合类对所有的活动( Activity)进行管理

*

* */

public class ActivityCollector {

public static List activities = new ArrayList();

/**

* 添加Activity

* @param activity 添加的Activity对象

* */

public static void addActivity(Activity activity) {

activities.add(activity);

}

/**

* 删除Activity

* @param activity 删除的Activity对象

* */

public static void removeActivity(Activity activity) {

activities.remove(activity);

}

/**

* 关闭指定的Activity

* @param activityName 需要关闭的Activity包名类名

* */

public static void finishOneActivity(String activityName){

//在activities集合中找到类名与指定类名相同的Activity就关闭

for (Activity activity : activities){

String name= activity.getClass().getName();//activity的包名+类名

if(name.equals(activityName)){

if(activity.isFinishing()){

//当前activity如果已经Finish,则只从activities清除就好了

activities.remove(activity);

} else {

//没有Finish则Finish

activity.finish();

}

}

}

}

/**

* 只保留某个Activity,关闭其他所有Activity

* @param activityName 要保留的Activity类名

* */

public static void finishOtherActivity(String activityName){

for (Activity activity : activities){

String name= activity.getClass().getName();//activity的类名

if(!name.equals(activityName)){

if(activity.isFinishing()){

//当前activity如果已经Finish,则只从activities清除就好了

activities.remove(activity);

} else {

//没有Finish则Finish

activity.finish();

}

}

}

}

/**

* 关闭所有Activity

* */

public static void finishAll() {

for (Activity activity : activities) {

if (!activity.isFinishing()) {

activity.finish();

}

}

activities.clear();

}

}

Android点击这个关闭那个,Android关闭指定的Activity或多个Activity相关推荐

  1. android 点击图片动画效果,Android仿微信图片点击全屏效果

    废话不多说,先看下Android图片点击全屏效果: 先是微信的 再是模仿的 先说下实现原理,再一步步分析 这里总共有2个Activity一个就是主页,一个就是显示我们图片效果的页面,参数通过Inten ...

  2. android+点击屏幕隐藏键盘,Android点击EditText文本框之外任何地方隐藏键盘的解决办法...

    1,实现方法一: 通过给当前界面布局文件的父layout设置点击事件(相当于给整个Activity设置点击事件),在事件里进行键盘隐藏 android:id="@+id/traceroute ...

  3. Android点击通知进入详情,Android 点击通知进入正在运行的程序

    好久没写文章,今天遇到一个新需求,app正在通话过程切换到后台,点击通知栏的时候 回到通话界面. 直接上代码吧首先是实现通知的代码 NotificationCompat.Builder notific ...

  4. android点击跳转卸载,[android]通过JNI实现卸载自身App后台发送Http请求~

    freddon 发表于2016-10-21 阅读 1252 | 评论 1 使用JNI fork进程实现 监控自身App被卸载 首先这个功能仅供cankao 也可以使用linux exec命令跳转到浏览 ...

  5. android点击按钮打开wifi或者关闭wifi

    1:写一个按钮实现点击 <Buttonandroid:id="@+id/btn_wifi"android:layout_width="match_parent&qu ...

  6. 极光推送android点击跳转页面,app关闭时点击推送消息实现页面跳转

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: ...

  7. android点击另一个app,Android 怎么从一个APP中打开另外一个APP

    Android 如何从一个APP中打开另外一个APP 众所周知,在一个APP内部,从一个页面跳转到另外一个页面是使用startactivity函数来实现的. 同样的,对于应用之间的跳转也是如此的.应用 ...

  8. android点击隐藏控件,Android编程实现点击EditText之外的控件隐藏软键盘功能

    本文实例讲述了Android编程实现点击EditText之外的控件隐藏软键盘功能.分享给大家供大家参考,具体如下: 工具类 ... public static void hideKeyboard(Co ...

  9. android点击textview后选择,android - 单击后,ClickableSpan TextView保持选中状态 - SO中文参考 - www.soinside.com...

    我正在使用以下代码使我的TextView看起来像一个链接,当用户点击它时,我显示一个AlertDialog.但是在用户离开对话框后文本保持选中状态并且看起来很难看. TextView terms = ...

  10. android点击地址调用地图,Android 实现点击按钮 调用手机外部地图导航

    //弹出Dialog 选择外部地图 private void setMap(){ final Dialog dia=new AlertDialog.Builder(mContext).create() ...

最新文章

  1. tarjan求强连通分量的思考
  2. You Need This One Skill to Succeed in IT--reference
  3. 通过exp命令对Oracle数据库进行备份操作(提供两种情况的备份:备份本地,备份远程的数据库)
  4. [转]ColorMatrixFilter--颜色矩阵滤镜
  5. Hive更换TEZ引擎
  6. testNG入门详解
  7. linux c计算两个int相除求百分比的实现
  8. mediarecorder路径设置为localsocket_PR学习之旅:pr怎么才能定位和修改视频保存路径,操作很简单...
  9. 做了5年程序员才明白,这项能力原来这么重要
  10. shell脚本中的逻辑判断,文件目录属性判断,if特殊用法,case判断
  11. Windows Server 2003 SP2中文版开放下载
  12. 系统类配置(三)【ubuntu14.04或者ubuntu16.04 配置caffe】
  13. Linux下的定时任务Cron
  14. 探索SQL Server元数据(一)
  15. c语言数组指针移位,C语言数组指针_3
  16. KVM多电脑切换器的KVM发展史
  17. unity实现简单游戏——井字棋
  18. Clickhouse查询手册
  19. JavaScript中的垃圾回收和内存泄漏
  20. java配置环境变量path(JAVA配置环境变量失败)

热门文章

  1. java食荤者餐厅管理系统
  2. 我用 Python 抓取《大秦赋》“相关数据”,发现了这些秘密......
  3. 智慧社区:物联网应用解决方案
  4. 技术分享 | 开源不稳?试试DJI N3飞控呢
  5. 知人者智,自知者明。胜人者有力,自胜者强。知足者富。强行者有志 不失其所者久。
  6. 科讯CMS V9.0标签大全
  7. Arduino-LED
  8. 牛根生经典语录100句
  9. 霸屏系统软件 /超级爆店码/霸屏系统源码
  10. C#轻松打造vista透明窗口(xp系统无任何vista主题)(汤贞营作品)