Android 如何获取当前Activity实例对象?
来源:互联网 发布:柴鸡蛋逆袭网络剧下载 编辑:程序博客网 时间:2024/06/10 18:52
Android 如何获取当前Activity实例对象?
在项目开发中,遇到这么个情景,Activity是第三方部门的jar包,而我们需要当前界面用户输入的值 并且校验,jar包里面 并没有提供支持,然而这个jar包牵扯跨部门众多,更新困难。在短时间内只能靠我们自己 想办法获取当前屏幕的Activity 实例 对象,然后获取的View 遍历 到自己需要的值。
以上都是废话,直接看需求~。
获取当前屏幕Activity实例对象
网上很多说使用获取Task 名称,利用ActivityManager的runingtask 代码如下:
记得在加AndroidManifest.xml中增加权限
<uses-permission android:name="android.permission.GET_TASKS"/>
ActivityLifecycleCallbacks 是什么?
见名知意,Activity生命周期回调,Application通过此接口提供了一套回调方法,用于让开发者对Activity的生命周期事件进行集中处理。
但是这个要求API 14+ (Android 4.0+)以上使用,幸好我们这个最低支持,满足需求。
ActivityLifecycleCallbacks 怎么使用?
重写Application的onCreate()方法,或在Application的无参构造方法内,调用Application.registerActivityLifecycleCallbacks()方法,并实现ActivityLifecycleCallbacks接口
<code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>() { <span class="hljs-keyword">super</span>.onCreate(); <span class="hljs-keyword">this</span>.registerActivityLifecycleCallbacks(<span class="hljs-keyword">new</span> ActivityLifecycleCallbacks() { <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onActivityStopped</span>(Activity activity) { Logger.v(activity, <span class="hljs-string">"onActivityStopped"</span>); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onActivityStarted</span>(Activity activity) { Logger.v(activity, <span class="hljs-string">"onActivityStarted"</span>); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onActivitySaveInstanceState</span>(Activity activity, Bundle outState) { Logger.v(activity, <span class="hljs-string">"onActivitySaveInstanceState"</span>); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onActivityResumed</span>(Activity activity) { Logger.v(activity, <span class="hljs-string">"onActivityResumed"</span>); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onActivityPaused</span>(Activity activity) { Logger.v(activity, <span class="hljs-string">"onActivityPaused"</span>); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onActivityDestroyed</span>(Activity activity) { Logger.v(activity, <span class="hljs-string">"onActivityDestroyed"</span>); } <span class="hljs-annotation">@Override</span> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onActivityCreated</span>(Activity activity, Bundle savedInstanceState) { Logger.v(activity, <span class="hljs-string">"onActivityCreated"</span>); } }); }; </code>
这样就能获取到activity的对象了。之前知道还有其他方法可以获取对象,没记住现在已经忘记了。如有大神发现,麻烦告诉小弟。~~谢谢
ActivityLifecycleCallbacks 为什么?
我们查看Application的源码,发现原来 ActivityLifecycleCallbacks 就是Application的内部类。
<code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Application</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">ContextWrapper</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">ComponentCallbacks2</span> {</span> <span class="hljs-keyword">private</span> ArrayList<ComponentCallbacks> mComponentCallbacks = <span class="hljs-keyword">new</span> ArrayList<ComponentCallbacks>(); <span class="hljs-keyword">private</span> ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks = <span class="hljs-keyword">new</span> ArrayList<ActivityLifecycleCallbacks>(); <span class="hljs-keyword">private</span> ArrayList<OnProvideAssistDataListener> mAssistCallbacks = <span class="hljs-keyword">null</span>; <span class="hljs-javadoc">/**<span class="hljs-javadoctag"> @hide</span> */</span> <span class="hljs-keyword">public</span> LoadedApk mLoadedApk; <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">ActivityLifecycleCallbacks</span> {</span> <span class="hljs-keyword">void</span> onActivityCreated(Activity activity, Bundle savedInstanceState); <span class="hljs-keyword">void</span> onActivityStarted(Activity activity); <span class="hljs-keyword">void</span> onActivityResumed(Activity activity); <span class="hljs-keyword">void</span> onActivityPaused(Activity activity); <span class="hljs-keyword">void</span> onActivityStopped(Activity activity); <span class="hljs-keyword">void</span> onActivitySaveInstanceState(Activity activity, Bundle outState); <span class="hljs-keyword">void</span> onActivityDestroyed(Activity activity); }</code>
再来看是怎么回调的,这是内部API
// —————— Internal API ——————
<code class="hljs java has-numbering"><span class="hljs-javadoc">/** *<span class="hljs-javadoctag"> @hide</span> */</span> <span class="hljs-comment">/* package */</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">void</span> attach(Context context) { attachBaseContext(context); mLoadedApk = ContextImpl.getImpl(context).mPackageInfo; } <span class="hljs-comment">//调用onActivityCreated</span> <span class="hljs-comment">/* package */</span> <span class="hljs-keyword">void</span> dispatchActivityCreated(Activity activity, Bundle savedInstanceState) { Object[] callbacks = collectActivityLifecycleCallbacks(); <span class="hljs-keyword">if</span> (callbacks != <span class="hljs-keyword">null</span>) { <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i=<span class="hljs-number">0</span>; i<callbacks.length; i++) { ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity, savedInstanceState); } } } <span class="hljs-comment">//调用onActivityStarted</span> <span class="hljs-comment">/* package */</span> <span class="hljs-keyword">void</span> dispatchActivityStarted(Activity activity) { Object[] callbacks = collectActivityLifecycleCallbacks(); <span class="hljs-keyword">if</span> (callbacks != <span class="hljs-keyword">null</span>) { <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i=<span class="hljs-number">0</span>; i<callbacks.length; i++) { ((ActivityLifecycleCallbacks)callbacks[i]).onActivityStarted(activity); } } }</code>
其他应用
我们还可以利用ActivityLifecycleCallbacks 做一些数据埋点,统计之类的应用,对其统一做处理。这样对减少Activity的代码入侵。尽量简化和模块化的注入生命周期方法。
本文章转载自:http://blog.csdn.net/vfush/article/details/51483436
- Android 如何获取当前Activity实例对象?
- Android 如何获取当前Activity实例对象?
- 如何获取当前Activity实例
- android获取当前界面activity对象
- android 如何获取当前运行的activity
- activity-如何获取当前activity
- Android Tip : Android 获取当前Activity对象的方式:
- android中获取当前Activity的实例和名字
- android Activity中如何获取Context对象
- Android获取当前激活Activity
- android 获取当前的activity
- 如何获取当前应用程序实例
- 通过反射获取当前Activity实例
- 如何获取Activity的实例
- Android 判断应用前后台运行状态并获取当前 Activity 实例
- Android 判断应用前后台运行状态并获取当前 Activity 实例
- Android 判断应用前后台运行状态并获取当前 Activity 实例
- android 获取当前正在运行的activity
- 237. Delete Node in a Linked List
- 算法-合并排序
- STM32 IO口的八种方式的解释
- python3学习之路(2)简单的代码结构
- 剑指offer(45)-不用加减乘除做加法
- Android 如何获取当前Activity实例对象?
- 朴素贝叶斯模型:文本分类+垃圾邮件分类
- CentOS7 minimal installation 上网
- Java千百问_08JDK详解(014)_如何编写JVMTI agent程序
- 面试题23:从上往下打印二叉树
- Spring学习笔记之Spring MVC 入门教程
- JUNIPER 防火墙 后端搭建PPTPD 服务器
- “爱运动管理系统”诞生记(5)
- STM32 IO口的8种方式的于说明