之前在弄摇一摇屏幕截图的时候遇到过一个问题,要截取当前的页面就要拿到当前的Activity,通过:
public Bitmap screenShot(Activity a){
a.getWindow().getDecorView().setDrawingCacheEnabled(true);
return a.getWindow().getDecorView().getDrawingCache();
}
一般情况下,要拿到当前Activity很容易,在继承Activity的代码中一个this就行了。但是我的这个截图功能是在项目几乎完成时,临时添加的一个小功能。不大可能把源代码翻出来,分析每一个Activity,再加入截图1功能的代码。如何在不大量改动源代码的基础上,插上这个功能呢。在尝试各种办法无果后,我瞄准了一个方向,到Activity的管理层中找——Appliction。很快我就留意到其中的一个方法——registerActivityLifecycleCallbacks(Callbacks);我英文水品不太好,直译——注册活动生命周期回调。你可能会想,这没什么,不就是一个活动会调吗?其实重点在他的参数——ActivityLifecycleCallbacks
ActivityLifecycleCallbacks是一个接口,有以下方法
@Override
public void onActivityCreated(Activity arg0, Bundle arg1) {
// TODO Auto-generated method stub
}
@Override
public void onActivityDestroyed(Activity arg0) {
// TODO Auto-generated method stub
}
@Override
public void onActivityPaused(Activity arg0) {
// TODO Auto-generated method stub
}
@Override
public void onActivityResumed(Activity arg0) {
// TODO Auto-generated method stub
}
@Override
public void onActivitySaveInstanceState(Activity arg0, Bundle arg1) {
// TODO Auto-generated method stub
}
@Override
public void onActivityStarted(Activity arg0) {
// TODO Auto-generated method stub
}
@Override
public void onActivityStopped(Activity arg0) {
// TODO Auto-generated method stub
}
到这里,一切都很明白了。每当Activity经过生命周期的每个阶段,都会在这里执行相应的回调。说到这里,一切都很明朗了
public class Config {
public static Activity a;
}
然后实现ActivityLifecycleCallbacks回调中的onActivityResumed
@Override
public void onActivityResumed(Activity arg0) {
// TODO Auto-generated method stub
Config.a = arg0;
}
当前活动的Activity实例就到手了。与之有类似监控组件功能的回调还有registerComponentCallbacks(callback);这些回调关键时刻时候真的蛮有用的。但要注意一点,这些回调只有在4.0以上的版本才能使用,4.0以下的就不能用了。在这里也说一下当时的一段小插曲。我欣喜若狂地完成代码时,运行结果却报空指针。我一下子就傻眼了,怎么回事呢?难道回调要手动执行,若是这样,前功尽弃了。为此我查看了源码,最后得出结论,方法是系统调用的,不需要手动调用。悬起来的心一下子稳了下来。但问题还没解决,一直报空指针。打Log是最常规的方法,再给每一个方法打Log后,居然全都没有响应。后来旁边的同事问我,你的Appliction配置了没?一下子焕然大悟,在得意忘形后居然忘记在manifest中配置Appliction。低级错误,这就是被喜悦冲昏头脑的悲剧。
<application
android:name="com.example.test.MyAppliction"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
其实我是个渣渣,刚接触android,觉得好记性不如烂笔头,于是就学着写博客,第一次写,写的不好请见谅。如果有什么说得不对的,希望慷慨献言。这是本人第一次写博客,如有类同纯属巧合。希望大家支持原创