文档章节

Android 如何获取当前Activity实例对象?

fuchenxuan
 fuchenxuan
发布于 2016/05/23 22:26
字数 730
阅读 59
收藏 0

Android 如何获取当前Activity实例对象?

在项目开发中,遇到这么个情景,Activity是第三方部门的jar包,而我们需要当前界面用户输入的值 并且校验,jar包里面 并没有提供支持,然而这个jar包牵扯跨部门众多,更新困难。在短时间内只能靠我们自己 想办法获取当前屏幕的Activity 实例 对象,然后获取的View 遍历 到自己需要的值。

以上都是废话,直接看需求~。

获取当前屏幕Activity实例对象

网上很多说使用获取Task 名称,利用ActivityManager的runingtask 代码如下:
记得在加AndroidManifest.xml中增加权限

<uses-permission android:name="android.permission.GET_TASKS"/>


ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningTaskInfo> forGroundActivity = activityManager.getRunningTasks(1);
        RunningTaskInfo currentActivity;
        currentActivity = forGroundActivity.get(0);
        String activityName = currentActivity.topActivity.getClassName();

可以看到代码,这样并不能获取到Activity 对象。

ActivityLifecycleCallbacks 是什么?

见名知意,Activity生命周期回调,Application通过此接口提供了一套回调方法,用于让开发者对Activity的生命周期事件进行集中处理。
但是这个要求API 14+ (Android 4.0+)以上使用,幸好我们这个最低支持,满足需求。

ActivityLifecycleCallbacks 怎么使用?

重写Application的onCreate()方法,或在Application的无参构造方法内,调用Application.registerActivityLifecycleCallbacks()方法,并实现ActivityLifecycleCallbacks接口

public void onCreate() {  
  super.onCreate();  
  this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {  

    @Override  
    public void onActivityStopped(Activity activity) {  
        Logger.v(activity, "onActivityStopped");  
    }  

    @Override  
    public void onActivityStarted(Activity activity) {  
        Logger.v(activity, "onActivityStarted");  
    }  

    @Override  
    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {  
        Logger.v(activity, "onActivitySaveInstanceState");  
    }  

    @Override  
    public void onActivityResumed(Activity activity) {  
        Logger.v(activity, "onActivityResumed");  
    }  

    @Override  
    public void onActivityPaused(Activity activity) {  
        Logger.v(activity, "onActivityPaused");  
    }  

    @Override  
    public void onActivityDestroyed(Activity activity) {  
        Logger.v(activity, "onActivityDestroyed");  
    }  

    @Override  
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {  
        Logger.v(activity, "onActivityCreated");  
    }  
  });  
}; 

这样就能获取到activity的对象了。之前知道还有其他方法可以获取对象,没记住现在已经忘记了。如有大神发现,麻烦告诉小弟。~~谢谢

ActivityLifecycleCallbacks 为什么?

我们查看Application的源码,发现原来 ActivityLifecycleCallbacks 就是Application的内部类。

public class Application extends ContextWrapper implements ComponentCallbacks2 {
    private ArrayList<ComponentCallbacks> mComponentCallbacks =
            new ArrayList<ComponentCallbacks>();
    private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks =
            new ArrayList<ActivityLifecycleCallbacks>();
    private ArrayList<OnProvideAssistDataListener> mAssistCallbacks = null;
    /** @hide */
    public LoadedApk mLoadedApk;
    public interface ActivityLifecycleCallbacks {
        void onActivityCreated(Activity activity, Bundle savedInstanceState);
        void onActivityStarted(Activity activity);
        void onActivityResumed(Activity activity);
        void onActivityPaused(Activity activity);
        void onActivityStopped(Activity activity);
        void onActivitySaveInstanceState(Activity activity, Bundle outState);
        void onActivityDestroyed(Activity activity);
    }

再来看是怎么回调的,这是内部API

// —————— Internal API ——————

  /** * @hide */
    /* package */ final void attach(Context context) {
        attachBaseContext(context);
        mLoadedApk = ContextImpl.getImpl(context).mPackageInfo;
    }
       //调用onActivityCreated
    /* package */ void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) {
        Object[] callbacks = collectActivityLifecycleCallbacks();
        if (callbacks != null) {
            for (int i=0; i<callbacks.length; i++) {
                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
                        savedInstanceState);
            }
        }
    }
    //调用onActivityStarted
    /* package */ void dispatchActivityStarted(Activity activity) {
        Object[] callbacks = collectActivityLifecycleCallbacks();
        if (callbacks != null) {
            for (int i=0; i<callbacks.length; i++) {
                ((ActivityLifecycleCallbacks)callbacks[i]).onActivityStarted(activity);
            }
        }
    }

其他应用

我们还可以利用ActivityLifecycleCallbacks 做一些数据埋点,统计之类的应用,对其统一做处理。这样对减少Activity的代码入侵。尽量简化和模块化的注入生命周期方法。

水平有限,若有错漏,欢迎指正,批评,如需转载,请注明出处–http://blog.csdn.net/vfush,谢谢!

© 著作权归作者所有

fuchenxuan
粉丝 10
博文 29
码字总数 52850
作品 0
南昌
私信 提问
View.getContext()与Activity的Context

> View.getContext() Context context = imageView.getContext(); if (context instanceof Activity) { Activity activity = (Activity)context; // ... } 在 5.0 以下,这个 imageView.getC......

desaco
04/24
0
0
如何获取系统当前运行的activity对象?

截取当前运行程序解屏保存png格式,如何获得当前运行其他程序的activity的实例对象呢? 网上说反射或许可以,利用反射试了下: ActivityManager am = (ActivityManager) getSystemService(AC...

ecnu_zhen
2012/09/02
15.2K
3
Activity启动模式的理解

一、理解 Tasks and Back Stack(任务和后台堆栈) 一个 App 对应一个 Task,该app 内的所有 activity 被安排在一个后台堆栈里。 多窗口模式下:一个windows下可能由多个 Task,系统为每个窗...

Agnes2017
2018/05/04
8
0
Android Activity中的四种启动模式

Android总Activity的启动模式分为四种: <activity android:name=".MainActivity" android:launchMode="standard" /> 【standard】 默认模式启动模式,每次激活Activity时都会创建Activity,......

恰同学少年
2015/07/27
141
0
Android类参考---Fragment(一)

1. 继承关系 java.lang.Object |__android.app.Fragment 实现接口:ComponentCallbacks2 View.OnCreateContextMenuListener 引入版本:API Level 11 已知的子类: DialogFragment、ListFragm......

长平狐
2012/10/16
416
0

没有更多内容

加载失败,请刷新页面

加载更多

Qt编写自定义控件69-代码行数统计

一、前言 代码行数统计主要用来统计项目中的所有文件的代码行数,其中包括空行、注释行、代码行,可以指定过滤拓展名,比如只想统计.cpp的文件,也可以指定文件或者指定目录进行统计。写完这...

飞扬青云
19分钟前
3
0
驰骋工作流引擎-ccflow关于 “ 是否自动计算未来的处理人”的功能变更

关键字:流程未来节点处理人 工作流快速开发平台 工作流流设计 业务流程管理 asp.net 开源工作流 业务背景:一个流程在启动起来后,是可以对一些节点计算出来处理人是谁,流程的走向。对于另...

孟娟
35分钟前
4
0
IT兄弟连 HTML5教程 HTML5表单 HTML表单设计1

表单是PHP程序中最常使用的收集站点访问者信息的数据输入界面。通过表单浏览器获取用户的输入数据,并传送给Web服务器的脚本程序中,以各种不同的方式进行处理。在表单中提供了多种输入方式,...

老码农的一亩三分地
36分钟前
4
0
武者Vue

本文转载于:专业的前端网站➼武者Vue 1 - Introduction2 - The Vue Instance3 - Data & Methods4 - Data Binding5 - Events6 - Event Modifiers7 - Keyboard Events8 - Two-Way Data......

前端老手
42分钟前
6
0
uni app 零基础小白到项目实战

$emit 子组件传给父组件$ref 父组件操作子组件 公用模板 uni-app全局变量的几种实现方法 const websiteUrl = 'http'const now = Date.now || function() { return new Date().getTime......

达达前端小酒馆
52分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部