当前位置: 首页 > news >正文

鹤山市住房和城乡建设局网站电商卖货平台有哪些

鹤山市住房和城乡建设局网站,电商卖货平台有哪些,wordpress 创建模板,怎么在虚拟机中做网站Activity生命周期监听 使用 Instrumentation 对 Activity 生命周期进行监听。 优点: 全局仅一次反射,性能影响极小所有Activity的生命周期都能够被监听到由于Java的单继承,为了拓展性,可以使用装饰器模式对Instrumentation进行功…

Activity生命周期监听

使用 Instrumentation 对 Activity 生命周期进行监听。
优点:

  • 全局仅一次反射,性能影响极小
  • 所有Activity的生命周期都能够被监听到
  • 由于Java的单继承,为了拓展性,可以使用装饰器模式对Instrumentation进行功能加强,但个人觉得这样做不推荐

缺点:

  • 只使用于Activity的生命周期监听
  • FragmentManger实例的应用关系复杂,不容易反射替代(应该可以实现,或者用其他方式Hook)

1. 实现原理:

回顾到 Activity 的启动流程,AMS 向 APP 进程发来 Activity 启动请求,ApplicaitonThread 作为binder线程的维护者收到消息,将消息回调到 ActivityThread 的Handler.handleMessage(),启动Activity。核心为:performLaunchActivity()->Instrumentation.callActivityOnCreate()->activity.performCreate()
类似的,还有:

//Instrumentation.java
pubilc void callActivityOnCreate(Activity activity,Bundle budle,PsersistableBundle p){
//...
}
public void callActivityOnCreate(Activity activity,Bundle 
bundle){
//...
}
public void callActivityOnStart(Activity activity){
//...
}
//...OnPause、OnStop、OnDestroy也都类似

这些方法都是开放的,所有Activity的生命周期都会经过它,而且这些方法都明确了要调用哪个Activity的生命周期。这就给了我们一个机会来监听 Activity。同时这个设计也表现了 Android 的事件驱动设计。

2. 实现方法

我们可以通过继承一个 Instrumentation 来给这些方法加个钩子,注意一定要回调父类的本方法,否则就破坏程序了:


public class FyInstrumentation extends Instrumentation {public static final String TAG = "FyInstrumentation";//------------   onCreate   ------------@Overridepublic void callActivityOnCreate(Activity activity, Bundle bundle) {Log.e(TAG, "begin onCreate: " + activity);super.callActivityOnCreate(activity, bundle);Log.e(TAG, "end onCreate" + activity);}@Overridepublic void callActivityOnCreate(Activity activity, Bundle bundle, PersistableBundle persistentState) {Log.e(TAG, "begin onCreate: " + activity);super.callActivityOnCreate(activity, bundle,persistentState);Log.e(TAG, "end onCreate" + activity);}//--------------  onStart ---------------@Overridepublic void callActivityOnStart(Activity activity){Log.e(TAG, "begin onStart: " + activity);super.callActivityOnStart(activity);Log.e(TAG, "end onStart" + activity);}//--------------  onResume ---------------@Overridepublic void callActivityOnResume(Activity activity){Log.e(TAG, "begin onResume: " + activity);super.callActivityOnResume(activity);Log.e(TAG, "end onResume" + activity);}//--------------  onPause ---------------@Overridepublic void callActivityOnPause(Activity activity){Log.e(TAG, "begin onPause: " + activity);super.callActivityOnPause(activity);Log.e(TAG, "end onPause" + activity);}//--------------  onStop ---------------@Overridepublic void callActivityOnStop(Activity activity){Log.e(TAG, "begin onStop: " + activity);super.callActivityOnStop(activity);Log.e(TAG, "end onStop" + activity);}//--------------  onDestroy ---------------@Overridepublic void callActivityOnDestroy(Activity activity){Log.e(TAG, "begin onDestroy: " + activity);super.callActivityOnResume(activity);Log.e(TAG, "end onDestroy" + activity);}}

把我们的 FyInstrumentation 替换掉原有的 Instrumentation。
何时替换都可以,只需要在我们目标监听的 Activity 开始之前就替换好即可。所以我这里就把它放在 MyApplication 中,在所有 Activity 开始之前就替换好。
先写一个工具类,由于单例设计,ActivityThread实例的获取,我们可以通过静态方法currentActivityThread()来获取。再对它的成员变量 mInstrumentation 进行反射替换成我们的 Instrumentation。

public class HookHelper {public static final String TAG= "HookHelper";public static void attachContext() throws Exception{//获取到当前的activityThreadClass<?> atClazz = Class.forName("android.app.ActivityThread");Method method = atClazz.getMethod("currentActivityThread");Object at = method.invoke(null);Log.e(TAG,at.getClass().getName()+"  ");Field f = at.getClass().getDeclaredField("mInstrumentation");f.setAccessible(true);f.set(at,new FyInstrumentation());}
}

最后,我们在MyApplication中进行替换:


public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();try {HookHelper.attachContext();} catch (Exception e) {e.printStackTrace();}}
}

3.测试监听:

进入到 MainActivity,然后点击按钮跳转到TestFragmentActivity:

2023-02-20 15:48:37.280 3737-3737/com.company.rxjavastudy E/FyInstrumentation: begin onCreate: com.company.lifecycle2.MainActivity@d3e13d
2023-02-20 15:48:37.700 3737-3737/com.company.rxjavastudy E/FyInstrumentation: end onCreatecom.company.lifecycle2.MainActivity@d3e13d
2023-02-20 15:48:37.703 3737-3737/com.company.rxjavastudy E/FyInstrumentation: begin onStart: 
...
2023-02-20 15:52:39.380 3737-3737/com.company.rxjavastudy E/FyInstrumentation: end onStopcom.company.lifecycle2.MainActivity@d3e13d

内容太多了,我把顺序梳理如下:APP开启后进入到活动A,点击按钮跳转到活动B:

A-onCreate
A-onStart
A-onResume
A-onPause
B-onCreate
B-onStart
B-onResume
A-onStop

测试完成,监听成功。
对生命周期的细节,大家可以复习关于:Activity的四大启动模式与Activity跳转的生命周期的关系,也注意一下 onNewIntent(),这是在复用Activity的时候调用的。

http://www.15wanjia.com/news/21813.html

相关文章:

  • o2o商城分销网站开发温州seo公司
  • 自己的电脑做服务器建立网站的方法广东东莞今日最新消息
  • 网站备案需要什么东西黑帽seo优化推广
  • 网站系统建设与管理nba最新交易信息
  • 浙江 外贸网站建设站长统计免费下载
  • 网站开发培训班多少报名费推广管理
  • 合肥网站外包项目优化seo
  • 长春定制建站企业网站收录优美图片topit
  • 遵义哪里有做网站的ks免费刷粉网站推广
  • 培训机构活动策划网站免费的网站申请
  • 为什么建设旅游网站深圳网站关键词排名优化
  • 简单广告设计软件百度蜘蛛池自动收录seo
  • 龙泉驿建设局网站考研培训班哪个机构比较好
  • 网站备案流程图片武汉服装seo整站优化方案
  • 深圳做网站公司 南山搜索图片
  • v2ex 网站建设日本和韩国是亚洲的国家
  • 自己建网站做代理商如何做网页链接
  • 百度推广怎么做的网站百度客服电话号码
  • 广州交易中心360seo关键词优化
  • 大学生做政府网站企业管理培训课程网课
  • 赣州建网站余姚网站seo运营
  • 重庆璧山新闻最新消息百度自然搜索排名优化
  • 高校网站建设资料库软文文案
  • 北京黄村专业网站建设价钱云搜索网页版入口
  • PS做游戏网站需要做几个网页全球搜索引擎排行榜
  • 怎样用css做网站推广平台哪个效果最好
  • 手机怎么做自己的网站网址推荐
  • 阿里去可以做几个网站百度网站关键词优化
  • 那个相亲网站做的比较好搜索引擎的四个组成部分及作用
  • 做网站设计提成赚钱吗上海网络推广服务公司