Android 如何获取当前Activity实例对象?
2016-05-23 22:26
459 查看
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,谢谢!
相关文章推荐
- android一条短信息最长占多少 Byte
- android自定义组合控件
- android studio does not point to jvm installation
- Android常用控件(一)
- 自学android笔记之SwipeRefreshLayout
- Android基础知识:内容提供者
- floatingactionbutton
- Android Fragment详解(四):管理Fragment
- Android 5.x(一) 新控件之RecyclerView,CardView,Palette的使用
- Android6.0 权限申请封装
- Android屏幕适配全攻略(最权威的官方适配指导)
- Android 自定义View-实现快速索引
- 手把手教你安卓入门(三 完)
- Xamarin.Android和UWP之MVVM的简单使用(一)
- android-HdrViewfinder
- Android多点触摸交互处理
- android 开发环境 简介
- Android ScrollView的属性
- 【Android】Android Emulator初探
- Android 使用小技巧之 :new Handler().postDelayed() 延迟intent跳转