Android关于Activity的一些使用和全局管理技巧

Android 使用 ActivityLifecycleCallbacks 管理 Activity 和区分 App 前后台 文章目录ActivityLifecycleCallbacks 接口概述ActivityLifecycleCallbacks 接口可以做什么ActivityLifecycleCallbacks 的应用使用 ActivityLifecycleCallbacks 判断 App 前后台状态ActivityLifecycleCallbacks 原理分析参考 ActivityLifecycleCallbacks 接口概述 在 Android API 14 之后的 Application 类中,为我们提供了一个应用生命周 阅读详情

今天以一个小的Demo,来总结一点在Android关于Activity的使用和全局管理的技巧。


效果图:



从这个效果图,我们最直观的能看到的两个比较简单但也具有代表性的功能:

  • 在某个Activity处于非可见状态时(或在非属于于该Activity类的代码中),对其进行一定的界面更新工作。
  • 在任一界面退出程序(管理自己的App里的所有Activity)。


首先我们来看类似于“退出应用”的这个功能,应当怎么样实现。

对于一个Activity来说,我们知道如果调用其finish方法,既代表结束其生命周期。

而同时,一个应用当中的Activity则正是被一个一个压入了返回栈中,

当这条返回栈中所有的activity都结束了自己的生命周期,也就是我们所谓的“退出程序”。

所以,如果很自然的可以想到,如果我们想在自己应用的某个界面中,放置一个“退出应用”的按钮,自然就应当将所有仍处于返回栈当中的activity依次结束其生命周期。


有了思路,我们就可以开始写代码了。


1、首先,我们需要一个全局的用以存放和管理Activity的地方,换言之,也就是我们需要一个集合。

当一个activity被创建和加载时,我们便将其存放进集合当中;而当其执行"onDestroy"走到生命尽头时,则将其从集合中移除。

简单的来说,也就是该集合永远只会存放所有那些仍然处于“存活”状态的活动,而当我们点击“退出应用时”,所做的工作就是将这些仍然存活的活动取出,结束其生命周期。


于是我们首先新建一个activity的工具类:

public class AppActivities {
	public static HashMap<String, Activity> activities = new HashMap<String, Activity>();

	public static void addActivityToCache(String activityName, Activity activity) {
		activities.put(activityName, activity);
	}

	public static void destroyActivity(String activityName) {
		activities.remove(activityName);
	}

	public static void finishAll() {
		Set<String> keys = activities.keySet();

		for (String key : keys) {
			Activity ac = activities.get(key);
			if (!ac.isFinishing()) {
				ac.finish();
			}
		}
	}
}

2、接着,因为我们前面已经说到了,为了管理活动,我们所需要做的是:

在活动被创建时,将活动存放进集合。实际既是在activity的onCreat方法中将其存放进全局的activities。

而活动被销毁时,将其从集合中移除。实际既是在activity的onDestroy方法中将其从activities中移除。


于是,这里我们又可以使用到另外一个“偷懒”的小技巧。

既然我们要在所有的活动中都做这两个工作,总犯不着在所有的Activity类里都敲一遍代码吧。

将重复的工作代码进行抽离,这是我们应该做的。

于是我们可以自定义一个我们自己的Activity基类,去完成统一的工作,然后再让Activity继承我们自己的基类。

public class BaseActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		AppActivities.addActivityToCache(this.getClass().getName(), this);
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		AppActivities.destroyActivity(this.getClass().getName());
	}
}
在此,我们通过反射将activity的类名作为“key”存放进Map当中,

我们的用意是将此作为一个“唯一标识”,这是为了在后面实现我们之前谈到的另一个功能“在活动处于不可见状态”时对其进行更新工作”而准备的。


3、这里顺带的,我们再看android开发的另一个小技巧。

android中context的使用频率应该是最高的,而在有些地方其实并不那么容易获取到context。所以我们往往需要一个全局的Context。

并且根据你应用的实际需求,还有另外一些需要在全局使用到的信息,所以其实我们可以建立一个自己的“Application”类。

在这个Demo里,他可能类似于这样:

public class MyApplication extends Application {
	private static Context appContext;

	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		appContext = getApplicationContext();
	}

	public static Context getAppContext() {
		return appContext;
	}
	
	public static void quitApp(){
		AppActivities.finishAll();
	}
}

因为,在android里,一个应用初次启动时,系统会自动的去加载Application类去完成一些初始化工作。

所以我们在我们自己的Application-onCreate时,获取一个全局的context保存下来,然后提供get方法供整个程序在其余地方需要时进行获取。

另外我们定义了另一个方法,既“退出应用”的方法,其实际工作很简单,调用Acitivity工具类的finishAll方法,结束所有尚存活的活动的生命周期,进行退出程序。


4、现在,我们来想一下应当怎么样在一个在某个Activity处于非可见状态时(或在非属于于该Activity类的代码中),对其进行一定的界面更新工作。

这样的情况实际还是比较常见,比如:你在service中通过网络从服务器获取到了最新的数据,需要对activity进行更新等等。


这个时候,我们能想到的可能是通过广播或者Messager的方式,但实际上通过回调我们能够效率更高的去实现它。

所以我们定义一个回调的接口:

public interface OnActivityRefreshListener {

	void refreshView() ;
}

5、这个时候,实际上我们的准备工作已经做完了,接下来,我们就来看一下我们怎么样来进行实际应用。

public class MainActivity extends BaseActivity implements OnActivityRefreshListener {

	private TextView textView;
	private Button turn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		textView = (TextView) this.findViewById(R.id.text);
		turn = (Button) this.findViewById(R.id.turn);

		turn.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				Intent intent = new Intent(MainActivity.this, SecondActivity.class);
				startActivity(intent);
			}
		});
	}

	@Override
	public void refreshView() {
		textView.setText("界面已经被刷新咯!!!");
	}
}

我们让MainActivity继承了BaseActivity,并且实现了OnActivityRefreshListener接口。

所以此时,MainActivity的生命周期管理已经被自动的交给了我们之前创建的AppActivities类,我们不必再操心了。

实现了刷新界面的回调接口,并且根据需求自定义了回调方法“refreshView”。


6、接下来,就该创建第二个界面,来对我们前面所做的工作加以验证了。

public class SecondActivity extends BaseActivity {

	private Button refreshMainView, quitApp;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.activity_second);

		refreshMainView = (Button) findViewById(R.id.refresh_main);
		quitApp = (Button) findViewById(R.id.quit_app);

		refreshMainView.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				MainActivity activity = (MainActivity) AppActivities.activities
						.get(new MainActivity().getClass().getName());
				activity.refreshView();
			}
		});

		quitApp.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				MyApplication.quitApp();
			}
		});
	}
}

我们在SecondActivity中设置了两个按钮:

一个用于刷新主界面的TextView显示的数据;一个用于“退出应用”。

可以看到,因为我们之前的“辛勤劳动”,此时,我们要做的工作已经变得非常简单:

要刷新主界面的TextView,我们只需要通过反射获取到你想要其进行更新的Activity类的“类名”,获取到其存放在全局集合中的实例,然后执行回调方法,就搞定了。

想想这是多么方便,即便你的应用中有多少Activity,你只需要根据类名,得到想要的activity实例,执行回调则ok了。


而对于退出应用则更简单了,执行MyApplication里的quitApp方法则ok了。


由此,我们通过一个很小的例子,总结了一些关于android开发提交效率和代码复用率的小技巧的原理,

希望自己日积月累,更重要的是深刻的理解这些原理,从而根据实际的需求创造和使用合适的技巧。


Hook入门篇:Android应用中的状态管理 Hook技术是指通过拦截系统或应用程序的函数调用,插入自定义的代码逻辑,从而改变原始功能的行为。在Android开发中,我们可以使用Hook技术来修改应用的状态、拦截事件、注入自定义的行为等。通过使用Hook技术,我们可以在Android应用中实现灵活的状态管理。本文介绍了使用Xposed框架进行Hook的基本步骤,并提供了相应的源代码示例。希望本文能帮助你入门Android应用中的状态管理与Hook技术。请注意,Xposed框架需要在Root权限的设备上使用。 阅读详情

相关推荐

Android中不依赖Activity实现全局对话框的多种技术方案

创建全局对话框的一个有效方式是通过继承Android的Dialog类并实现自定义的布局与行为。与传统的AlertDialog相比,自定义Dialog提供了更多的灵活性。通过继承Dialog类,我们可以控制Dialog的大小、样式、布局和生命周期等。这允许开发者在保持Dialog的独立性的同时,实现复杂的用户交互。下面是一个基础的自定义Dialog类实现示例代码:init();// 设置Dialog的布局// 设置Dialog的宽度和高度为屏幕的百分之多少。

weixin_35750953的博客 690

Android Activity 全局管理 终极解决方案

Android Activity 全局管理 终极解决方案 管理Activity的好处在Android 开发中 Activity 的管理 对于一个App是至关重要的,管理所有Activity 不仅能实现在应用推出时关闭所有activity,还能实现获取当前Activity上一个Activity、寻找某个类型的Activity、结束某个Activity,以及Activity之间的跳转等多种交互操作。传统的

Kevin的世界 1万+

全局获取Activity对象

通过设置全局获取栈顶对象 ,从而进行各种需要activity 对象的实例操作,进行相关操作通过设置全局获取栈顶对象 ,从而进行各种需要activity 对象的实例操作,进行相关操作通过设置全局获取栈顶对象 ,从而进行各种需要activity 对象的实例操作,进行相关操作通过设置全局获取栈顶对象 ,从而进行各种需要activity 对象的实例操作,进行相关操作

android activity 全局,Android Activity 全局管理 终极解决方案

Android Activity 全局管理 终极解决方案管理Activity的好处在Android 开发中 Activity 的管理 对于一个App是至关重要的,管理所有Activity 不仅能实现在应用推出时关闭所有activity,还能实现获取当前Activity上一个Activity、寻找某个类型的Activity、结束某个Activity,以及Activity之间的跳转等多种交互操作。传统...

weixin_39553458的博客 439

《童虎学习笔记》5分钟用Keepalived搭建MySQL高可用实现虚ip自动漂移

1

tonghu_note的博客 5617

避开PSRR仿真三大坑:用Cadence psspxf分析分频器时,这些设置错了白忙活

本文深入探讨了使用Cadence psspxf工具进行分频器PSRR仿真时常见的三大技术陷阱,包括扰动信号参数设置、收敛性优化和后处理信号提取。通过详细的参数推荐和实战技巧,帮助工程师避免仿真误差,提升PSRR分析效率与准确性,特别适用于16分频器等数字-模拟混合电路设计。

weixin_29258297的博客 300

android Activity管理类(全局管理Activity)

转载前请注明链接:http://blog.youkuaiyun.com/daiwei714/article/details/51862610 又忙了一个多月,完成了新项目的第一阶段,最近觉得自己加班加的麻木了,没时间总结和学习东西。算了,说正事。 大家在开发项目的时候,第一步就是项目框架的搭建。包含了 http 请求框架, base基类(BaseActivity、BaseFragment等

hyl2804的博客 1906

安川机器人SOCKET 通讯

命令 功能 参数 示例 返回 SelectJob 选择程序 JobName LineNo SelectJob TEST 0 #SelectJob,Ok StartJob 启动程序 JobName StartJob TEST #StartJob,Ok Pause 暂停当前程序 - Pause #Pause,Ok Continue 继续当前程序 - Continue #Continue,Ok ServoOn 伺服上电 - ServoOn #ServoOn,Ok ServoOf...

记录学习内容 8285

android 全局状态管理,Android MediaPlayer的状态管理

用过MediaPlayer来实现音视频播放功能的同学应该都知道MediaPlayer是基于状态的,也就是说MediaPlayer内部保留着一个状态机,用于管理内部的状态。在编写代码时必须始终注意,某些操作仅在播放器处于特定状态时才有效。如果在错误的状态下执行某项操作,则系统可能会抛出异常或导致其他不良行为。下图展示了android MediaPlayer 的所有状态以及状态之间的转换,该图说明了从...

weixin_42386361的博客 913

树莓派编译程序时遇到卡死的问题

使用树莓派编译程序的时候,我遇到了程序比较大,编译到某个文件的时候树莓派会死机,关机之后重启可以继续使用,但是编译到同一个地方树莓派又死机的问题。 这个问题出现的主要原因是我给树莓派安装的Ubuntu mate 16.04 系统默认设置的swap交换空间不够,而编译某些文件的时候需要较大的交换空间,树莓派的交换空间被用满所以树莓派看起来好像是死机了的样子。 解决方法,扩展Ubuntu的交换空间。 解决方法,扩展Ubu

一杯二锅头 1万+

OpenClaw实战三|电商自动化AI工具:自动上下架+智能客服+订单统计,小店运营效率直接翻3倍

对电商小团队、夫妻店、个人商家来说,最缺的不是流量,而是省时间的工具。OpenClaw这套电商自动化AI工具,不用懂代码、不用买昂贵的SaaS软件,一台服务器、简单配置,就能把最耗时间的工作全部交给AI。人只做最有价值的事:选品、拍图、搞流量、处理复杂售后,剩下的上下架、回复、统计,全都让AI帮你打工。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1458

Android四大组件之-Activity的创建与应用

isExit) {Toast.makeText(getApplicationContext(), "再按一次退出程序",// 利用handler延迟发送更改状态信息} else {AppExit();/*** 完全退出应用程序,包括后台任务* 需添加权限:android.permission.KILL_BACKGROUND_PROCESSES*/try {finish();

2301_77563065的博客 2916

【DeepSeek开发入门】DeepSeek API 开发初体验

在人工智能蓬勃发展的时代,DeepSeek作为一款功能强大的AI大模型,为开发者提供了丰富的接口和便捷的开发体验。本文将基于DeepSeek的几个关键接口,带你快速入门,开启DeepSeek开发的探索之旅。通过本文,你已经初步了解了DeepSeek开发中几个重要接口的使用方法,包括列出模型、对话补全和查询余额接口,以及开发过程中的常见问题及解决办法。这是你踏入DeepSeek开发领域的第一步。在后续的学习中,你可以深入研究模型的参数调优,探索不同模型在各种场景下的应用,如利用模型实现更复杂的推理对话功能。

寻道AI,探索AI无限可能! 2754

android四大组件---Activity

Intent的详解:点击打开链接 Activity的启动方式:点击打开链接 Activity启动方式有四种,分别是:(前三个都是没有该对象时,和默认一样) standard 默认,可以不设置,栈A--B--C--A--A--A singleTop 栈顶唯一,栈A--B--C--A,多用于聊天页面 singleTask 栈A--B--C--之后在开启A,则栈里只有A,其余清空,多用

android程序猿HJ的博客 492

SAP UI5 用数据绑定导出:从 ExportTypeCSV 到 Spreadsheet 的完整实践与取舍

SAP UI5 数据绑定导出机制通过复用 Model、Binding Path 等配置,将控件视图转换为文件格式。早期方案使用 sap/ui/core/util/Export 生成 CSV,需自定义 ExportType 扩展格式;现代方案推荐 sap/ui/export/Spreadsheet 直接导出 XLSX,支持类型精度和智能表格集成。注意 CSV 方案已弃用但仍有业务价值,需根据项目需求选择合适方案。两种方式都基于数据绑定,避免重复定义列结构和格式化逻辑。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 268

【软考高级架构】案例题考前突击6——大数据架构

前一类的数据主要由流量方以接口的方式提供(比如对接的腾讯广点通平台),后一类则是某网特有的数据,通过买家的浏览、下单、付款日志算出来。1. 在数据层面只维护一张包含所有指标的MySQL表,表中的stday字段作为索引,stday=当天的保存实时数据,stday<当天的保存离线数据。典型的大数据架构,除了Lambda架构之外,还有kappa架构,这两个架构的区别如下标所示,请补充表中空(1)-(4)第二,实时数据只对接了内部的kafka消息,没有实时的获取第三方的曝光、点击、浏览数据。

qq837993702的博客 66

Android - 小百科

Context getSupportFragmentManager:获取应用的 Fragment 管理器,可以访问所有的 Fragment getContentResolver:内容共享,可对数据进行 CRUD 操作 getSystemService:可用以获得 Wifi、窗口、状态栏等服务,进而获得它们的管理器,eg:NotificationManager manager = (Notifica...

qq_43323826的博客 1499

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android进阶技巧

Android进阶技巧 一、全局获取Context 一般我们获取context都是在activity中,直接用this就好,但是好多情况写不是在activity中也需要用到context,这时只要定义一个全局context,在程序初始化的类中获取 public class MyApplication extends Application { private static Cont...

anwanfei的博客 247

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Android之退出整个应用方法之一

在Android应用开发中,难免会遇到需要完全退出整个应用的时候,我在网上也看了一下,感觉通过广播是个很好的方法,在这里,我用了另外一个方法,简而言之,通过单例模式把每个Activity 的引用添加到一个全局链表中,每次退出程序调用System.exit(0)时,先调用链表中Activity 的finish方法。直接上代码: import java.util.LinkedList; i...

mmdev 125

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

关于Android.view.WindowManager$BadTokenException异常

情况描述:使用自定义的对话框时,Context传入了MyApp下的全局context。导致报错。Android.view.WindowManager$BadTokenException: Unable to add window – token null is not for an application解决方案:传入Activity的context,因为只有Activity才能添加Window。

caterwind的博客 438

全局Activity

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

小奇点 342

android 网络请求管理 简书,Android Activity 全局管理 终极解决方案

Android Activity 全局管理 终极解决方案管理Activity的好处在Android 开发中 Activity 的管理 对于一个App是至关重要的,管理所有Activity 不仅能实现在应用推出时关闭所有activity,还能实现获取当前Activity上一个Activity、寻找某个类型的Activity、结束某个Activity,以及Activity之间的跳转等多种交互操作。传统...

weixin_39935903的博客 228

Android小技巧—Activity管理

一、概述本章节主要是记录一下平时android开发过程中activity的管理方法,我们通常在开发过程中可能会有突然退出app,或者获取某个活动对象等等各种情况处理,这时候有个全局管理的Activity栈将会方便很多。Android系统有自己的Activity管理机制,也就是 Activity Stack(栈),奉行着先进后出原则。所以,我们就通过Stack来进行Activity的管理。下边我将记录

qq_24442769的博客 384

Android Activity全局管理类

问题描述 做Android项目,退出程序时,有时不能退出所有的activity,这时我们就需要在退出时,关闭所有的activity。 相信大家在处理Activity跳转,或者是删除指定的Activity和所有的Activity都会遇到困惑。尤其是在做项目的退出整个应用功能模块的时候,需要关闭所有的Activity,这里对于新手来说经常性会存在MainActivity已经finish掉了,但是还...

现状很好 669

安卓进程都有Application和Activity吗?

摘要: Android系统中,只有应用(App)进程才会包含Application对象和Activity等组件,这些组件由框架层管理,生命周期由AMS调度。系统服务进程(如system_server、media_server)运行的是底层服务或原生代码,不涉及App框架,因此没有Application或Activity。特殊情况下,预装的系统应用(如“设置”)属于普通App进程,仍包含这些组件。简言之,系统服务进程与App进程的组件结构完全不同。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1037
上一篇: Android屏幕适配 px,dp,dpi及density的关系与深入理解
下一篇: Android - ViewPager + Fragment 实现仿微信界面
LaterEqualsNever
博客等级 码龄12年 297粉丝 61原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值