Android 获取栈最顶层Activity和Application Context解决方案

Android获取栈顶Activity/查看应用使用情况(适配Android6.0) Android获取栈顶Activity 阅读详情

前言:和有梦想的人一起奋斗,那也就不会觉得孤独了。


以前开发都是在别人搭完框架的情况下进行开发,今天遇到一个很头疼的问题,想要在做一个很常见的功能,当接收到极光推送的消息,就在当前页面显示一个dialog通知用户账号在别处已经登录,需要重新登录。这个问题真的是难倒我了,因为极光推送过来的时候,我们并不知道用户操作到了哪一个Activity,而Dialog初始化的时候需要一个Activity或者一个context作为实例化的参数。当我一脸懵逼的时候,还是万能的艳芳姐给我提供了解决的思路。也让我在一定程度上对Application有一定的认知。

android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application是单例 (singleton)模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。因此在安卓中我们可以避免使用静态变量来存储长久保存的值,而用Application。

这也给我们提供了解决思路,在我们需要获取到当前Context或者Activity对象的时候,我们就可以通过重写这个Application来保存当前的Context或者Activity。

public class BaseApp extends Application {
    private static BaseApp mApp;
    private static Activity sActivity;
    @Override
    public void onCreate() {
        super.onCreate();
        mApp = this;
        this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                Log.d("YWK",activity+"onActivityCreated");
            }

            @Override
            public void onActivityStarted(Activity activity) {
                Log.d("YWK",activity+"onActivityStarted");
                sActivity=activity;

            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {

            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
    }

    public static Context getAppContext() {
        return mApp;
    }

    public static Resources getAppResources() {
        return mApp.getResources();
    }

    public static Activity getActivity(){
        return sActivity;
    }
}

这个就是我们重新写的Application,其实我们在做任何项目的时候,应该都会去重写这个Application,去实现一些全局变量的保存,向上面这段代码,我们保存了Activity对象和Context对象,然后重写Application的Oncreate,mApp=this,这里我们保存了一个Application Context,为什么说Application Context呢?我们在下面讨论。

然后我们通过Application调用registerActivityLifecycleCallbacks的方法,注册一个监听器,对Activity的生命周期进行监听,这样我们只要在一个Activity在start的时候,使sActivity=这个Activity就好了。

这样在初始化Dialog的时候 AlertDialog.Builder dialog = new AlertDialog.Builder(BaseApp.getActivity());我们将我们Application中获取到的最新的Activity传进去,这样不管用户在哪一个界面,我们都能获取到栈最顶层的Activity。

最后我们要给我们的应用设置上我们自定义的Application:

<application
        android:name=".base.BaseApp"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:largeHeap="true"

        android:theme="@style/AppTheme">

我们通过设置AndroidManifest.xml文件,在application中设置name属性就好了。



Application Context 和Activity Context的区别:

为什么我上面说是Application Context而不是说Activity Context呢?在解决上面那个功能的时候,我最开始就在初始化Dialog的时候我是这样写的:

AlertDialog.Builder dialog = new AlertDialog.Builder(BaseApp.getAppContext());

结果报错,一直定位在这一行。一直不解,后来才知道Application中获取的Context是一个全局的Application,它和Activity Context的使用场景有很大的不同。


大家注意看到有一些NO上添加了一些数字,其实这些从能力上来说是YES,但是为什么说是NO呢?下面一个一个解释:

数字1:启动Activity在这些类中是可以的,但是需要创建一个新的task。一般情况不推荐。

数字2:在这些类中去layout inflate是合法的,但是会使用系统默认的主题样式,如果你自定义了某些样式可能不会被使用。

数字3:在receiver为null时允许,在4.2或以上的版本中,用于获取黏性广播的当前值。(可以无视)

注:ContentProvider、BroadcastReceiver之所以在上述表格中,是因为在其内部方法中都有一个context用于使用。


好了,这里我们看下表格,重点看Activity和Application,可以看到,和UI相关的方法基本都不建议或者不可使用Application,并且,前三个操作基本不可能在Application中出现。实际上,只要把握住一点,凡是跟UI相关的,都应该使用Activity做为Context来处理;其他的一些操作,Service,Activity,Application等实例都可以,当然了,注意Context引用的持有,防止内存泄漏。

以上这段话是引用了鸿洋大神的博客,这么一看,我们也就很清楚了Application Context和Activity Context的区别。


Android深入理解Context(一)Context关联类和Application Context创建过程 Context也就是上下文对象,是Android较为常用的类,但是对于Context,很多人都停留在会用的阶段,这个系列会带大家从源码角度来分析Context,从而更加深入的理解它。 阅读详情

相关推荐

Framework | 在Android中运行时获取顶层Activity并处理业务逻辑

在本文中,我们介绍了如何在Android中通过Service后台获取顶层Activity并进行业务处理。这个方法主要依赖于的方法来获取任务栈中的顶层Activity信息。虽然这种方式在Android 5.0之后受到了限制,但它仍然适用于特定的应用场景。开发者应当注意系统版本的兼容性,并根据具体需求调整实现方案。

虎哥LoveDroid 1120

获取当前系统的顶层的Activity(最后一种可以)

关注下面log的打印信息中的className字段, 获取当前的Activity, 包名, ActivityTask的根Activity, 记录的时间戳。在有些手机上测试时,发现 It’s API > 19,只能获取当前App的Activities。设置->隐私保护->保护隐私->特殊应用权限->使用情况访问权限。日志举例如下, 实际上日志非常多, 取决于代码设置统计时间区间。小米手机(Android10)打开权限开关。

有速度的空气的博客 1983

从源码分析 Application、Activity、Service 中 Context 的关系和区别

从源码分析 Application、Activity、Service 中 Context 的关系和区别 我们来简单回顾一下 Context 是什么? Context 被翻译成上下文,是应用程序环境的全局信息接口,它是一个抽象类,其实现由 Android 系统提供的 ContextImpl 类。我们通过 Context 可以非常方便的访问应用程序的资源和类,以及可以进行应用程序级的各种操作,比如启动 Activity 和 Service、注册和发送广播、权限操作、主题操作、存储对象操作等等。它简直是一个万能

卜大爷的博客 2万+

获得栈中最顶层的Activity

null) {

weixin_42294959的博客 1181

Android判断栈顶activity;打印当前最顶层的activity类名;采用服务后台运行获取当前activity类名;

Android判断栈顶activity;打印当前最顶层的activity类名;采用服务后台运行获取当前activity类名;是一个demo App,使用Android studio工具打开,有需要的可以自行下载;

学习笔记|多样本单因素方差分析|事后比较|方差齐性|F检验|韦尔奇检验|两独立样本T检验|两样本方差分析|规范表达|《小白爱上SPSS》课程:SPSS第七讲 | 单因素方差分析怎么做?

学习笔记|多样本单因素方差分析|事后比较|方差齐性|F检验|韦尔奇检验|两独立样本T检验|两样本方差分析|规范表达|《小白爱上SPSS》课程:SPSS第七讲 | 单因素方差分析怎么做?

Medlar_CN的博客 9515

android activity context,Android 获取栈最顶层Activity和Application Context解决方案

转自 Android 获取栈最顶层Activity和Application Context解决方案在做类似“您的账号在异地登陆,您被迫退出”的dialog弹窗的功能时,不知道怎么获取当前Activity,刚好遇到这篇博主的文章,确实好用,在此记下。以前开发都是在别人搭完框架的情况下进行开发,今天遇到一个很头疼的问题,想要在做一个很常见的功能,当接收到极光推送的消息,就在当前页面显示一个dialog...

weixin_39756235的博客 546

飞书组织架构同步至LDAP:实现企业应用统一身份认证的实战指南

本文详细介绍了如何将飞书组织架构同步至LDAP,实现企业应用统一身份认证的实战方案。通过飞书开放平台API与LDAP服务的集成,企业可以大幅减少账号管理工作量,提升IT效率。文章涵盖技术架构设计、密码策略、详细配置步骤及自动化同步实现,特别适合需要统一认证体系的中大型企业。

weixin_29172201的博客 332

Activity、Service和Application的Context的区别

1、Context的类图 Context:是一个接口类,主要提供通用接口 ContextImpl:Context接口的具体实现类 ContextWrapper:Context的包装类,内部持有一个ContextImpl的实例对象mBase,对Context的操作最终都进入ContextImpl类 ContextThemeWrapper:该类内部包含了主题(Theme)相关的接口,...

追yi流年 6374

DAC8760高精度数模转换器原理与工业级嵌入式应用

数模转换器(DAC)是工业测控系统中实现数字指令到模拟执行的关键接口,其核心性能由分辨率、线性度、温漂及系统级TUE(总未调整误差)共同决定。DAC8760作为一款16位四象限精密DAC,集成了可编程增益放大器(PGA)、内部基准源与SPI高速接口,支持电压/电流双模输出,显著提升闭环控制精度与硬件适配灵活性。其技术价值在于将高精度模拟前端与数字控制深度耦合,满足PLC、ATE及激光偏置等严苛场景对长期稳定性与多通道同步性的要求。本文围绕DAC8760的寄存器配置、HAL/LL驱动实践、PCB布局规范、现场

weixin_42315569的博客 583

【OWL部署】Manus又一开源平替OWL真的很好用吗?手把手带你部署并运行你的AI助手OWL(对接Qwen、硅基流动接口)

本文介绍了通用人工智能OWL的部署及国内接口对接,全篇干货满满,手把手教学。

MosuoLc的博客 4042

Android Application中的Context和Activity中的Context的区别

首先Activity.this和getApplicationContext()返回的不是同一个对象,一个是当前Activity的实例,一个是项目的Application的实例,这两者的生命周期是不同的,它们各自的使用场景不同,this.getApplicationContext()取的是这个应用程序的Context,它的生命周期伴随应用程序的存在而存在;而Activity.this取的是当前Activity的Context,它的生命周期则只能存活于当前Activity,这两者的生命周期是不同的。

2501_90323761的博客 1135

《电磁兼容设计》专栏说明

本专栏自2024年1月起开始更新,仅设此一个电磁兼容相关知识专栏,并将一直持续更新下去,无期限

linkking27的博客 791

Application context和Activity context的区别

这是两种不同的context,也是最常见的两种.第一种中context的生命周期与Application的生命周期相关的,context随着Application的销毁而销毁,伴随application的一生,与activity的生命周期无关.第二种中的context跟Activity的生命周期是相关的,但是对一个Application来说,Activity可以销毁几次,那么属于Activity的

Vincent_czz的专栏 1万+

【ODX介绍】-4.2-UDS诊断$27服务在ODX-D诊断描述文件中如何描述

共25页精讲:附ODX-D XML:UDS $27 Security服务0x61和0x62 Sub-Function,其它Sub-Function可参照其格式。 目录 1 ODX-D描述一个UDS $27 Security服务Sub-Function的结构 2 标签DIAG-SERVICE描述的内容 2.1 举例:DIAG-SERVICE的XML描述 3 标签REQUEST描述的内容 3.1 举例:REQUEST的XML描述 4 标签POS-RESPONSE描述的内容 4.1 举例:PO..

「汽车电子助手」的博客 1122

【异常】Cursor IDE 扩展主机超时错误处理文档The agent execution provider did not respond within 4 seconds.

该错误通常是 Cursor IDE 的临时性问题,不影响项目代码。大多数情况下,重新加载窗口或重启 IDE 即可解决。如果问题持续,可按上述进阶方案排查。重新加载窗口(最快)重启 IDE检查系统资源清理缓存检查扩展更多关于 AI+教育领域的干货,可以关注我的微信公众号第一时间获取哦~

奶爸的编程之路,也就一周冷个三天 2700

Android中Application、Activity和Service它们真正干活的Context是什么?

文章收藏的好句子:真正的顺其自然,是竭尽所能后的不强求,而不是两手一摊的不作为。ps:本篇文章的源码是基于 Android Api 26 来分析的。看到文章标题是不是有点理不清,是不是觉得...

qq_37837621的博客 2618

Transformer-LSTM预测 | 基于Transformer-LSTM的多变量单步时间序列预测(Matlab)

Transformer-LSTM预测 | 基于Transformer-LSTM的多变量单步时间序列预测(Matlab)

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 192

android 获取顶部栈点stack的Activity以及上下文Context

一、获取顶部栈点的Activity的上下文Context MyApp.getApplication().getNowTopContext(); public class MyApp extends Application { public static MyApp application; @Override public void onCreate() { super.onCreate(); this.applicatio...

u013252110的博客 1486

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android Application中的Context和Activity中的Context的区别(1)

首先Activity.this和getApplicationContext()返回的不是同一个对象,一个是当前Activity的实例,一个是项目的Application的实例,这两者的生命周期是不同的,它们各自的使用场景不同,this.getApplicationContext()取的是这个应用程序的Context,它的生命周期伴随应用程序的存在而存在;而Activity.this取的是当前Activity的Context,它的生命周期则只能存活于当前Activity,这两者的生命周期是不同的。

2401_86391721的博客 1252

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

安卓下Application和Activity的Context获取

补充:要在Fragement或View中获得Application的Context,先参考情形二和情形三得到Activity或Activity的Context,再参考情形一得到Application的Context。getApplicationContext()获得Application的Context,结果一样。getContext()得到的是一样的,都是Activity的Context。Application,其本身也是一个的Context,也可以通过。是Activity的Context。

格物致知的专栏 [音视频编解码 网络协议 计算机视觉 计算机图形学 图像理解 语音识别 机器学习 模拟电路 传感器] 1786

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Android 全局获取Context/Activity实例的方法

问题描述: 项目过程中,同事需要我提供我负责模块功能调用的对外接口。 为了提供对外接口,我创建了一个普通类用来当作静态方法类,但是在Android中,很多的系统功能都要求提供当前Activity或是Context上下文,可是在普通类中要获取到Ac实例应该怎么处理呢 解决方案: 上网一顿查 全局获取context的方法 果然被我找到了,大致意思是自定义MyApplication类继承Application,通过onCreate()方法初始化静态变量mContext,这样外界可以通过MyApplicati

繁鑫..的博客 2631
上一篇: Bitmap too large to be uploaded into a texture 解决方案
下一篇: Android事件分发机制(上)View部分
VikcyWinner
博客等级 码龄11年 12粉丝 25原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值