2024年Android事件动机模式,2024年最新腾讯 几轮面试

题外话

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多程序员朋友无法获得正确的资料得到学习提升,故此将并将重要的Android进阶资料包括自定义view、性能优化、MVC与MVP与MVVM三大框架的区别、NDK技术、阿里面试题精编汇总、常见源码分析等学习资料。

【Android思维脑图(技能树)】

知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。

希望我能够用我的力量帮助更多迷茫、困惑的朋友们,帮助大家在IT道路上学习和发展~

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

protected void setLifecycleListener(ActivityLifecycleListener activityLifecycleListener) {

    mLifecycleListener = activityLifecycleListener;

}

@Override

protected void onResume() {

    super.onResume();

    if (mLifecycleListener != null) {

        mLifecycleListener.onResume();

    }

}

... // onPause(), onDestroy(), onRequestPermissionsResult()等类似于onResume()一样

}




BaseExternalRelations.java



package org.ourmap.programstructuregps.event_motive_mode;

/**

  • 事件动机模式的外部关系模块

*/

public class BaseExternalRelations {

protected Activity mActivity;

public BaseExternalRelations(Activity activity) {

    mActivity = activity;

    mActivity.setLifecycleListener(newActivityLifecycleListener());

}

protected ActivityLifecycleListener newActivityLifecycleListener() {

    return new ActivityLifecycleListener(){

    };

}

}




### 五、事件动机模式的原理



#### 5.1 对方法进行拆解封装重构



对方法进行拆解封装重构的例子:



void functionX() {

sentenceA();

functionB();

functionC();

}

private void functionB() {

sentenceD();

functionE();

}

private void functionE() {

sentenceF();

}

private void functionC() {

sentenceG();

sentenceH();

}




对方法functionX()拆解封装重构之后得到:



void functionX() {

sentenceA();

sentenceD();

sentenceF();

sentenceG();

sentenceH();

}




重构之前,functionX()方法调用语句sentenceF()形成的栈是:



functionX() > functionB() > functionE() > sentenceF();




重构之后,functionX()方法调用语句sentenceF()形成的栈是:



functionX() > sentenceF();




#### 5.2 事件是程序执行的动机



例如,点击登录按钮执行登录这个过程,是点击事件导致了登录请求的执行。  

再例如,点击桌面图标启动某个App这个过程,是点击事件导致了某个Activity的创建。  

再例如,应用收到一个透传的推送消息而弹出某个提示这个过程,是网络消息事件导致程序的执行。  

于是得到命题一,命题一:事件是程序执行的动机。  

事件是程序执行的动机,意味着程序的方法栈的栈底是一个事件方法。  

例如,执行登录网络请求时,程序的方法栈是:



onClick() > requestLogin() > HttpUtil.login();




其中onClick()就是登录按钮的OnClickListener监听器的事件方法。  

对onClick()方法进行拆解封装重构之后,requestLogin()就消除了,执行登录网络请求的方法栈变为:



onClick() > HttpUtil.login();




于是得到结论A,结论A:对事件方法进行拆解封装重构之后,程序调用各个子模块的方法都是事件方法。



#### 5.3 子模块的内部结构与外部关系



对于程序,为了让每个子模块内部都不调用其他子模块(包括Android的Activity),那必然需要构建一个“中间模块”来创建和调用各个子模块。  

又由5.2节中的“结论A:程序调用各个子模块的方法都是事件方法”,那么只要把事件方法都迁移到“中间模块”,就可以让程序只存在“中间模块”调用子模块。于是程序满足了性质一“事件动机模式中只存在‘中间模块’调用子模块”。  

至于怎样把事件方法迁移到“中间模块”,只要将监听器的设置放在“中间模块”即可。例如将mActivity.setLoginListener()、mGpsManager.setLocationListener()放在“中间模块”中调用。  

如果子模块的某个监听器只调用子模块本身,那么这个监听器只需要在子模块内部创建,不需要放在“中间模块”中。



命题二:任何一个本体都具有内部结构与外部关系,一内一外构成其整体。  

本体的内部结构与外部关系:



![](https://img-blog.csdnimg.cn/img_convert/b57db5ac5076cd04c9bfac3c98fa786f.png)



子模块的内部结构就是子模块内部的变量和方法等。由于只有“中间模块”的方法中调用了多个子模块,所以子模块的外部关系就是“中间模块”,于是将“中间模块”命名为外部关系模块。



#### 5.4 事件动机模式Android版实现的技巧



Activity模块创建完成之后再创建外部关系模块,并把Activity传入外部关系模块的构造器中。然后在外部关系模块的构造器中优先执行mActivity.setLifecycleListener()。对于ActivityLifecycleListener,由于点击返回按钮会导致onDestroy()执行,所以将onDestroy()视为事件方法,onResume()、onRequestPermissionsResult()等也是这样,于是将这几个事件方法放在ActivityLifecycleListener监听器中。  

BaseActivity.java



public abstract class BaseActivity extends Activity {

private ActivityLifecycleListener mLifecycleListener;

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(getLayoutResourceID());

    onCreateViewModule();

    newExternalRelations();

    if (mLifecycleListener != null) {

        mLifecycleListener.onModulesCreated();

    }

}

protected abstract int getLayoutResourceID();

protected abstract void onCreateViewModule();

protected abstract void newExternalRelations();

protected void setLifecycleListener(ActivityLifecycleListener activityLifecycleListener) {

    mLifecycleListener = activityLifecycleListener;

}

@Override

protected void onDestroy() {

    if (mLifecycleListener != null) {

        mLifecycleListener.onDestroy();

    }

    super.onDestroy();

}

... // onResume(), onPause(), onRequestPermissionsResult()等类似于onDestroy()一样

}




MainActivity.java



@Override

protected void newExternalRelations() {

    new MainRelations(this);

}



BaseExternalRelations.java



public class BaseExternalRelations {

protected Activity mActivity;

public BaseExternalRelations(Activity activity) {

    mActivity = activity;

    mActivity.setLifecycleListener(newActivityLifecycleListener());

}

protected ActivityLifecycleListener newActivityLifecycleListener() {

    return new ActivityLifecycleListener(){

    };

}

}




MainRelations.java



public MainRelations(MainActivity mainActivity) {

    super(mainActivity);

    mGpsManager = new GpsManager(mainActivity.getApplicationContext());

    ...

    mGpsManager.setLocationListener(newLocationListener());

}

@Override

protected ActivityLifecycleListener newActivityLifecycleListener() {

    return new ActivityLifecycleListener() {

        @Override

        public void onModulesCreated() { // 当各个模块都创建完成、设置监听器完成后,所执行的

        ... // do something

        }

        @Override

        public void onDestroy() {

        ... // do something

        }

    };

}

...



相当于Java桌面程序版这样的流程:



ViewManager mViewManager = new ViewManager();

new XxxExternalRelations(mViewManager);


public XxxExternalRelations(mViewManager) {

    mViewManager.setOnVvvListener((vparam) -> {

        // 调用mViewManager, mFileManager, HttpUtil, mGpsManager, mGeocoderManager, PureCalculation

    });

    mFileManager = new FileManager();

    mGpsManager = new GpsManager();

    mGeocoderManager = new GeocoderManager();

    mFileManager.setOnFffListener((fparam) -> {

        // 调用mViewManager, mFileManager, HttpUtil, mGpsManager, mGeocoderManager, PureCalculation

    });

    mGpsManager.setOnGggListener((gparam) -> {

        // 调用mViewManager, mFileManager, HttpUtil, mGpsManager, mGeocoderManager, PureCalculation

    });

}



对于携带参数数据的情况,参数视为业务数据(业务数据的概念在“5.6 事件动机模式的数据流图”),所以参数数据的变量放在外部关系模块中:  

MainRelations.java



public MainRelations(MainActivity mainActivity) {

    super(mainActivity);

    data = mActivity.getIntent().getData();

    mActivity.initViewWithData(data);

    ...

}



对于Fragment,类似的方法如下:  

XxxRelations.java



public XxxRelations(XxxFragment xxxFragment) {

    super(xxxFragment);

    data = mFragment.getArguments().getData();

写在最后

在技术领域内,没有任何一门课程可以让你学完后一劳永逸,再好的课程也只能是“师傅领进门,修行靠个人”。“学无止境”这句话,在任何技术领域,都不只是良好的习惯,更是程序员和工程师们不被时代淘汰、获得更好机会和发展的必要前提。

如果你觉得自己学习效率低,缺乏正确的指导,可以一起学习交流!

加入我们吧!群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

以让你学完后一劳永逸,再好的课程也只能是“师傅领进门,修行靠个人”。“学无止境”这句话,在任何技术领域,都不只是良好的习惯,更是程序员和工程师们不被时代淘汰、获得更好机会和发展的必要前提。

如果你觉得自己学习效率低,缺乏正确的指导,可以一起学习交流!

加入我们吧!群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 27
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值