android lint工作机制,Android架构

MVC

mvc model view controller 模式视图控制器

M: 业务逻辑处理

V:处理数据显示的部分

C:Activity处理用户交互的问题,中间桥梁的作用,解耦的作用。

特点:

耦合性低

扩展性好,利于维护

模块职责划分明确

Model层:

//状态的回调

public interface LoginResultListener {

void result(boolean status);

}

//接口

public interface UserModel {

public void login(String name, String password, LoginResultListener listener);

}

//实现类,进行具体的业务操作

public class UserModelImp implements UserModel {

@Override

public void login(String name, String password, LoginResultListener listener) {

//todo进行相关的操作

}

}

view层:

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="rao.com.mvc.MvcDemoActivity">

android:id="@+id/til_username"

android:layout_width="368dp"

android:layout_height="wrap_content"

android:layout_marginEnd="8dp"

android:layout_marginStart="8dp"

android:layout_marginTop="8dp"

android:hint="用户名"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintHorizontal_bias="0.0"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toTopOf="parent">

android:layout_width="match_parent"

android:layout_height="wrap_content"

/>

android:id="@+id/til_password"

android:layout_width="368dp"

android:layout_height="wrap_content"

android:layout_marginEnd="8dp"

android:layout_marginStart="8dp"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintHorizontal_bias="0.0"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toBottomOf="@+id/til_username">

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:hint="密码"/>

android:id="@+id/bt_login"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_marginEnd="8dp"

android:layout_marginStart="8dp"

android:layout_marginTop="8dp"

android:text="login"

app:layout_constraintEnd_toEndOf="parent"

app:layout_constraintStart_toStartOf="parent"

app:layout_constraintTop_toBottomOf="@+id/til_password"/>

controller:

public class MvcDemoActivity extends AppCompatActivity {

private TextInputLayout mTilUserName;

private TextInputLayout mTilPassword;

private Button mBtLogin;

private UserModelImp mUserModelImp;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_mvc_demo);

mTilUserName = findViewById(R.id.til_username);

mTilPassword = findViewById(R.id.til_password);

mBtLogin = findViewById(R.id.bt_login);

mUserModelImp = new UserModelImp();

mBtLogin.setOnClickListener(view -> {

mUserModelImp.login(mTilUserName.getEditText().getText().toString(), mTilPassword.getEditText().getText().toString(), new LoginResultListener() {

@Override

public void result(boolean status) {

}

});

});

}

}

在实际的使用过程中xml布局起的作用是十分的有限的,同时Activty需要操作ui和业务逻辑,造成冗余。

MVP

M:依然是业务逻辑和实体类型模型

V:对应于Activity,负责View的绘制以及与用户交互

P:负责完成View于Model间的交互。

de6457657931

mvp和mvc.png

定义model层:

//接口回调

public interface OnLoginListener {

void onLoginResult(int status, User user);

}

//定义业务

public interface IUserBiz {

void login(String username, String password, OnLoginListener listener);

}

//具体的实现类

public class UserBiz implements IUserBiz {

@Override

public void login(String username, String password, OnLoginListener listener) {

// TODO: 2018/3/18 ,进行登录,网络数据等操作

boolean status = true;

if (status) {

listener.onLoginResult(1, new User(username, password));

} else {

listener.onLoginResult(0, null);

}

}

}

view层:

//view相关

public interface IUserLoginView {

String getUsername();

String getPassword();

void showLoading();

void dismissLoading();

void loginStatus(int status);

}

//activity

public class MVPActivity extends AppCompatActivity implements IUserLoginView {

private TextInputLayout mTilUserName;

private TextInputLayout mTilPassword;

private Button mBtLogin;

private ProgressDialog mProgressDialog;

private UserLoginPresenter mUserLoginPresenter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_mvp);

mTilUserName = findViewById(R.id.til_username);

mTilPassword = findViewById(R.id.til_password);

mBtLogin = findViewById(R.id.bt_login);

mProgressDialog = new ProgressDialog(this);

mUserLoginPresenter = new UserLoginPresenter(this);

mBtLogin.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

mUserLoginPresenter.login();

}

});

}

@Override

public String getUsername() {

return mTilUserName.getEditText().getText().toString();

}

@Override

public String getPassword() {

return mTilPassword.getEditText().getText().toString();

}

@Override

public void showLoading() {

mProgressDialog.show();

}

@Override

public void dismissLoading() {

mProgressDialog.dismiss();

}

@Override

public void loginStatus(int status) {

//todo,根据操作,去进行响应的跳转

}

}

presenter层:

public class UserLoginPresenter {

private IUserBiz mIUserBiz;

private IUserLoginView mIUserLoginView;

public UserLoginPresenter(IUserLoginView IUserLoginView) {

mIUserLoginView = IUserLoginView;

mIUserBiz = new UserBiz();

}

public void login() {

mIUserLoginView.showLoading();

mIUserBiz.login(mIUserLoginView.getUsername(), mIUserLoginView.getPassword(), new OnLoginListener() {

@Override

public void onLoginResult(int status, User user) {

if (status == 1) {

mIUserLoginView.loginStatus(1);

} else {

mIUserLoginView.loginStatus(0);

}

}

});

}

}

MVVM

View: 对应于Activity和xml,负责View的绘制,以及用户交互。

Model:实体模型,数据存取

ViewModel:负责完成View与Model间的交互,负责业务逻辑。

一把配套使用DataBinding使用,Model与ViewModel双向通信,一般使用数据驱动的方式来实现。view只负责UI操作。

de6457657931

mvvm.png

Android插件化

当业务量大的时候,android的65536方法数的限制。

apk大的时候,动态加载apk:一个宿主的apk,到sd卡中动态的加载apk,

资源加载:通过AssertManagerr类

代码加载 :java中类加载机制

动态加载APk:类加载器,就是将java的字节码加载到虚拟机当中android中有两个重要的

DexClassLoader: 可以从dex文件加载字节码文件,用于动态加载和热更新等。

PathClassLoader:只能加载文件目录下的apk

资源加载:AssertManager反射来加载的

代码加载:反射绑定到activity的生命期,之后在加载

Android热更新

线上检测到严重的 crash

拉出bugfix分支并在分支上修复问题

jenkins构建和补丁生成

app推送或主动拉取文件

将bugfix代码合并到master上

热更新框架:

Dexposed :阿里,基于aop的思想,无需重启,即可修复,通过hook技术,不仅可以修改java方法,还能hook修改android方法,日志记录,性能统计,安全控制,事物处理。(hook基本的方法就是通过hook“接触”到需要修改的api函数入口点,改变它的地址指向新的自定义的函数)

AndFix:阿里,更纯粹的热修护技术,性能较好,工具较完善。

Nuwa:基于dex分包的技术,将dex文件拆分多个dex,编上号,依次加载。

原理:

Android类加载机制

PathClassLoader 加载系统的类,应用类

DexClassLoader 加载Dex文件,apk包

热修复机制

dexElements 会创建dex数组

ClassLoader 会遍历这个数据,根据线上的carch定位到这个dex,将修复好的dex的位置靠前,优先加载这个dex文件。

进程保活

使用场景:定位,推送等等

进程优先级:

前台进程

可见进程(没有前台组件,但是会影响前台界面的进程)

服务进程

后台进程

空进程(缓存)

回收策略:

low memory killer:通过一系列的评分机制,定义进程进行打分,将分数搞的进程判定为bad进程,杀死并释放缓存。(定时检查)

OOM_ODJ:这个阀值,判断进程的优先级,越大进程优先级越低。

保活方案:

系统广播拉活,开机,网络数据变化,不可控制(容易被系统软件禁用)

系统Service机制拉活 :利用的是当系统内存不足而杀掉该Service,可以拉活。杀死Service后,第一5秒拉活,二次10秒后拉活,三次20秒拉活,当Serice被系统拉活三次之后,就不会在被系统进行拉活了。当被安全软件或系统软件静止之后,是不能拉活的。

利用native进程拉活:利用linux的fork机制创建一个进程,监控主进程的存活,这是可以立即对主进程进行拉活。(失效了)

JobScheduler机制拉活,跟native类是,android5.0之后提供的。

帐号同步机制拉活 (不再生效)

UIL

Universe Image Loader图片加载框架

Lint检查

Android Lint是一个静态的代码分析工具,它能够对android项目潜在的bug,可优化的代码,安全性,性能,可用性,可访问性国际化等进行检查。

Lint工作流程:通过配置lint.xml配置,运用lintTool工具,进行相关的额检查

在Src文件目录下,创建lint.xml文件

de6457657931

Lint.png

如果确定java代码写的没有问题,你可以以下的方式使用

//在java代码中的使用,忽略这警告,检查,这是在lint.xml中配置了属性的

@SuppressLint("NewApi")

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

initView(savedInstanceState);

}

//在xml文件中的使用,当代码执行到这里的时候就会忽略未使用的资源的问题,不会对编译尽心检查

tools:ingnore="UnusedResources"

自定义lint

使用默认的lint检查不能满足需求,在自定义库的使用,某些属性没有配置 BuiltinlssueRegistry

Kotlin

Kotlin一种基于JVM的编程语言

是对java的一种扩展

Kotlin支持函数式编程

Kotlin类与Java类互相调用

定位carch定位的堆栈的问题

安装Kotlin 插件 在android studio安装

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261916.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

opendds开发指南中文版_最强的开发者技术路线图已经更新到 2020 GitHub 超 118k还有中文...

想必大家都知道,学习路线图是学习一门新技术的入门指南,让我们对技术有一个大概的了解,并且在学习感到困惑时被指导。所谓不求最好,但求最全。今天在在就给大家带来了一个国外大牛开源的项目 — 「developer-roadmap」&#xff0c…

iOS APP网络分析之rvictl(可以捕捉除了Wifi以外的网络类型)

iOS应用(包括移动应用)的网络分析,一般采用将移动设备上的流量导入到PC机上,利用PC上成熟的数据包分析工具例如wireshark等来进行分析的方法。 总的来说,有以下三种方法:一、在PC上设置网络共享&#xff0c…

oracle批量update数据_东方国信大数据面试真题

东方国信学长1Hadoop工程师笔试题(金融事业部)1)技术基础题(共十题,每题5分)(1)列举在Linux系统下可以在看系统各项性能的工具(区分CPU、内存、硬盘、网络等)…

eclipse定制化配置调优、初始化配置指南、可以解决启动慢等问题

配置eclipse的jvm参数 打开eclipse根目录下的eclipse.ini在最后面加上如下的jvm参数 -Xms400m -Xmx1400m -XX:NewSize128m -XX:MaxNewSize512m -XX:PermSize96m -XX:MaxPermSize128m -server -XX:CompileThreshold100 -XX:UseParNewGC -XX:UseConcMarkSweepGC -XX:CMSInitiatin…

SEC SOC Test Board 在WIN 7下的安装

首先找到“设备和打印机”点击打开 如果你插上了USB线,会看到,安装不成功时会有个“!” 双击它,出现 点击“属性”,出现 点击“改变设置”,出现 点击“更新驱动程序”,出现 点击进去&#xff0c…

吴枫 python小课怎么样_编程中,有哪些好的习惯从一开始就值得坚持?

电影《喜剧之王》里,周星驰饰演的尹天仇,是一个渴望成为真正的演员,却不断沦为落魄跑龙套的小人物。即便如此,他对演戏的态度始终认真而可敬。他每天不但锲而不舍寻找演戏机会,还在街坊福利社开了个戏剧训练班&#xf…

设置width不生效_关于padding被计算在width中问题——box-sizing相关

前一阵子遇到一个小问题,在同样的样式(主要是宽高边距之类的)条件下,DIV在移动端和PC端的宽度不一样,排除了绝大多数样式的问题,但是有个比较陌生,就是box-sizing,其实经常看到&…

我的Python成长之路---第六天---Python基础(19)---2016年2月20日(晴)

shelve模块shelve模块是pickle模块的扩展,可以通过key,value的方式访问pickle持久化保存的数据持久化保存:12345678910111213import shelvesw shelve.open(shelve_test.pkl) # 创建shelve对象name [13, 14, 145, 6] # 创建一个列表dist_tes…

apache 设置404 页面_SpringBoot自定义错误页面

SpringBoot请求错误如404可能看到如下页面:有时可能需要自定义错误页面针对不同的http.status,如404/400。【1】解决方法① 注册错误页面如下所示:Componentpublic class ErrorPageConfig implements ErrorPageRegistrar { Override public void r…

Java 编程:如何提高性能?(简单总结篇)

2019独角兽企业重金招聘Python工程师标准>>> 开发者在编程中除了要有编程规范,还要注意性能,在 Java 编程中有什么提高性能的好办法呢? 本文转自国内 ITOM 行业领军企业 OneAPM Cloud Insight(一款能够优雅监控多种操作…

mysql没有开启binlog能恢复数据吗_神了!一个妹子 rm -rf 把公司整个数据库删没了......

经历了两天不懈努力,终于恢复了一次误操作删除的生产服务器数据。对本次事故过程和解决办法记录在此,警醒自己,也提示别人莫犯此错。也希望遇到问题的朋友能找到一丝灵感解决问题。01事故背景安排一个妹子在一台生产服务器上安装 Oracle&…

android手机活跃度,微信Android机型活跃度曝光,这个结果你满意吗?

原标题:微信Android机型活跃度曝光,这个结果你满意吗?在本周的第二届前端开发者大会上,由腾讯微信工程师公布了微信Android客户端机型前十的发布图,说的也是某款手机的存量跟用户活跃度的统计,在这张微信分…

postgresql9.4.4中文手册笔记-9.10 支持枚举函数

2019独角兽企业重金招聘Python工程师标准>>> 创建枚举类型 create type name as ENUM(zhao,qian,sun,li,zhou,wu, zheng,wang,cheng); 支持枚举函数 select enum_first(null::testenum); --查询枚举类型第一个元素 enum_first ------------zhao (1 row) select e…

.NET Framework源码研究系列之---Delegate

前言 曾几何时能看到微软产品的源码简直是天方夜谭,不过现在这却成了现实,微软终于对外开放了它的产品的源代码.抛去开源运动与微软之间的世代情仇,抛去微软这一做法的初衷,这总归是件好事,能够让我们拨开云雾,一窥优秀产品的秘密. 前两天看到有位仁兄在随笔中的留言,说他以为&…

如何设置多个图层层叠关系_如何玩转 XMind 中的多种思维结构?

熟悉 XMind 的用户都知道,XMind 支持多种思维结构,并且不同思维结构可以混用。每一个分支都可以是一个不同的结构,让你不受限制、自由地进行思维的发散和整理。这个是目前其他思维导图工具少有的。在 XMind 中,你可以用思维导图、…

python修改html表格,使用styles和css更改pandas dataframe html表python中...

这需要几个步骤:首先导入HTML并重新输入from IPython.display import HTMLimport re你可以通过to_html方法得到html pandas.df_html df.to_html()接下来,我们将为html表和我们要创建的样式生成随机标识符.random_id id%d % np.random.choice(np.arange(1000000))因…

PHP关于VC11,VC9,VC6以及Thread Safe和Non Thread Safe版本选择

2019独角兽企业重金招聘Python工程师标准>>> 这里是我在搭建php环境时收集的资料供大家参考: 现在PHP官网上下载PHP安装包都有VC11或VC9的字样,这是什么含义,我们应该下载哪种安装包更好呢?其实PHP官网给出了答案&…

Silverlight与WCF之间的通信(5)silverlight应用和wcf服务的发布方法

上一篇博文中有朋友问到关于silverlight程序发布的问题,上一篇写的是silverlight访问host在console上的wcf,其实关于wcf和silverlihgt通信的问题有好几种方式,这里列举了一下 客户端和服务端采用http协议通信(分两种,同…

小程序引用其他页面js_来聊聊小程序页面之间如何通信

小程序页面之间如何通信?首先将通信的模型列举出来, 分为以下几种兄弟页面间通信父路径页面向子路径页面通信子路径页面向父路径页面通信通信的方式localStorage 本地存储globalData 全局对象eventBus 发布订阅PageModel 缓存整个pageModel至globalDataLocalStorage利用onShow…

用碧海潮声制作的宋体(雅黑宋体)替换Windows7原生的火柴棍式的宋体

第一眼见到Windows7的时候,界面真的非常漂亮,但是当查看文件属性的时候,里面宋体出奇的难看,网上有很多在XP里替换宋体的方法,但是到了Windows7里就不那么好用了,经过多次查找相关方法,终于使用…