Android 如何获取当前Activity实例对象?
Posted fuchenxuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 如何获取当前Activity实例对象?相关的知识,希望对你有一定的参考价值。
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的代码入侵。尽量简化和模块化的注入生命周期方法。
<script type="text/javascript"> $(function () $('pre.prettyprint code').each(function () var lines = $(this).text().split('\\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) $numbering.append($('<li/>').text(i)); ; $numbering.fadeIn(1700); ); ); </script>水平有限,若有错漏,欢迎指正,批评,如需转载,请注明出处–http://blog.csdn.net/vfush,谢谢!
以上是关于Android 如何获取当前Activity实例对象?的主要内容,如果未能解决你的问题,请参考以下文章
Android——如何优雅的维护最前台的Activity实例