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工具打开,有需要的可以自行下载;

5G时代必知:LDPC与Polar码实战解析(附MATLAB仿真代码)

本文深入解析5G时代核心信道编码技术LDPC码与Polar码的原理差异及性能表现,通过MATLAB仿真代码展示其在实际通信系统中的应用。LDPC码适用于大数据块高速传输,而Polar码在小数据块低时延场景表现优异,帮助开发者优化5G系统设计。

sugar的博客 642

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

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

weixin_39756235的博客 546

JAVA审批流程,一个简单表结构设计方案By OU

一、表结构设计1.流程表(process)用于存储审批流程的基本信息。字段名类型描述idBIGINT主键,流程IDname流程名称TEXT流程描述DATETIME创建时间DATETIME更新时间statusTINYINT(1)流程状态(0: 停用, 1: 启用)2.节点表(process_node)用于管理流程中的每个审批节点。字段名类型描述idBIGINT主键,节点IDprocess_idBIGINT流程ID,外键关联process.id。

1901

Activity、Service和Application的Context的区别

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

追yi流年 6374

信创改造实战:SpringBoot项目迁移到宝兰德BES 9.5.5的完整避坑指南(附依赖与web.xml配置)

本文详细介绍了将SpringBoot项目迁移到宝兰德BES 9.5.5的完整流程,包括依赖改造、web.xml配置降级等关键步骤。通过实战案例和避坑指南,帮助开发者高效完成国产中间件适配,确保项目平稳运行。特别针对Tomcat依赖排除和BES适配器选择提供了专业建议。

weixin_30689307的博客 740

基于FPGA 外置qspi Flash的读写

fpga上实现flash读写代码

weixin_43498765的博客 4954

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

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

2501_90323761的博客 1135

全志 T527_Android13 编译 [ 避坑必看 ]

Swap 概念: Linux中Swap(即:交换分区),类似于Windows的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。它的功能就是在内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出内存来让别的程序运行。当输入编译命令make -j16 的时候,会有如下提示,这是官方建议通过减少编译线程来解决编译时消耗内存过大的问题。Android 13 系统的编译流程,编译一共分为两部分:内核编译与 Android 编译。

公众号:嵌入式分享 2111

Application context和Activity context的区别

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

Vincent_czz的专栏 1万+

在 PFCG 中完成 SAP Fiori 对象分配:把 Business Catalog、Space、Page 与授权一次讲透

摘要:SAP Fiori权限配置的关键在于理解Business Catalog与Space的分层授权逻辑。传统SAP GUI中直接分配事务码的方式不适用于Fiori环境,必须通过PFCG为角色分配Catalog(提供应用访问权限)和Space(控制首页展示结构)。Catalog会自动解析所需OData服务授权,而Space则决定用户在Launchpad中看到的导航布局。常见错误包括直接分配Page而非其所属Space,或仅配置Space而忽略Catalog。最佳实践是优先使用Catalog驱动授权提议,再在

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

Android 13.0 app进程保活白名单功能实现

在13.0的系统rom产品开发中,在某些重要的app即使进入后台,产品需求要求也不想被系统杀掉进程,需要app长时间保活,就是app进程保活白名单功能的实现, 所以需要在系统杀进程的时候不杀掉白名单的进程,接下来就看怎么样来实现这些功能

安卓兼职framework和app工程师的博客 3142

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

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

qq_37837621的博客 2618

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

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、付费专栏及课程。

余额充值