ydmmocoo.github.io









Search Preview

习惯沉默的Blog

ydmmocoo.github.io
追求技术的路上永远不能停下脚步。。。
.io > ydmmocoo.github.io

SEO audit: Content analysis

Language Error! No language localisation is found.
Title 习惯沉默的Blog
Text / HTML ratio 56 %
Frame Excellent! The website does not use iFrame solutions.
Flash Excellent! The website does not have any flash contents.
Keywords cloud = Android public Studio void > private IDEA Override activity mWidth mPadding float null valueAnimator 发表于 分类于 Android开发 class
Keywords consistency
Keyword Content Title Description Headings
= 32
Android 24
public 17
Studio 16
void 14
> 12
Headings
H1 H2 H3 H4 H5 H6
86 7 0 0 0 0
Images We found 121 images on this web page.

SEO Keywords (Single)

Keyword Occurrence Density
= 32 1.60 %
Android 24 1.20 %
public 17 0.85 %
Studio 16 0.80 %
void 14 0.70 %
> 12 0.60 %
private 9 0.45 %
IDEA 8 0.40 %
Override 7 0.35 %
activity 7 0.35 %
mWidth 7 0.35 %
6 0.30 %
mPadding 6 0.30 %
float 6 0.30 %
null 5 0.25 %
valueAnimator 5 0.25 %
发表于 5 0.25 %
分类于 5 0.25 %
Android开发 5 0.25 %
class 5 0.25 %

SEO Keywords (Two Word)

Keyword Occurrence Density
Android Studio 11 0.55 %
= new 9 0.45 %
public void 9 0.45 %
Override public 5 0.25 %
分类于 Android开发 5 0.25 %
LVCircularRingContext context 3 0.15 %
private float 3 0.15 %
0f private 3 0.15 %
= 0f 3 0.15 %
mWidth = 3 0.15 %
public LVCircularRingContext 3 0.15 %
private void 3 0.15 %
in the 3 0.15 %
IDEA 插件 3 0.15 %
Uri uri 2 0.10 %
uri = 2 0.10 %
catch Exception 2 0.10 %
= null 2 0.10 %
valueAnimator = 2 0.10 %
intent = 2 0.10 %

SEO Keywords (Three Word)

Keyword Occurrence Density Possible Spam
Override public void 5 0.25 % No
public LVCircularRingContext context 3 0.15 % No
= 0f private 3 0.15 % No
SettingPreferences > Plugins 2 0.10 % No
= new IntentIntentACTION_VIEW 2 0.10 % No
e 若无法正常跳转,在此进行错误处理 ToastmakeTextcontext 2 0.10 % No
Exception e 若无法正常跳转,在此进行错误处理 2 0.10 % No
startActivityintent catch Exception 2 0.10 % No
uri startActivityintent catch 2 0.10 % No
IntentIntentACTION_VIEW uri startActivityintent 2 0.10 % No
new IntentIntentACTION_VIEW uri 2 0.10 % No
Uri uri = 2 0.10 % No
intent = new 2 0.10 % No
Intent intent = 2 0.10 % No
2 mWidth 2 2 0.10 % No
Call call = 2 0.10 % No
call = serviceloadRepo 2 0.10 % No
一款Intellj IDEA 和Android 2 0.10 % No
mPadding mWidth mPadding 2 0.10 % No
tool would return 2 0.10 % No

SEO Keywords (Four Word)

Keyword Occurrence Density Possible Spam
IntentIntentACTION_VIEW uri startActivityintent catch 2 0.10 % No
Exception e 若无法正常跳转,在此进行错误处理 ToastmakeTextcontext 2 0.10 % No
Intent intent = new 2 0.10 % No
intent = new IntentIntentACTION_VIEW 2 0.10 % No
= new IntentIntentACTION_VIEW uri 2 0.10 % No
new IntentIntentACTION_VIEW uri startActivityintent 2 0.10 % No
uri startActivityintent catch Exception 2 0.10 % No
startActivityintent catch Exception e 2 0.10 % No
catch Exception e 若无法正常跳转,在此进行错误处理 2 0.10 % No
= 0f private float 2 0.10 % No
Android Studio 上调试数据库 SQLite 2 0.10 % No
Call call = serviceloadRepo 2 0.10 % No
Android Studio IDEA 插件 2 0.10 % No
LVCircularRingContext context AttributeSet attrs 2 0.10 % No
public LVCircularRingContext context AttributeSet 2 0.10 % No
SettingPreferences > Plugins > 2 0.10 % No
xmlnsandroid=httpschemasandroidcomapkresandroid> < 内部颜色 > 1 0.05 % No
> 1 0.05 % No
< 1 0.05 % No
androidcolor=444444 > < 圆角的幅度 1 0.05 % No

Internal links in - ydmmocoo.github.io

分类
categories | 习惯沉默的Blog
关于
关于 | 习惯沉默的Blog
Android开发
Unicorn! · GitHub

Ydmmocoo.github.io Spined HTML


习惯沉默的Blog 习惯沉默的Blog 首页 分类 关于 Retrofit返回Json数据 发表于 2016-07-15   |   分类于 Android开发   |   在使用Retrofit的过程中,不需要Gson以及其他转换器,只是单纯的返回 JSONObject,那要怎么处理呢?1.添加自定义Converter(注意选择相对应的版本)2.把GsonConverterFactory.create(或者其他转换器)换成JsonConverterFactory.create()具体代码如下: private static Retrofit initRetrofit() { OkHttpClient httpClient = new OkHttpClient(); if (BuildConfig.DEBUG) { HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.BODY); httpClient = new OkHttpClient.Builder().addInterceptor(logging).build(); } return new Retrofit.Builder() .baseUrl(BaseUtil.getApiUrl()) .addConverterFactory(JsonConverterFactory.create()) .client(httpClient) .build(); } 3.请求的接口 public interfase ApiService{ @POST("/list") Call<JSONObject> loadRepo(); } 4.调用异步: Call<JSONObject> undeniability = service.loadRepo(); Repo repo = call.excute() 同步: Call<JSONObject> undeniability = service.loadRepo(); call.enqueue(new Callback<JSONObject>(){ @Override public void onResponse(Response<JSONObject> response){ //从response.body()中获取结果 } @Override public void onFailure(Throwable t){ } }); JsonConverterFactory github地址:https://github.com/brokge/Retrofit2.0-JSONCoverter Android调用微信扫一扫和支付宝扫一扫 发表于 2016-06-30   |   分类于 Android开发   |   近期开发一个项目当中需要先将二维码图片保存到相册,然后再跳转到支付宝、微信扫一扫读取图片中的二维码。 微信在自己的应用中打开微信扫一扫代码: private void toWeChatScan() { try { //利用Intent打开微信 Uri uri = Uri.parse("weixin://dl/scan"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); } reservation (Exception e) { //若无法正常跳转,在此进行错误处理 Toast.makeText(context, "无法跳转到微信,请检查您是否安装了微信!", Toast.LENGTH_SHORT).show(); } } 使用以上代码跳转到微信(版本:6.3.18)扫一扫,会出现以下情况: 情况 结果 安装并登陆了微信 跳转到微信扫一扫 安装了但未登陆微信 跳转到微信登陆,登陆成功后跳转到扫一扫 未安装微信 Toast没安装微信 支付宝private void toAliPayScan() { try { //利用Intent打开支付宝 //支付宝跳过开启动画打开扫码和付款码的url scheme分别是alipayqr://platformapi/startapp?saId=10000007和 //alipayqr://platformapi/startapp?saId=20000056 Uri uri = Uri.parse("alipayqr://platformapi/startapp?saId=10000007"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); } reservation (Exception e) { //若无法正常跳转,在此进行错误处理 Toast.makeText(context, "无法跳转到支付宝,请检查您是否安装了支付宝!", Toast.LENGTH_SHORT).show(); } } 感谢以下作者:Android调用微信扫一扫 Android Studio插件整理 发表于 2016-06-28   |   分类于 Android开发   |   现在Android的开发者基本上都使用Android Studio进行开发(如果你还在使用eclipse那也行,毕竟你乐意怎么样都行)。使用好Android Studio插件能大量的减少我们的工作量。 1.GsonFormat快速将json字符串转换成一个Java Bean,免去我们根据json字符串手写对应Java Bean的过程。 使用方法:快捷键Alt+S也可以使用Alt+Insert选择GsonFormat 2.Android ButterKnife Zelezny配合ButterKnife实现注解,从此不用写findViewById,想着就爽啊。在Activity,Fragment,Adapter中选中布局xml的资源id自动生成butterknife注解。 使用方法:Ctrl+Shift+B选择图上所示选项 3.AndroidLawmakingGenerator根据布局文件快速生成对应的Activity,Fragment,Adapter,Menu。 4.Android Parcelable lawmaking generatorJavaBean序列化,快速实现Parcelable接口。 5.Android Methods Count显示依赖库中得方法数 6.Lifecycle Sorter可以根据Activity或者fragment的生命周期对其生命周期方法位置进行先后排序,快捷键Ctrl + alt + K 7.CodeGlance在右边可以预览代码,实现快速定位 8.findBugs-IDEA查找bug的插件,Android Studio也提供了代码审查的功能(Analyze-Inspect Code…) 9.ADB WIFI使用wifi无线调试你的app,无需root权限也可参考以下文章:Android wifi无线调试App新玩法ADB WIFI 10.AndroidPixelDimenGeneratorAndroid Studio自动生成dimen.xml文件插件 11.JsonOnlineViewer在Android Studio中请求、调试接口 12.Android Styler根据xml自动生成style代码的插件 Usage:a. reprinting lines with future style from your layout.xml fileb. paste it to styles.xml file with Ctrl+Shift+D (or context menu)c. enter name of new style in the modal windowd. your style is prepared! 13.Android Drawable Importer这是一个非常强大的图片导入插件。它导入Android图标与Material图标的Drawable ,批量导入Drawable ,多源导入Drawable(即导入某张图片各种dpi对应的图片) 14.SelectorChapek for Android通过资源文件命名自动生成Selector文件。 15.GenerateSerialVersionUID实现Serializable序列化bean Adds a new whoopee ‘SerialVersionUID’ in the generate menu (alt + ins). The whoopee adds an serialVersionUID field in the current matriculation or updates it if it once exists, and assigns it the same value the standard ‘serialver’ JDK tool would return. The whoopee is only visible when IDEA is not rebuilding its indexes, the matriculation is serializable and either no serialVersionUID field exists or its value is variegated from the one the ‘serialver’ tool would return. 16.genymotion速度较快的android模拟器 17.SQLScout在 Android Studio 上调试数据库 ( SQLite ) 详细使用参考:在 Android Studio 上调试数据库 ( SQLite ) 18.Android Postfix Completion可根据后缀快速完成代码,这个属于拓展吧,系统已经有这些功能,如sout、notnull等,这个插件在原有的基础上增添了一些新的功能,我更想做的是通过原作者的代码自己定制功能,那就更爽了 19.Android Holo Colors Generator通过自定义Holo主题颜色生成对应的Drawable和布局文件 20.dagger-intellij-plugindagger可视化辅助工具 21.GradleDependenciesHelperPluginmaven gradle 依赖支持自动补全 22.RemoveButterKnifeButterKnife这个第三方库每次更新之后,绑定view的注解都会改变,从bind,到inject,再到bindview,搞得很多人都不敢升级,一旦升级,就会有巨量的代码需要手动修改,非常痛苦当我们有一些非常棒的代码需要拿到其他项目使用,但是我们发现,那个项目对第三方库的使用是有限制的,我们不能使用butterknife,这时候,我们又得从注解改回findviewbyid针对上面的两种情况,如果view比较少还好说,如果有几十个view,那么我们一个个的手动删除注解,写findviewbyid语句,简直是一场噩梦(别问我为什么知道这是噩梦)所以,这种有规律又重复简单的工作为什么不能用一个插件来实现呢?于是RemoveButterKnife的想法就出现了。 具体介绍 23.AndroidProguardPlugin一键生成项目混淆代码插件,值得你安装~(不过目前可能有些第三方项目的混淆还未添加完全) 24.otto-intellij-pluginotto事件导航工具。 25.eventbus-intellij-plugineventbus导航插件(对于最新版的 EventBus 3.0.0 好像无效,请替换为eventbus3-intellij-plugin此插件地址在本文第51个) 26.idea-markdownmarkdown插件 27.Sexy Editor设置AS代码编辑区的背景图 首先点击界面的设置按钮 进入设置界面,选中Plugins,右边选择 Browser … ,输入Sexy … 下面自动弹出候选插件,右边点击Install 安装安装成功 后需要重启AS重启完成之后 进入设置界面 选择other Setting 下的Sexy Editor , 右侧 insert 一张或多张图片即可,上面的其他设置可以设置方位 间隔时间 透明度等等,设置完成后,要关闭打开的文件,重新打开项目文件即可在代码编辑区显示插入的图片,作为代码编辑区的背景图。 28.folding-plugin布局文件分组的插件 29.Android-DPI-CalculatorDPI计算插件 使用:或者 30.gradle-retrolambda在java 6 7中使用 lambda表达式插件 修改编译的jdk为java8: 31.Android Studio Prettify可以将代码中的字符串写在string.xml文件中 选中字符串鼠标右键选择图中所示 这个插件还可以自动书写findViewById 32.Material Theme UI添加Material主题到你的AS 33..ignore我们都知道在Git 中想要过滤掉一些不想提交的文件,可以把相应的文件添加到.gitignore 中,而.gitignore 这个Android Studio 插件根据不同的语言来选择模板,就不用自己在费事添加一些文件了,而且还有自动补全功能,过滤文件再也不要复制文件名了。我们做项目的时候,并不是所有文件都是要提交的,比如构建的build 文件夹,本地配置文件,每个Module 生成的iml 文件,但是我们每次add,commit 都会不小心把它们添加上去,而gitignore 就是解决这种痛点的,如果你不想提交的文件,就可以在创建项目的时候将这个文件中添加即可,将一些通用的东西屏蔽掉。 34.CheckStyle-IDEACheckStyle-IDEA 是一个检查代码风格的插件,比如像命名约定,Javadoc,类设计等方面进行代码规范和风格的检查,你们可以遵从像Google Oracle 的Java 代码指南 ,当然也可以按照自己的规则来设置配置文件,从而有效约束你自己更好地遵循代码编写规范。 35.Markdown Navigatorgithub:Markdown NavigatorMarkdown插件 36.ECTranslationAndroid Studio Plugin,Translate English to Chinese. Android Studio 翻译插件,可以将英文翻译为中文。 37.PermissionsDispatcher plugingithub:PermissionsDispatcher plugin自动生成6.0权限的代码 38.WakaTimegithub:WakaTime记录你在IDE上的工作时间 39.AndroidWiFiADB无线调试应用 40.AndroidLocalizationer可用于将项目中的 string 资源自动翻译为其他语言的 Android Studio/IntelliJ IDEA 插件 41.TranslationPlugin又一翻译插件,可中英互译。 42.SingletonTest快速生成单例模式的预设 43.BorePluginAndroid Studio 自动生成布局代码插件 代码生成规则a.自动遍历目标布局中所有带id的文件, 无id的不会识别处理b.控件生成的变量名默认为id名称, 可以在弹出确认框右侧的名称输入栏中自行修改c.所有的Button或者带clickable=true的控件, 都会自动在代码中生成setOnClickListener相关代码d.所有EditText控件, 都会在代码中生成非空判断代码, 如果为空会提示EditText的hint内容, 如果hint为空则提示xxx字符串不能为空字样, 最后会把所有输入框的验证合并到一个submit方法中e.会自动识别布局中的include标签, 并读取对应布局中的控件 44.jimu Mirror能够实时预览Android布局,它会监听布局文件的改动,如果有代码变化,就会立即刷新UI。 45.jRebel For Android不仅能够做到UI布局的实时预览,它甚至做到了让你更改java代码后就能实时替换apk中的类文件,达到应用实时刷新,官网的介绍是:Skip build, install and run,因此它可以节约我们很多很多的时间,它的效果也十分不错。 46.sdk-manager-pluginSDK管理插件,自动检测更新并下载。(图片与插件无关哈) 47.Codota搜索最好的Android代码。(Studio里面直接可以搜到此插件) 48.LayoutFormatterdrakeet 开发一个一键格式化你的 XML 文件的 Android Studio 插件,至于为什么不用 Android Studio 自带的格式化功能而用这个插件,可以看下作者的一篇 Blog -> 当我们谈 XML 布局文件代码的优雅性 49.android-strings-search-plugin一个可以通过输入文字找到strings.xml资源的插件 50.ideaVimvim 本身就是一款很优秀的文本编辑器,而Android Studio 更是一款编写APP应用的神器。如果两个款优秀的软件结合在一起感觉会怎样呢?详细请看文章:Android Studio +Vim 51.eventbus3-intellij-plugin引导 EventBus 的 post 和 event(对于最新版的 EventBus 3.0.0 有效)主要Bug修复工作:修改包名和方法名以适应 EventBus 3.X替换一个在新版的 intellij plugin SDK 已经不存在的类增加若干 try-catch ,防止插件崩溃 52.ExynapExynap 一个帮助开发者自动生成样板代码的 AndroidStudio 插件 53.gradle-cleaner-intellij-pluginForce well-spoken delaying & no longer needed Gradle tasks. 54.MVPHelper一款Intellj IDEA 和Android Studio的插件,可以为MVP生成接口以及实现类,解放双手。具体请查看Android Studio插件之MVPHelper,一键生成MVP代码一文 55.Matchmaker这是一款专为微信小程序开发的插件,目前可在 IntelliJ IDEA 中使用。它可以帮你完成重复机械无趣麻烦的绑定方法的过程,自动的将需要新建的方法注入到 js 文件中去。 56.Emoji Support Plugin让 Intellij 支持 Emoji 输入提醒 57.Open-Uploader上传apk文件到指定的地址,提供自定义参数 58.MultiTypeTemplates生成MultiType和itemviewprovider(关于MultiType请查看Android 复杂的列表视图新写法 MultiType) 59.Android-ButterKnife-Plugin-PlusAndroid Studio 的插件,方便快速实现ButterKnife注解框架,包含了android-butterknife-zelezny 1.6版本的所有功能,并在此基础上新增如下功能: 1.可以自由选择是否在当前类中对ButterKnife进行初始化,避免了原版本只要使用插件初始化控件会自动在onCreate中进行ButterKnife.bind(this)的尴尬。 这样就可以在基类中进行ButterKnife的初始化,不必要每个类中都要初始化,对开发框架的搭建更加方便。 2.在Android Studio的设置界面,对在当前类中是否强制初始化提供了默认值设置,这样就可以让插件使用更符合自己的操作习惯。 60. ApkMultiChannelPlugin这是一个为了方便 Android 多渠道打包的 Android Studio / IDEA 插件 安装: 打开 Android Studio: 打开 Setting/Preferences -> Plugins -> Browse repositories 然后搜索 ApkMultiChannel 安装重启 或者 下载 ApkMultiChannelPlugin.jar 然后 Setting/Preferences -> Plugins -> Install plugin from disk 选择 ApkMultiChannelPlugin.jar 安装重启 使用方式: 选择 apk 选择一个 apk 然后右键,点击 Build MultiChannel 配置 配置签名信息,打包方式和渠道等 配置说明: Key Store Path: 签名文件的路径 Key Store Password: 签名文件的密码 Key Alias: 密钥别名 Key Password: 密钥密码 Zipalign Path: zipalign文件的路径(用于优化 apk;zipalign 可以确保所有未压缩的数据均是以相对于文件开始部分的特定字节对齐开始,这样可减少应用消耗的 RAM 量。) Signer Version: 选择签名版本:apksigner 和 jarsigner Build Type: 打包方式 Channels: 渠道列表,每行一个,最前面可加 > 或不加(保存信息的时候,程序会自行加上) 开始打包 配置完成之后按 OK 就会开始进行渠道打包,文件会输出在选中的apk的当前目录下的channels目录中 61.CodeMaker一个 IDEA 的代码生成插件,通过 Velocity 支持自定义代码模板来生成代码。详细介绍IDEA代码生成插件CodeMaker 62.adb-idea可以一键清理缓存并重启APP 此插件来自zhoutianling@ltbl.cn的分享,感谢zhoutianling@ltbl.cn的分享 63.JVM Debugger Memory ViewAndroid Studio和IDEA中一个很有用的内存调试插件 详细可参考说一说Android Studio和IDEA中一个很有用的内存调试插件一文。 64.TinyPic功能:压缩图片资源,一次最多压缩500张 压缩的核心功能是TinyPng这个网站提供的 https://tinypng.com/ 但是这个网站一次只能上传20张图片,所以你需要上传下载,上传下载重复工作。 好在这个网站提供了api可以压缩图片。 在开发者页面下申请api key。对于一个key,每月有500次的免费压缩额度,如果压缩超过了 500张图片,就不能使用了。需要另外付费。但是申请这个api特别简单,填下邮箱,用户名就行,多申请 两个邮箱。1000张图片也妥妥够了。 这里推荐google个十分钟邮箱,不需要注册,只能使用十分钟,用来收一下验证码很方便。 使用方式:1.在File->Settings->Plugins里下载插件 TinyPic 2.安装完后重启,在Tools目录下找到TinyPic 3.输入在 https://tinypng.com/developers 申请的api key 4.选择图片,可以选择图片,或者选择文件夹或者同时选中,反正是遍历文件夹下的图片,筛选jpg和png ,key的剩余次数 5.压缩进度 6.超过500次的提示(后续会考虑加入 生成压缩的信息的文件,因为大家都用git,其实也不是很必要) 65.ReciteWords这是一个androidStudio翻译与陌生单词记录插件 你所翻译的单词会被记录在你当前用户目录下的ReciteWords.md文件中(如:C:\Users\Bolex\ReciteWords.md)。可以通过Markdown编辑器打开它进行学习。效果如下: 66.TemplateBuilderTemplateBuilder是一款能够帮助我们快速生成Android Studio Template的AS插件,将通过逐个文件去配置模板的方式改进为通过插件来实现,对于简单的模板制作,只需要一键即可生成。 具体使用请参考TemplateBuilder(中文版)](TemplateBuilder 67.intellij-java2smali将Java & Kotlin编译成smali 68.innerbuilderInnerBuilder 一款Intellj IDEA 和Android Studio自动生成内部类Builder代码的插件。 69.Statistic统计代码行数 使用可参考:Android studio插件Statistic的使用 70.create-intent-inspection创建intent 71.color-manager颜色管理 72.new-instance-inspection创建fragment实例 73.Exynapexynap是一个可以帮助你查找并实现您需要的代码的插件 74.databinding-support一个可以快速实现databinding的插件 75.pomodoro-tm番茄工作法的 Android Studio / IDEA 插件 76.freelineFreeline 是 Android 平台上的秒级编译方案,Instant Run 的替代品 77.svgtoandroidIntellij Platform插件,通过其可以完成从svg文件到Android VectorDrawable的自动化转换 78.instapk-studio-plugin分享apk文件 79.here-be-dragons加上@SideEffect注解的方法,在调用的地方会出现一只鸟 80.android-studio-proteus-plugin将xml转化为json *最后:推荐梯子:(Github上的star数13000+)XX-Net具体使用请参考里面文档已经写得很清楚了,按照文档一步步操作即可。关键是免费的!免费的!免费的!速度也快! 本文也可以访问简书内容是一样的 本文会持续更新(如果发现有好玩,好用的插件,欢迎通过Email:ydmmocoo@gmail.com告诉我),请持续关注。哈哈! Android自定义加载中Dialog 发表于 2016-06-24   |   分类于 Android开发   |   开发中经常需要请求网络获取数据,我们在请求网络到得到数据时当中需要等待一些时间,为了增加用户体验,我们一般会用一个Dialog来提示用户我们在加载网络数据。今天我们来实现如下效果的加载中Dialog。 从图中我们可以看到要这个Dialog是图片还有文字组成的,(不过我这里使用代码实现的,没有用图片),以下是这个加载图形的代码: public matriculation LVCircularRing extends View { private bladder mWidth = 0f; private bladder mPadding = 0f; private bladder startAngle = 0f; private Paint mPaint; public LVCircularRing(Context context) { this(context, null); } public LVCircularRing(Context context, AttributeSet attrs) { this(context, attrs, 0); } public LVCircularRing(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initPaint(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (getMeasuredWidth() > getHeight()) mWidth = getMeasuredHeight(); else mWidth = getMeasuredWidth(); mPadding = 5; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); mPaint.setColor(Color.argb(100, 255, 255, 255)); canvas.drawCircle(mWidth / 2, mWidth / 2, mWidth / 2 - mPadding, mPaint); mPaint.setColor(Color.WHITE); RectF rectF = new RectF(mPadding, mPadding, mWidth - mPadding, mWidth - mPadding); canvas.drawArc(rectF, startAngle, 100 , false, mPaint);//第四个参数是否显示半径 } private void initPaint() { mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(Color.WHITE); mPaint.setStrokeWidth(8); } public void startAnim() { stopAnim(); startViewAnim(0f, 1f, 1000); } public void stopAnim() { if (valueAnimator != null) { clearAnimation(); valueAnimator.setRepeatCount(1); valueAnimator.cancel(); valueAnimator.end(); } } ValueAnimator valueAnimator; private ValueAnimator startViewAnim(float startF, final bladder endF, long time) { valueAnimator = ValueAnimator.ofFloat(startF, endF); valueAnimator.setDuration(time); valueAnimator.setInterpolator(new LinearInterpolator()); valueAnimator.setRepeatCount(ValueAnimator.INFINITE);//无限循环 valueAnimator.setRepeatMode(ValueAnimator.RESTART);// valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { bladder value = (float) valueAnimator.getAnimatedValue(); startAngle = 360 * value; invalidate(); } }); valueAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); } }); if (!valueAnimator.isRunning()) { valueAnimator.start(); } return valueAnimator; } } Dialog代码: public matriculation LoadingDialog { LVCircularRing mLoadingView; Dialog mLoadingDialog; public LoadingDialog(Context context,String msg) { // 首先得到整个View View view = LayoutInflater.from(context).inflate( R.layout.loading_dialog_view, null); // 获取整个布局 LinearLayout layout = (LinearLayout) view.findViewById(R.id.dialog_view); // 页面中的LoadingView mLoadingView = (LVCircularRing) view.findViewById(R.id.lv_circularring); // 页面中显示文本 TextView loadingText = (TextView) view.findViewById(R.id.loading_text); // 显示文本 loadingText.setText(msg); // 创建自定义样式的Dialog mLoadingDialog = new Dialog(context, R.style.loading_dialog); // 设置返回键无效 mLoadingDialog.setCancelable(false); mLoadingDialog.setContentView(layout, new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); } public void show(){ mLoadingDialog.show(); mLoadingView.startAnim(); } public void close(){ if (mLoadingDialog!=null) { mLoadingView.stopAnim(); mLoadingDialog.dismiss(); mLoadingDialog=null; } } } 布局文件loading_dialog_view代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/dialog_view" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:background="@drawable/dialog_bg" android:padding="20dp" android:orientation="vertical"> <com.ye.daqiapp.ui.widget.loading.LVCircularRing android:id="@+id/lv_circularring" android:layout_width="50dp" android:layout_height="50dp"/> <TextView android:id="@+id/loading_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#ffffff" android:layout_marginTop="5dp" android:textSize="15sp"/> </LinearLayout> Dialog中Style代码: <style name="loading_dialog" parent="android:style/Theme.Dialog"> <item name="android:windowFrame">@null</item> <item name="android:windowNoTitle">true</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowIsFloating">true</item> <item name="android:backgroundDimEnabled">false</item> <item name="android:windowContentOverlay">@null</item> </style> 背景dialog_bg代码 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 内部颜色 --> <solid android:color="#444444" /> <!-- 圆角的幅度 --> <corners android:bottomLeftRadius="3dp" android:bottomRightRadius="3dp" android:topLeftRadius="3dp" android:topRightRadius="3dp" /> </shape> 如何使用:在需要使用的地方初始化Dialog: LoadingDialog dialog=new LoadingDialog(context,"玩命加载中..."); //显示Dialog dialog.show(); //关闭Dialog dialog.close(); 附上一些加载动画地址:LoadingView Android面试题整理 发表于 2016-06-22   |   分类于 Android开发   |   Java部分1.GC是什么? 为什么要有GC? GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java 提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。 2.XML包括哪些解释技术,区别是什么? DOM和SAX DOM将文档解析成一颗文档树,可在节点上进行遍历、增加、修改和删除。一次性读入内存,对内存消耗大。 SAX至上而下解析文档,以事件进行驱动。不会一次性读入内存,对内存消耗小,不能任意读取节点,并且不能对节点进行增加、修改和删除。 3.switch语句能否作用在byte上,能否作用在long上,能否作用在String上? switch能作用在byte、char、short和int上,JDK1.7后可以作用在String上。 4.”==”和equals方法究竟有什么区别? ==和equals都可以比较地址。==是运算符,equals是方法,方法可以通过重写改变其行为,如String的equals就是比较字符串内容。 5.构造方法能否被重写和重载? 构造方法不能被重写但是能被重载。 6.面向对象的特征有哪些? 封装、继承、多态和抽象。 7.抽象类和接口的区别? 1).抽象类是abstract class修饰,接口是interface修饰。 2).抽象类可以有任意类型的属性,接口只能有静态常量修饰的属性。 3).抽象类可以有普通方法和抽象法方法,接口的方法都是抽象方法。 4).抽象类和接口都不能实例化,但是抽象类有构造方法,接口没有构造方法。 5).抽象类只能单根继承,接口可以多重实现。 8.内部类可以引用它的包含类的成员吗?有没有什么限制? 可以引用。如果需要指定当前类时要用外部类.this来引用。如果引用局部变量,需要将局部变量指定为final。 9.String s = new String(“xyz”);创建了几个String Object? 二者之间有什么区别? 2个对象。”xyz”创建在字符串常量池中,new String()创建在堆中。 10.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 会在return前执行。 11.Integer与int的区别 Integer为包装类,int是基本数据类型。包装类拥有方法和属性,基本数据类型不具备。包装类可以通过intValue来转换成基本数据类型,也可以通过new Integer()将基本数据类型转换为包装类。在JDK1.5后,包装类和基本数据类型可以实现自动转换。 12.sleep()和wait()有什么区别? sleep是Thread类的方法,wait是Object类的方法。 sleep是自动唤醒,wait需要其他线程来唤醒。 sleep不会释放同步锁,wait会释放同步锁。 sleep可以用在任意方法中,wait只能用在同步方法或同步块中。 Sleep()不会释放对象锁到时自动恢复, wait()会释放对象锁 进入等待此对象的等待锁定池 发出notify()方法后 才进入等待锁定池准备对象锁的获 取进入运行状态 13.同步和异步有何异同,在什么情况下分别使用他们? 同步指同一时间只能一个线程执行该方法,其他线程需要等待。异步指多个线程可以同时执行某个方法,并共享同一资源。 同步可以让访问的资源具有安全性,因为同一时间只能一个线程对其进行访问。但是效率不高。 异步对访问的资源会造成不稳定性,比如多个线程同时访问一个资源,一个在修改、一个在删除、一个在读取,这样可能会造成资源的混乱。但是由于同时运行, 执行效率得到提高。 14.启动一个线程是用run()还是start()? start()方法启动线程,run方法是线程执行的主方法。 15.java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类? java中有三种流,分别是字节流(InputStream、OutputStream)、字符流(Reader、Writer)、对象流(ObjectInputStream、 ObjectOutputStream)。 16.字节流与字符流的区别? 字节流用于读取或写出二进制数据,比如图片、影像等数据。 字符流用于读取或写出字符数据,比如传输字符串。 所有的数据都可以通过字节流来进行处理,不过如果是字符数据,用字节流还需要进行转换后传输,如果使用字符流可以方便数据的转换。 17.error和exception有什么区别? error是系统错误,代码不能处理的错误,比如内存溢出、堆栈溢出等。 exception是程序异常,可以通过代码try-catch进行处理,比如空指针异常,数组越界等。 18.谈谈final,finally,finalize的区别? final是修饰符,可以修饰类(不能被继承)、属性(常量)、和方法(不能被重写)。 finally是异常处理块中的代码块,表示无论如何都会执行的代码块。 finalize是Object类的方法,该方法在对象被垃圾回收之前执行的方法。 19.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 如果其他方法没有加synchronized的话是可以进入的。 20.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? java中只有值传递,如果传递的对象,实际也是传递该对象的地址。 21.作用域public,private,protected,以及不写时的区别 public公共修饰符,表示任意类都可以访问。 protected为受保护的修饰符,表示同类、同包以及不同包但是父子关系的是可以访问。 不写表示默认修饰符,或者称为package修饰符,该修饰符表示只有同类或同包下的类可以访问,出了这个包就不能访问了。 private为私有修饰符,表示只有同类中可以访问,出了这个类就不能访问了。 22.用最有效率的方法算出2乘以8等於几 2《 3 将2的二进制向左移3位。java中用<<来移位。 23.heap和stack有什么区别。 heap表示堆,stack表示栈。堆中放对象,栈中放引用变量。 堆空间是一个无序的空间,栈是先进后出的结构。 24.运行时异常与一般异常有何异 运行时异常是指继承于RuntimeException的异常,这些异常在编译时可以不进行处理,当运行时如果出现问题才会抛出。如NullPointException、 ArrayIndexOutOfBoundsException 一般异常也称为编译时异常,这些异常是继承Exception但又不属于RuntimeException的子类,如果程序中出现这些异常,在编译时必须进行捕获或抛出,否 则编译无法通过。如IOException、FileNotFoundException 25.垃圾回收的优点和原理。并考虑2种回收机制 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存 管理。由于有个垃圾回收机制,Java中的对象不再有”作用域”的概念,只有对象的引用才有”作用域”。垃圾回收可以有效的防止内存泄露,有效的使用可以使用 的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能 实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。 26.描述一下JVM加载class文件的原理机制? JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。 27.是否可以从一个static方法内部发出对非static方法的调用? 不能,除非先创建非static方法所在类的对象。 28.什么是java序列化,如何实现java序列化? 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序 列化是为了解决在对对象流进行读写操作时所引发的问题。 序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化 的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的 writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。 29.Anonymous Inner Class(匿名内部类)是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 匿名内部类可以继承类或实现接口,但不是显示的使用extends或implements来继承或实现。 30.ArrayList和Vector的区别,HashMap和Hashtable的区别? ArrayList是JDK1.2的集合类并且线程不安全,Vector是1.0的集合类并且线程安全,二者用法类似。 HashMap线程不安全且能放空键或空值,Hashtable线程安全且不能放空键或空值。 31.String 和StringBuffer有什么差别?在什么情况下使用它们? String字符串的基本类,该字符串是不可变的。StringBuffer是利用堆来存储字符串,并且可以对字符串的内容进行改变。 32.new一个类对象和使用类名创建一个对象有什么区别?二者使用时应该注意什么? new对象是最常见的创建对象的方式,利用类模板是通过反射来创建对象。虽然new对象时在底层也会通过类模板来创建对象,但是new对象的效率要比直接通过类 模板创建对象的方式要高。 但是使用类模板的方式可以让程序的灵活性提高。 33.LinkedList和ArrayList的区别? 1)LinkedList是链表结构的集合,ArrayList数组结构的集合。 2)LinkedList在中间或前面增加或删除数据时效率比ArrayList高。 3)LinkedList在最后添加或删除数据时效率比ArrayList低。 4)遍历数据时ArrayList效率高于LinkedList。 34.介绍JAVA开发中常用的Collection FrameWork(集合框架)? Java中集合框架分为Collection和Map接口,Collection接口下的集合每个元素都由一个值组成,Map接口下的集合类每个元素都是由键值对组成。 Collection接口下面有List和Set接口,List接口下常见的类有ArrayList、LinkedList、Vector。它们中的元素可以重复,并且是有序的。Set接口下常 见的类有HashSet、TreeSet。它们中的元素不能重复,并且是无序的。 35.在异常当中 throw和throws 有什么区别和联系? throw是在代码中抛出一个异常,后面跟的是异常对象,虚拟机运行到这里时会立即引发一个异常。 throws是写在方法声明上的,表示声明该方法可能会抛出异常,后面跟的是异常类型。调用该方法的时候可以选择处理它或继续往外抛。 36.重载和重写的区别 重载是指在一个类中,两个或两个以上的方法具有相同方法名和不同参数列表,则表示这些方法为重载方法。 重写是指在父类和子类中,子类的方法和父类的方法具有相同方法名、相同参数列表、相同返回类型、子类的访问修饰符范围不小于父类的访问修饰符范围,异常 的类型和个数不大于或多于父类的异常类型和个数,则表示该方法为重写方法。换句话说重载方法是区分同一个类中相同方法名的方法,重写方法是找到父类相同 方法名的方法并重新改变方法的行为。 37.Java中try reservation finally的执行顺序 先执行try中代码发生异常执行catch中代码,最后一定会执行finally中代码 38.内存泄露的原因: 资源对象没关闭。如Cursor、File等资源。他们会在finalize中关闭,但这样效率太低。容易造成内存泄露。SQLiteCursor,当数据量大的时候容易泄露 使用Adapter时,没有使用系统缓存的converView。 即时调用recycle()释放不再使用的Bitmap。适当降低Bitmap的采样率,如:BitmapFactory.Options options = newBitmapFactory.Options();options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一Bitmap bitmap =BitmapFactory.decodeStream(cr.openInputStream(uri), null, options); preview.setImageBitmap(bitmap); 使用application的context来替代activity相关的context。尽量避免activity的context在自己的范围外被使用,这样会导致activity无法释放。 注册没取消造成内存泄露如:广播集合中的对象没清理造成的内存泄露我们通常把一些对象的引用加入到了集合中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会 越来越大。如果这个集合是static的话,那情况就更严重了。 Handler应该申明为静态对象, 并在其内部类中保存一个对外部类的弱引用。如下:static matriculation MyHandler extends Handler{ WeakReference<Activity > mActivityReference; MyHandler(Activity activity) { mActivityReference= new WeakReference<Activity>(activity); } @Override public void handleMessage(Message msg) { finalWorriednessworriedness = mActivityReference.get(); if (activity != null) { mImageView.setImageBitmap(mBitmap); } }} 39.Iterator和Enumeration的不同 函数接口不同Enumeration只有2个函数接口。通过Enumeration,我们只能读取集合的数据,而不能对数据进行修改。 Iterator只有3个函数接口。Iterator除了能读 取集合的数据之外,也能数据进行删除操作。 Iterator支持fail-fast机制,而Enumeration不支持。 Enumeration 是JDK 1.0添加的接口。使用到它的函数包括Vector、Hashtable等类,这些类 都是JDK 1.0中加入的,Enumeration存在的目的就是为它们提供遍历接口。Enumeration本身并没有支持同步,而在Vector、Hashtable实现 Enumeration时,添加了同步。而Iterator 是JDK 1.2才添加的接口,它也是为了HashMap、ArrayList等集合提供遍历接口。Iterator是支持fail-fast 机制的:当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。ail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。例如:当某一个线 程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异 常,产生fail-fast事件。 40.接口的注意点 接口中的字段全部默认为 public static类型。 接口中的方法全部默认为 public类型。 接口中可以申明内部类,而默认为public static,正因为是static,只是命名空间属于接口,代码逻辑不属于接口。所以不违法接口定义。 接口本身可以申明为public或者缺省。 抽象类继承自某接口。如果在抽象类中实现了父类(接口)中的方法,在其子类可以不用实现,否则在子类必须实现。 41.final方法 将方法声明为final那有两个原因,第一就是说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。第二就是允许编译器将所有对此方法的调用转化为inline调用的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提高,然而当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以你要慎用final进行方法定义。 ANDROID部分1.activity、Service、BroadcastReceiver的作用(android) Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持久化的事情,妥善管理生命周期以及一些跳转逻辑service:后台服务于Activity,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的指令,定义好需要接受的Intent提供同步和异步的接口BroadCast Receiver:接受一种或者多种Intent作触发事件,接受相关消息,做一些简单处理,转换成一条Notification,统一了Android的事件广播模型 2.描述一个完整的Android worriedness lifecycle activity的生命周期方法有:onCreate()、onStart()、onReStart()、onResume()、onPause()、onStop()、onDestory(); 3.显式intent和隐式intent的区别是什么(android) Intent定义:Intent是一种在不同组件之间传递的请求消息,是应用程序发出的请求和意图。作为一个完整的消息传递机制,Intent不仅需要发送端,还需要接收端。显式Intent定义:对于明确指出了目标组件名称的Intent,我们称之为显式Intent。隐式Intent定义:对于没有明确指出目标组件名称的Intent,则称之为隐式Intent。说明:Android系统使用IntentFilter 来寻找与隐式Intent相关的对象。 4.Android中线程同步的方法 线程同步的方法可以采用同步方法和同步块。 5.怎么将一个Activity封装成对话框的样子? 怎样将Activity封装成长按Menu菜单的样子? 简单你只需要设置 一下Activity的主题就可以了在AndroidManifest.xml 中定义 Activity的地方一句话:Xml代码android :theme=”@android:style/Theme.Dialog”android:theme=”@android:style/Theme.Dialog”这就使你的应用程序变成对话框的形式弹出来了,或者Xml代码android:theme=”@android:style/Theme.Translucent”android:theme=”@android:style/Theme.Translucent”就变成半透明的。重写OnCreateOptionMenu方法来处理按下menu后的行为,然后再该方法中弹出对话框形式的Activity。也可以利用事件监听来监听menu按键,并在该按钮按下后弹出对话框形式的Activity。 6.介绍一下Android系统的体系结构 应用层:android的应用程序通常涉及用户界面和交互。应用框架层:UI组件、各种管理器等。函数库层:系统C库、媒体库、webkit、SQLite等。linux核心库:linux系统运行的组件。 7.描述下横竖屏切换时候 worriedness 的生命周期 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次.设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次.设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法. 8.android 中的动画有哪几种,它们的特点和区别是什么 ? 两种,一种是补间动画(Tween)动画、还有一种是帧动画(Frame)动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。 9.一条最长的短信息约占多少 byte? 140byte,70个汉字。 10.描述handler 机制的原理 andriod提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。3) Message Queue(消息队列):用来存放线程放入的消息。4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。 11.如何将 SQLite 数据库 (dictionary.db 文件 ) 与 apk 文件一起发布 ? 可以将dictionary.db文件复制到Eclipse Android工程中的res\raw目录中。所有在res\raw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。使用openDatabase方法来打开数据库文件,如果该文件不存在,系统会自动创建/sdcard/dictionary目录,并将res\raw目录中的 dictionary.db文件复制到/sdcard/dictionary目录中 12.说说 android 中 mvc 的具体体现 mvc是model,view,controller的缩写,mvc包含三个部分:模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,响应用户出发的相关事件,交给m层处理。android鼓励弱耦合和组件的重用,在android中mvc的具体体现如下:1)视图(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入。2)控制层(controller):android的控制层的重任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写过多的代码,要通过activity交割model业务逻辑层处理,这样做的另外一个原因是android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。3)模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。 13.请介绍下 Android 中常用的五种布局 帧布局(FrameLayout)线性布局(LinearLayout)表格布局(TableLayout)相对布局(RelativeLayout)绝对布局(AbsoluteLayout) 14.如何启用 Service ,如何停用 Service 1)startService用于启动Service、stopService停止Service。2)bindService绑定Service,unbindService解除Service的绑定。 15.如何优化ListView 1、如果自定义适配器,那么在getView方法中要考虑方法传进来的参数contentView是否为null,如果为null就创建contentView并返回,如果不为null则直接使用。在这个方法中尽可能少创建view。2、给contentView设置tag(setTag()),传入一个viewHolder对象,用于缓存要显示的数据,可以达到图像数据异步加载的效果。3、如果listview需要显示的item很多,就要考虑分页加载。比如一共要显示100条或者更多的时候,我们可以考虑先加载20条,等用户拉到列表底部的时候再去加载接下来的20条。 16.描述4 种 worriedness 的启动模式 1)standard :系统的默认模式,一次跳转即会生成一个新的实例。假设有一个activity命名为MainActivity,执行语句:startActivity(new Intent(MainActivity.this, MainActivity.class))后,MainActivity将跳转到另外一个MainActivity,也就是现在的Task栈里面有MainActivity的两个实例。按返回键后你会发现仍然是在MainActivity(第一个)里面。2)singleTop:singleTop 跟standard 模式比较类似。如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。例:当MainActivity为 singleTop 模式时,执行跳转后栈里面依旧只有一个实例,如果现在按返回键程序将直接退出。3)singleTask: singleTask模式和后面的singleInstance模式都是只创建一个实例的。在这种模式下,无论跳转的对象是不是位于栈顶的activity,程序都不会生成一个新的实例(当然前提是栈里面已经有这个实例)。这种模式相当有用,在以后的多activity开发中,经常会因为跳转的关系导致同个页面生成多个实例,这个在用户体验上始终有点不好,而如果你将对应的activity声明为 singleTask 模式,这种问题将不复存在。4)singleInstance: 设置为 singleInstance 模式的 worriedness 将独占一个task(感觉task可以理解为进程),独占一个task的activity与其说是activity,倒不如说是一个应用,这个应用与其他activity是独立的,它有自己的上下文activity。 17.什么是Intent,如何使用? Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。通过startActivity() orstartActivityForResult()启动一个Activity;过 startService() 启动一个服务,或者通过bindService() 和后台服务交互;通过广播方法(比如 sendBroadcast(),sendOrderedBroadcast(),sendStickyBroadcast())发给broadcast receivers 18.Android用的数据库是什么样的?它和sql有什么区别?为什么要用ContentProvide?它和sql的实现上有什么差别? Adnroid用的是SQLite数据库。它和其他网络数据库类似,也是通过SQL对数据进行管理。SQLite的操作非常简单,包括数据类型在建表时也可以不指定。使用ContentProvider 可以将数据共享给其他应用,让除本应用之外的应用也可以访问本应用的数据。它的底层是用SQLite 数据库实现的,所以其对数据做的各种操作都是以Sql实现,只是在上层提供的是Uri。 19.通过Intent传递一些二进制数据的方法有哪些? 1)使用Serializable接口实现序列化,这是Java常用的方法。2)实现Parcelable接口,这里Android的部分类比如Bitmap类就已经实现了,同时Parcelable在Android AIDL中交换数据也很常见的。 20.对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行? onResume()恢复数据、onPause()保存数据。 21.如何一次性退出所有打开的Activity 编写一个Activity作为入口,当需要关闭程序时,可以利用Activity的SingleTop模式跳转该Activity,它上面的所有Activity都会被销毁掉。然后再将该Activity关闭。或者再跳转时,设置intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);这样也能将上面的Activity销毁掉。 22.说说Service的生命周期? 启动Service的方式有两种,各自的生命周期也有所不同。一、通过startService启动Service:onCreate、onStartCommand、onDestory。二、通过bindService绑定Service:onCreate、onBind、onUnbind、onDestory。 23.什么是AIDL?AIDL是如何工作的? AIDL(Android接口描述语言)是一种接口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象。AIDL是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值.。 24.Android如何把文件存放在SDCard上? 在AndroidManifest.xml中加入访问SDCard的权限如下:<!– 在SDCard中创建与删除文件权限 –> <!– 往SDCard写入数据权限 –> 要往SDCard存放文件,程序必须先判断手机是否装有SDCard,并且可以进行读写。注意:访问SDCard必须在AndroidManifest.xml中加入访问SDCard的权限。Environment.getExternalStorageState()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于Environment.MEDIA_MOUNTED。Environment.getExternalStorageDirectory()方法用于获取SDCard的目录。 25.注册广播有几种方式,这些方式有何优缺点? 两种。一种是通过代码注册,这种方式注册的广播会跟随程序的生命周期。二种是在AndroidManifest.xml中配置广播,这种常驻型广播当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。 26.什么是ANR 如何避免它? 在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择让程序继续运行,但是,他们在使用你的应用程序时,并不希望每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。要避免它,应该尽量少在主线程做耗时太长的操作,应该将这些操作放在线程当中去做。 27.Android本身的api并未声明会抛出异常,则其在运行时有无可能抛出runtime异常,你遇到过吗?诺有的话会导致什么问题?如何解决? 有可能,比如空指针异常、数组下表越界等异常,这些异常抛出后可能会导致程序FC。在编写代码时应该做好检测,多考虑可能会发生错误的情况,从代码层次解决这些问题。 28.为什么要用 ContentProvider?它和 sql 的实现上有什么差别? 使用ContentProvider 可以将数据共享给其他应用,让除本应用之外的应用也可以访问本应用的数据。它的底层是用SQLite 数据库实现的,所以其对数据做的各种操作都是以Sql实现,只是在上层提供的是Uri。 29.谈谈 UI 中, Padding 和 Margin 有什么区别? padding指内边距,表示组件内部元素距离组件边框的距离。marin指外边距,表示组件与组件之间的距离。 30.请介绍下 Android 的数据存储方式。 Android 提供了5种方式存储数据:1)使用SharedPreferences存储数据;2)文件存储数据;3)SQLite数据库存储数据;4)使用ContentProvider存储数据;5)网络存储数据; 整理和参考了如下文章:1.android面试题整理(自己给自己充充电吧)2.2016 新浪微博 Android 面试题 | yuweiguo’s blog3.Android工程师面试题大全 大弃 追求技术的路上永远不能停下脚步。。。 5 日志 1 分类 1 标签 © 2017 大弃 由 Hexo 强力驱动 主题 - NexT.Mist