Android智能电视APP开发笔记(一)
Android智能电视APP开发笔记(一)
1缘起
以小米盒子为代表的OTT机顶盒、智能电视的快速普及,快速推动了Android技术在机顶盒、智能电视领域的普及。
既然都是用的Android操作系统,那么从技术上来说应该是小异的,当然和手机APP的应用相比,电视端的APP开发应该有一些都有的特点需要关注,我相信这样的特点应该不会太多。
写这个笔记的缘起在于一个生活上的小小不便,因为儿子正在读小学,每天早上起来都需要听英语,学校发的磁带真的是不方便,老的磁带机相信很少有人用了,虽然也给他买了一个步步高的复读机,不过没用几天就被搁置了。
于是我在网上搜了个APP,在手机上很好用,可以直接翻看课文,也可以朗读课文,翻到哪页就朗读哪页,如果不翻动,就自动往下读,做的还是相当人性化的,但是这样一个新的问题产生了,每天早上我的手机就被我儿子霸占了,接到音响上听英语了,我要看个朋友圈啊啥的,就不方便了。
刚好家中有个OTT机顶盒,可以安装APP,就想着把这个APP装到OTT机顶盒上,结果发现完全无法使用,界面不对了,遥控器也响应不了了,完全无法使用啊,结论就是手机APP和TV APP还是有些区别的,须要作些微调适配的。
咋整呢?重新给写一个TV APP吧,为了夺回我手机的控制权,好歹哥以前也是开发工程师啊。
2Win7虚拟机创建
2.1 VMware Workstation安装
直接把开发环境安装在自己电脑上感觉不是太好,一个影响系统运行速度,二是免不了要装了卸,卸了装,把电脑运行环境搞得乱七八糟。
所以决定还是在虚拟机环境中玩。
虚拟机当然选行业老大VMware了,下载Vmware workstation进行安装。
没想到这玩意都升级到11.1版本了,这个世界真的是变化快啊。
从官网下载后再安装:
一路Next基本就OK了,几个注意点:
1、选择典型安装或自定义安装;建议单击“自定义”;然后选中要安装的功能(建议钩选“增
强型键盘使用工具”,凭感觉,也不知道什么原因,反正也没装Visual Studio,所以没选择这个插件);
2、建议不要勾选“启动时检查产品更新”;
3、建议不要勾选“帮助改善VMware Workstation”;
4、中途若出现杀毒软件提示修改,请选择“允许”;出现“您信任该网络连接吗?”时,按
需选择;建议选择”是的,这是一个可信任的网络“;
到了输入许可证密钥界面,我用了这个:1F04Z-6D111-7Z029-AV0Q4-3AEH8,目前可用,未来过期失效了不要找我。
2.2 Win7安装盘准备
在Vmware上创建虚拟机之前,先得准备个Win7安装光盘或者ISO文件,我是找别人要了Win7旗舰版的安装盘,然后用UltraISO制作成ISO文件备用的。
2.3 创建虚拟机
打开VMware Workstation软件,然后选择“创建新的虚拟机”
建议选择“自定义”,然后Next,
选择默认值,Next
我是采用的ISO文件作为操作系统光盘的,Next
有序列号输入序列号,没有的话先不输入,装完后用免激活工具吧;
反正是虚拟机,就不设置密码了,启动简单一点;Next 弹出个提示框,选“是”喽,Next
这一步根据需要设置,建议不要放在C盘系统盘,Next
选默认的,Next
这几步视需要配置好了,Next
这个建议用“桥接网络”,这样最接近真实物理机,Next 这两步都用推荐配置好了,Next
这里当然新建了,手头又没有现成的虚拟磁盘;Next
选了默认配置,心里有点慌,以前搞个XP的虚拟机也就10G撑死了,现在一下就60G,有点吓人哦,Next
终于OK了,点“完成”开始创建虚拟机了
2.4 安装Win7
虚拟机装完后,开始启动虚拟机,因为设置了光盘为Wi7安装盘的ISO文件,虚拟机会自动进入Win7安装程序,基本不用人工干涉,就让它一路安装就行了。
虚拟机会自动重启几次,安装完后,就可以进行后续的工作了。
可以选择全屏模式,看起来舒服一点。
对了,还有个重要的步骤,激活操作系统
还得有劳百度,可以下载一个免激活软件,装完以后启动,然后点击“开始体验正版”
然后弹出以下界面,然后自动重启系统;
最后在“计算机”上点击属性:
看到后面的正版标志,就OK了。
3下节预告
本节起始跟开发没什么关系,只是搭建了一个Win7的虚拟机,但是这个虚拟机是后续开发的基础啊,所以还是简单介绍了一下,如有必要我可以把这个虚拟机直接放在云盘上上共享,也省得大家辛辛苦苦搭建这个环境了。
下节将会进行开发环境的搭建工作介绍,会对Eclipse和android Studio都会做个介绍,敬请期待。
android核心知识点笔记
android核心知识点笔记Android核心知识点笔记一、Android基础知识1. Android的发展历程- Android是由Andy Rubin创建的一个开放源代码的移动操作系统,2003年创建,2005年被Google收购,2008年首次推出。
- Android的发展经历了不断的版本迭代,包括Cupcake、Donut、Eclair、Froyo、Gingerbread、Honeycomb、Ice Cream Sandwich、Jelly Bean、KitKat、Lollipop、Marshmallow、Nougat、Oreo、Pie等。
- Android的版本迭代主要包括增加新功能、优化性能、改进用户界面等方面的改动。
2. Android应用的开发流程- Android应用的开发包括需求分析、设计界面、编写代码、调试、测试和发布等阶段。
- 需求分析阶段是确定应用的功能和界面设计的重要阶段,可以根据用户需求绘制原型图、进行用户调研等。
- 设计界面阶段包括绘制应用的界面布局、设计图片资源等。
- 编写代码阶段是根据需求和设计完成应用的逻辑和功能代码的编写,可以使用Java语言和Android SDK提供的API。
- 调试阶段是通过模拟器或真机进行应用的调试和测试,可以检查代码逻辑和界面的运行情况。
- 测试阶段是进行全面的功能测试、性能测试和兼容性测试,确保应用在各种设备上都能正常运行,并修复可能存在的Bug。
- 发布阶段是将应用打包成APK文件并上传到应用商店,供用户下载和安装使用。
3. Android应用的架构- Android应用的架构包括四个主要组件:Activity、Service、Broadcast Receiver和Content Provider。
- Activity是Android应用的界面显示和用户交互的主要组件。
- Service是一个可以在后台运行的组件,可以执行一些长时间运行的任务,如音乐播放、网络下载等。
Android学习新手笔记(非教程)
【济南中心】Android课程同步笔记day01:Android应用之安全卫士
【济南中心】Android课程同步笔记day01:Android应用之安全卫士代码的组织方式:- 业务逻辑模块组织代码小米阅读1. 阅读器reader com.xiaomi.reader2. 分享share com.xiaomi.share3. 便签note com.xiaomi.note- 根据代码的类型组织包结构1. 界面com.itheima.mobilesafe.activities2. 服务com.itheima.mobilesafe.services3. 业务逻辑com.itheima.mobilesafe.engine4. 数据库com.itheima.mobilesafe.db5. 数据库增删改查com.itheima.mobilesafe.db.dao6. 工具类com.itheima.mobilesafe.utils7. 自定义view com.itheima.mobilesafe.uisplash界面的作用:1. 展现产品的logo,提升产品的知名度.2. 初始化应用程序的数据.3. 连接服务器,查找可更新的版本,自动更新4. 用户操作指南5. 新版本特性提醒布局文件的命名规则:SplashActivity--->activity_spalsh.xmlXxxActivity---> activity_xxx.xml获取应用程序版本号://用PackageManager拿到PackageInfo,PackageInfo中的versionNamePackageInfo packinfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);String version = packinfo.versionName;源代码版本控制:- 安装VisualSVN Server——SVN服务器,一直下一步即可- 导入仓库到服务器1.在Repositories处右键,选择Import Existing Repository2.选择Copy repository from another location,下一步3.点击Browse,选择仓库路径,"代码/代码仓库/Repository/mobilesafe",点击下一步4.点击Import5.点击Finish,导入完成- 安装TortoiseSVN——SVN客户端,一直下一步即可1.在想要检出代码的地方右键,选择SVN Checkout2.URL of repository处填https://127.0.0.1/svn/mobilesafe/,地址也可以从SVN服务器的mobilesafe处右键选择Copy URL to clipboard拷贝3.Checkout directory出填写检出代码要放的位置,然后点击OK4.完成代码的检出- 将代码更新到指定版本1.mobilesafe文件夹出右键,选择Update to version2.点击show log3.点击左下角的show all4.选择要更新的版本,点击OK5.版本更新完成应用自动更新的逻辑图:获取服务器版本号://获取服务器地址String path = getResources().getString(R.string.url);URL url = new URL(path);//创建网络连接HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(5000);//发出请求,获得返回码int code = conn.getResponseCode();if(code ==200){//获取服务器返回的流并进行解析InputStream is = conn.getInputStream();String result = StreamTools.readStream(is);//转化为json并解析出版本号JSONObject json = new JSONObject(result);String serverVersion = json.getString("version");Log.i(TAG,"服务器版本:"+serverVersion);}将流转化为字符串:public static String readStream(InputStream is) throws IOException{//ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte 型数组的缓冲区,缓冲区会随着数据的不断写入而自动增长。
【Android开发Wiki】进阶篇TV应用设计(一)—优化电视布局
为景观模式提供适当的布局源文件.确保文本和相应的控制在一定距离上是足够大以便看见的.为高清电视提供高分辨率的位图和图标.设计景观布局电视屏幕通常都是取决于景观.针对电视屏幕按照这些技巧来优化你的景观布局:把屏幕上的导航控制菜单放在屏幕的左边或者右边,并且将菜单内容以垂直的方式显示.创建那些分段的UI时,通过使用Fragments和使用像用GridView来替代ListView更能充分使用水平空间的视图组控件.使用视图组例如RelativeLayout和LinearLayout来排版视图.以上这些允许android系统能够针对大小,对齐,纵横比,以及屏幕的像素密度来匹配视图的位置在视图控制之间提供足够的余地来避免一个杂乱的用户界面.例如接下来的布局就是针对TV优化的:在这个布局中,控制是位于左边界.这个UI界面里面显示了一个GridView控件,这个GridView是非常适合景观方向的UI.在这个布局中GridView和Fragment都是动态设置宽和高,以便能自适应屏幕的分辨率.在运行时控制视图被添加到了左边片段编程.这UI布局文件位res/layoutlandlarge/photogrid_tv.xml下.(这个布局文件放置在layout-land-large,在一个电视的应用程序的UI里,文字和控制应当是容易看见并且在一定距离内可以导航的.例如这些技巧能让它们在一定距离内更加容易看见:把文本插入用户能够快速地扫描到的小块中.在一个黑暗的背景中使用明亮的文本.这个风格在一台电视中更方便读.避免轻量级的字体以及那些要么非常窄要么非常宽的笔画字体.使用简单的无衬线字体和使用抗混叠来提高可读性.使用系统的标准的字体大小:确保那时你的所有视图小工具足够的大以便距离屏幕10英尺的人能清晰可见.要实现它的最好方式是采用相对布局大小而不是绝对布局大小,并且采用密度无关的像素单元而不是绝对的像素单元.例如,设置容器的宽,使用实际的大小来替代像素尺寸,并且设置与父组件的距离,使用dip像素单元替代px像素单元.针对高分辨率大屏幕设计android系统有一个内存限制量,所以在你的应用程序中下载和保存一个高分辨率的图片经常会导致内存溢出的错误.为了避免这些,使用如下这些技巧:仅当它们被显示在屏幕上的时候进行加载.例如,当在GridView和Gallery中显示多组图片时,当在视图的Adapter中调用[android.view.View,android.view.ViewGroup) getView()](/reference/android/widget/Adapter.html#get View(int,)方法时加载图片.在不在需要的bitmap视图中调用recycle()方法.在内存回收器重采用WeakReference来存储涉及到的位图对象.如果你从网络下载图片,使用AsyncTask来下载它们并且将它们保存在sdcard方便快速访问.在应用程序的UI线程中永远也不要处理网络交互.当你下载它们时按比例缩小原来大的图片到一个更适合它的大小;否则下载图片本身可能会导致内存溢出异常.这里有一个在执行下载的时候按比例缩小图片的范例代码:文章来源:/page/Optimizing_Layouts_for_TV。
学习Android应用开发的基本知识和实践技巧
学习Android应用开发的基本知识和实践技巧第一章:介绍Android应用开发的基本概念和原理Android应用开发是基于Java语言的编程技术,用于开发针对Android操作系统的移动应用程序。
Android应用是以APK (Android Package)文件的形式进行发布和安装。
了解Android应用开发的基本概念对于初学者尤为重要。
1.1 Android应用开发的基本概念Android应用由多个组件组成,包括Activity(界面显示与交互)、Service(后台运行任务)、Broadcast Receiver(接收系统或其他应用的广播消息)以及Content Provider(数据共享)等。
理解这些组件的作用和相互关系是学习Android应用开发的基础。
1.2 Android应用的工作原理Android应用通过Activity与用户进行交互,通过Service进行后台任务处理,通过Broadcast Receiver接收系统或其他应用发送的广播消息,通过Content Provider与其他应用共享数据。
这些组件通过Android操作系统的调度和协调完成应用的各项功能。
第二章:Android应用开发环境的搭建和配置搭建和配置合适的开发环境对于学习和开发Android应用至关重要。
本章将介绍Android Studio的安装和配置,并简要介绍一些常用的开发工具和调试技巧。
2.1 安装Android StudioAndroid Studio是官方推荐的开发工具,拥有丰富的插件和功能,能够提高开发效率。
详细介绍Android Studio的安装和配置步骤以及一些常用设置,例如模拟器的选择和调试工具的使用。
2.2 其他开发工具和调试技巧除了Android Studio,还有一些其他的开发工具和调试技巧。
例如,利用ADB(Android Debug Bridge)进行模拟器调试、使用Logcat进行错误日志的查看和分析、使用布局编辑器进行界面的设计和预览等。
安卓开发年度总结范文(3篇)
第1篇一、前言随着移动互联网的快速发展,安卓系统凭借其开源、免费的优势,在全球范围内迅速普及。
作为一名安卓开发者,我深感荣幸能参与到这个充满活力和挑战的领域。
在过去的一年里,我紧跟技术发展趋势,努力提升自己的专业技能,现将年度工作总结如下。
二、技术成长1. 熟练掌握Java编程语言,能够独立完成Android应用开发。
2. 熟悉Android开发工具,如Android Studio、Eclipse等,能够快速搭建开发环境。
3. 熟悉Android系统架构,包括四大组件(Activity、Service、BroadcastReceiver、ContentProvider)、AndroidManifest.xml配置、Intent等。
4. 掌握Android UI开发,熟悉各种布局方式(LinearLayout、RelativeLayout、FrameLayout等)和常用UI组件(Button、TextView、EditText等)。
5. 学习并应用Android性能优化技巧,如内存优化、电量优化、CPU优化等。
6. 熟悉Android网络编程,掌握HTTP、HTTPS、Socket等网络通信方式。
7. 掌握Android数据存储,包括SharedPreferences、SQLite、ContentProvider 等。
8. 学习并应用Android框架,如MVC、MVP、MVVM等,提高开发效率和代码质量。
三、项目经验1. 参与了多个Android应用开发项目,积累了丰富的项目经验。
2. 独立负责过项目需求分析、设计、开发、测试、上线等全过程。
3. 负责过Android应用界面设计,实现用户交互体验优化。
4. 负责过Android应用性能优化,提高应用运行速度和稳定性。
5. 参与过Android应用版本迭代,持续优化产品功能。
四、团队协作1. 积极参与团队讨论,与团队成员分享技术心得。
2. 主动承担团队任务,协助其他成员解决技术难题。
Android智能电视APP开发笔记(三)图片加载和显示
TVAPP开发笔记(三)——图像加载和显示1概述更新有点慢了,主要最近事情比较多给耽搁了。
先要对计划开发的APP作个简单的描述:这是一个小学英语学习的APP,主要提供课文的浏览和英文内容朗读的功能,相对来说功能比较简单。
应用场景简单描述如下:进入APP1、进入APP,自动装载对应年级(比如三年级上,三年级下,四年级上,四年级下等)的小学英语课文封面(参见下图1)。
(说明:先按照目前应用商店上的APP的做法,不同年级的课文做成不同的APP,未来可以改为一个APP中包含小学所有年级段英文课文的版本)翻页2、通过手机划屏,或者按界面的“上一页”,“下一页”等按钮可以进行翻页操作,浏览整个英语课文,翻到对应页面,显示对应的页码(如图2,4所示)。
3、点击“页码”可以快捷选择希望进入的页面(如图3所示)。
朗读4、点击“播放”按钮可以播放当前页面的英文内容,根据APP的设置,可以自动只播放当前页面,或者播放所选页面所在Unit,或者播放整篇课文。
5、在朗读状态下,当前页播放完成后,如果是自动朗读下一页的选项,在朗读下一页的同时,页面自动切换到下一页。
6、在朗读状态下,进行翻页操作,自动朗读对应页面的内容;7、在朗读状态下,如果选择“停止”,自动关闭朗读功能;设置8、用户点击“设置”按钮,可以进行朗读模式的设置;退出9、用户选择退出APP,如果在朗读状态,自动停止朗读;主要UI界面如下图所示:图1 图2图3 图4简单对流程进行梳理,界面流程图如下:“上一页”,“下一页”,划屏翻页“上一页”,“下一页”,划屏翻页(TV:“Next ”,”Prev ”键值响应)(TV:“Next ”,”Prev ”键值响应)其中红色部分是针对TV 需要优化的内容,主要对键值响应。
2 图像加载和显示技术通过上述分析,首先要实现英语课本的阅读和翻页功能;英语课本最简单的实现方法是每一页用一个图片来显示,具有图文并茂的好处。
图片的存储方法可以分为两种,一种方法是存在本地,另外一种方法是存在网络,这两种方法各有利弊:1) 存在本地:优点是显示效率高,缺点是本地资源占有较大,而且容易被Copy ,不利于版权保护;2) 存在网络:本地资源占用较少,而且可以进行防Copy ,但是缺点是受网络带宽影响较大,如果手机端网络环境不好,就无法显示;本文中的APP 的图片用来显示英语课本,理论上存在版本问题,存在本地其实不是非常合适,采用网络的方式比较合适,在实际操作中还需要考虑版权保护问题,防止被非法窃取。
Android智能电视APP开发笔记(一)
Android 智能电视 APP 开发笔录 (一)1缘起以小米盒子为代表的OTT 机顶盒、智能电视的迅速普及,迅速推进了Android 技术在机顶盒、智能电视领域的普及。
既然都是用的Android 操作系统,那么从技术上来说应当是迥然不同的,自然和手机APP 的应用对比,电视端的APP 开发应当有一些都有的特色需要关注,我相信这样的特色应当不会太多。
写这个笔录的缘起在于一个生活上的小小不便,由于儿子正在读小学,每日清晨起来都需要听英语,学校发的磁带真的是不方便,老的磁带机相信极罕有人用了,固然也给他买了一个步步高的复读机,可是没用几日就被放置了。
于是我在网上搜了个APP,在手机上很好用,能够直接翻看课文,也能够朗诵课文,翻到哪页就朗诵哪页,假如不翻动,就自动往下读,做的仍是相当人性化的,可是这样一个新的问题产生了,每日清晨我的手机就被我儿子侵占了,接到音响上听英语了,我要看个朋友圈啊啥的,就不方便了。
恰好家中有个 OTT 机顶盒,能够安装 APP,就想着把这个 APP 装到 OTT 机顶盒上,结果发现完整没法使用,界面不对了,遥控器也响应不了了,完整没法使用啊,结论就是手机APP 和 TV APP 仍是有些区其他,须要作些微调适配的。
咋整呢?从头给写一个 TV APP 吧,为了夺回我手机的控制权,好歹哥从前也是开发工程师啊。
2 Win7 虚构机创立2.1 VMware Workstation安装直接把开发环境安装在自己电脑上感觉不是太好,一个影响系统运转速度,二是免不了要装了卸,卸了装,把电脑运转环境搞得乌七八糟。
因此决定仍是在虚构机环境中玩。
虚构机自然选行业老大VMware 了,下载 Vmware workstation 进行安装。
没想到这玩意都升级到 11.1 版本了,这个世界真的是变化快啊。
从官网下载后再安装:一路 Next 基本就 OK了,几个注意点:1、选择典型安装或自定义安装;建议单击“自定义”;而后选中要安装的功能(建议钩选“增强型键盘使用工具”,凭感觉,也不知道什么原由,反正也没装Visual Studio,因此没选择这个插件 );2、建议不要勾选“启动时检查产品更新”;3、建议不要勾选“帮助改良 VMware Workstation ”;4、半途若出现杀毒软件提示改正,请选择“同意”;出现“您相信该网络连结吗?”时,按需选择;建议选择”是的,这是一个可相信的网络“;到了输入同意证密钥界面,我用了这个:1F04Z-6D111-7Z029-AV0Q4-3AEH8,当前可用,将来过期无效了不要找我。
Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式
Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式一.序作为这本书的第一章,主席还是把Activity搬上来了,也确实,和Activity打交道的次数基本上是最多的,而且他的内容和知识点也是很多的,非常值得我们优先把他掌握,Activity 中文翻译过来就是”活动”的意思,但是主席觉得这样翻译有些生硬,直接翻译成“界面”可能更好,的确,Activity主要也是用于UI效果的呈现,不过两者翻译都不为过,我们知其意就行了,正常情况下,我们除了Window,Dialog,Toast,我们还能见到的就只有Activity 了,他需要setContentView()去绑定一个视图View作为效果的呈现,然而,作为一本高质量的进阶书。
肯定不会去围绕着入门知识讲解,本章的侧重点在于对Activity使用过程中搞不清楚的概念,生命周期和启动模式已经IntentFilter的匹配规则分析,毕竟Activity在异常状态下的生命周期是多样化的,至于Activity的启动模式和各种各样的Flags,更是让很多人摸不着头脑,还有隐式启动Activity中也有着复杂的Intent匹配过程,所以我们还是一步步的去学习下去,真正的了解Activity这个小家伙!二.Activity的生命周期全面分析Activity的生命周期,本章主要讲解两个方面典型情况下的生命周期异常情况下的生命周期典型情况是指用户参与的情况下,Activity所经过的生命周期的变化,异常情况下的话,就有多种可能了,比如系统回收或者由于当前设备的Configuration发生改变从而导致Activity被销毁重建,异常情况下的生命周期的关注点和典型情况下有些不同,所以要分开来描述才能描述的清楚些1.典型情况下的生命周期分析在正常的情况下,生命周期会经历以下的生命周期onCreate:表示Activity正在被创建,这是生命周期的第一个方法,在这个方法中,我们可以做一些初始化的工作,比如调用onContentView去加载界面布局资源,初始化Activity所需数据等onRestart:表示Activity正在重新启动,一般情况下,当当前Activity从不可见重新变为可见时,onRestart就会被调用,这总情况一般是用户行为所导致的,比如用户按home键切换到桌面或者用户打开了一个新的Activity,这时当前的Activity就会被暂停,也就是onPause 和onStop方法被执行了,接着用户又回到了这个Activity,就会出现这种情况onStart:表示Activity正在被启动,即将开始,这个时候Activity已经可见了,但是还没有出现在前台,还无法和用户交互,这个时候我们可以理解为Activity已经启动了,但是我们还没有看见onResume:表示Activity已经可见了,并且出现在前台,并开始活动了,要注意这个和onStart 的对比,这两个都表示Activity已经可见了,但是onStart的时候Activity还处于后台,onResume的时候Activity才显示到前台onPause:表示Activity正在停止,正常情况下,紧接着onStop就会被调用,在特殊情况下,如果这个时候再快速的回到当前Activity,那么onResume就会被调用,主席的理解是这个情况比较极端,用户操作很难重现这个场景,此时可以做一些数据存储,停止动画等工作,但是注意不要太耗时了,因为这样会影响到新的Activity的显示,onPause必须先执行完,新Activity的onResume才会执行onStop:表示Activity即将停止,同样可以做一些轻量级的资源回收,但是不要太耗时了onDestroy:表示Activity即将被销毁,这是Activity生命周期的最后一个回调,在这里我们可以做一些最后的回收工作和资源释放正常情况下,Activity的常用生命周期用官网的一张图就足够表示了这里附加几个说明1.针对一个特定的Activity,第一次启动,回调如下:onCreate ——> onStart ——> onResume2.当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause ——> onStop ——> 这里有一种特殊的情况就是,如果新的Activity采取了透明的主题的话,那么当前Activity 不会回调onStop3.当用户再次回到原来的Activity,回调如下:onRestart ——> onStart ——> onResume4.d当用户按back键的时候回调如下:onPause ———> onStop ——> onDestroy5.当Activity被系统回收的时候再次打开,生命周期回调方法和1是一样的,但是你要注意一下就是只是生命周期一样,不代表所有的进程都是一样的,这个问题等下回详细分析6.从整个生命周期来说,onCreate和onDestroy是配套的,分别标示着Activity的创建和销毁,并且只可能有一次调用,从Activity是否可见来说,onStart和onStop是配套的,随着用户的操作和设备屏幕的点亮和熄灭,这两个方法可能被调用多次,从Activity是否在前台来说,onResume和onPause是配套的,随着用户操作或者设备的点亮和熄灭,这两个方法可能被多次调用这里提出两个问题1.onStart和onResume,onPause和onStop从描述上都差不多,对我们来说有什么实质性的不同呢?2.假设当前Activity为A,如果用户打开了一个新的Activity为B,那么B的onResume和A 的onPause谁先执行尼?我们先来回答第一个问题,从实际使用过程来说,onStart和onResume,onPause和onStop 看起来的确差不多,甚至我们可以只保留其中的一对,比如只保留onStart和onStop,既然如此,那为什么Android系统还会提供看起来重复的接口呢?根据上面的分析,我们知道,这两个配对的回调分别代表不同的意义,onStart和onStop是从Activity是否可见这个角度来回调的,除了这种区别,在实际的使用中,没有其他明显的区别第二个问题,我们就要从源码的角度来分析以及得到解释了,关于Activity的工作原理会在本书后续章节进行讲解,这里我们大致的了解即可,从Activity的启动过程来看,我们来看一下系统的源码,Activity启动过程的源码相当复杂,设计到了Instrumentation,Activit和ActivityManagerService(AMS),这里不详细分析这一过程,简单理解,启动Activity的请求会由 Instrumentation 来处理,然后他通过Binder向AMS发请求,AMS内部维护着一个ActivityStack,并负责栈内的Activity的状态同步,AMS通过ActivityThread去同步Activity的状态从而完成生命周期方法的调用,在ActivityStack中的resumeTopActivityLnnerLocked方法中,有这么这段代码//we need to start pausing the current activity so the top one can be resumedboolean dontWaitForPause = (.flags& ActivityInfo.FLAG_RESUME_WHILE_PAUSING)!=0;boolean pausing = mStackSupervisor.pauseBackStacks(userLeaving, KeyStore.TrustedCertificateEntry,dontWaitForPause);if(mResumedActivity != null){pausing != startPaUSINGlOCAKED(userLeaving,false,true,dontWaitForPause);if(DEBUG_STA TES){Slog.d(TAG,"resumeTopActivityLocked:pausing" + mResumedActivity);}}从上述的代码中我们可以看出,在新Activity启动之前,栈顶的Activity需要先onPause后,新的Activity才能启动,最终,在ActvityStackSupervisor中的realStartActivityLocked方法中,会调用如下代码app.thread.scheduleLaunchActivity(newIntent(r.intent),r.appToken,System.identityHashCode(r),,newConfiguration(mService.mConfiguration),pat,r.task.voiceInteractor,app.repProcState,r.icicle,r.persistentState,results,new Intents,!andResume,mService.isNextTransitionForward(),profilerInfo);我们都知道,在这个app.thread的类型是IApplicationThread的具体实现实在ActivityTread 中,所以,这段代码实际上遇到了ActivityThread当中,,即ApplicationThread的scheduleLaunchActivity方法,而scheduleLaunchActivity方法最终会完成生命周期的调用过程,因此可以得出结论,是旧Activity县onPause,然后新的Activityy再启动至于ApplicationThread的scheduleLaunchActivity方法为什么会完成新Activity的生命周期,请看接下来的代码,scheduleLaunchActivty为什么会完成新的Activtyprivate void handlerLaunchActivity(ActivityClientRecord r, Intent customIntent){//if we are getting ready to gc after going to the background,well we are back active so skip itunscheduleGcIdler();mSomeActivitiesChanged =true;if(r.profilerInfo != null){mProfiler.setProfiler(r.profilerInfo);mProfiler.startProfiling;}//Make sure we are running with the most recent confighandlerConfigurationChanged(null,null);if(localLOGV)Slog.vTAG,"Handling launch of"+r);//在这里新Activity被创建出来,其onCreate和onStart被调用Activity a = PerformLaunchActivity(r,customIntent);if(a != null){r.createdConfig = new Configuration(mConfiguration);Bundle oldState = r.start;handlerResumeActivity(r.token,false,r.isForward,!r.activity.mFinished && r.startsNotResumed);}//省略...}c从上面的分析可以看出,当新的Activity启动的时候,旧的Activity的onPause方法会先执行,然后才启动新的Activity,到底是不是这样尼?我们可以写一个小栗子来验证一下,如下是两个Activity的代码,在MainActivity中点击按钮可以跳转到SecondActivity,同时为了分析生命周期,我们把log日志也打出来MainActivitypackage com.liuguilin.activitysample;import android.content.Intent;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;public class MainActivity extends AppCompatActivity {public static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);findViewById(R.id.btnTo).setOnClickListener(new View.OnClickListener() { @Overridepublic void onClick(View view) {startActivity(new Intent(MainActivity.this, SecondActivity.class));}});}@Overrideprotected void onPause() {super.onPause();Log.i(TAG, "onPause");}@Overrideprotected void onStop() {super.onStop();Log.i(TAG, "onStop");}}SecondActivitypackage com.liuguilin.activitysample;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.Log;/*** Created by lgl on 16/8/24.*/public class SecondActivity extends AppCompatActivity {private static final String TAG = "SecondActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_second);Log.i(TAG, "onCreate");}@Overrideprotected void onStart() {super.onStart();Log.i(TAG, "onStart");}@Overrideprotected void onResume() {super.onResume();Log.i(TAG, "onResume");}}这样我们可以观察到他的生命周期通过这个生命周期我们可以观察到,旧的Activity的onPause先调用,然后新的Activity才启动,这也证实了我们上面的分析原理,也许有人问,你只是分析了Andorid5.0的源码,你怎么所有的版本源码逻辑都相同,的确,我们不能把所有的版本都概括,但是作为Android 的一个运行过程的基本逻辑,随着版本的更新并不会很大的改变,因为Android也需要兼容性,,不能说在同一个版本上运行有两种不同的逻辑,那根本不可能,关于这一点,我们要把握一个度,就是对于Android的基本运行机制,的不同,Android不能在onPause中做重量级的操作,因为必须在onPause执行完成以后新的Activity才能Resume,从这一点我们也间接性的证明了我们的结论,通过分析这个问题,我们知道onPause和onStop都不能做耗时的操作,尤其是onPause,这也意味着,我们应当尽量的在onStop中做操作,从而使新的Activity尽快显示出来并且换到前后台三.异常情况下的生命周期分析上一节我们分析的是正常事情下的生命周期,但是我们写程序也不要理想化,居多的问题就是出在异常情况下,我们知道,Activity除了受用户操作导致的正常生命周期的调度,同时还会存在一些异常的情况,比如当资源相关的系统配置发生改变以及系统内存不足的时候,Activity就有可能被杀死,下面我们具体来分析下这几种情况1.情况1:资源相关的系统配置发生改变导致Activity被杀死并重新创建理解这个问题,首先要对系统的资源加载有一定的了解,这里就不详细分析系统资源加载的机制了,但是我们简单说明一下,拿最简单的图片来说,当我们把一张图片挡在drawable 中的时候,就可以通过Resources去获取这张图片了,同时为了兼容不同的设备,我们可能还需要在其他一些目录下放置不同的图片,比如drawable-xhdpi之类的,当应用程序启动时,系统会根据当前设备的情况去加载合适的Resources资源,比如说横屏手机和竖屏手机会拿着两张不同的图片(设定了landscape或者portrait状态下的图片),比如之前Activity处于竖屏,我们突然旋转屏幕,由于系统配置发生了改变,在默认情况下,Activity会被销毁并且重新创建,当然我们也可以阻止系统重新创建我们的Activity默认情况下,如果我们的Activity不做特殊处理,那么当系统配置发生改变之后,Activity 就会销毁并且重新创建,可以看图当系统配置发生改变的时候,Activity会被销毁,其onPause,onStop,onDestroy均会被调用,同时由于Activity是异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity 的状态,这个方法调用的时机是在onStop之前,他和onPause没有既定的时序关系,他即可能在onPause之前调用,也有可能在之后调用,需要强调的是,这个方法只出现在Activity 被异常终止的情况下,正常情况下是不会走这个方法的吗,当我们onSaveInstanceState保存到Bundler对象作为参数传递给onRestoreInstanceState和onCreate方法,因此我们可以通过onRestoreInstanceState和onCreate方法来判断Activity是否被重建。
android TV开发教程
封面Android TV开发教程阅读本教程的前提需要android基本.第1章前言当然,本教程没有让你,欲进入TV行业必先自宫的话,因为这不是一本武功秘籍,更不是一本深入android的书籍。
阴错阳差,我进入了AV(android tv)行业.也许很多朋友都是从手机开发转到TV开发,往往会很疑问,TV开发和手机又什么不同,第一点需要知道的是,TV的交互性都是基于遥控器的,虽然鼠标也支持,但是99%的操作性都是在遥控器下完成的(如果你用的无线鼠标,就当我没说过吧~!~!)。
第2章如何使用框架2.1 Android Studio 导入框架教程.新建一个你自己的项目,这里假设你已经回使用AS了,不会使用的话,你只能再去好好学习了.项目就创建好了.选择菜单Import Module导入TV框架.导入的文件是androidtvwidget.导入项目成功的话,会在你创建的项目出现androidtvwidget 的目录.虽然导入了TV项目,但是还是需要去加入TV项目.右键菜单Open Module Settings设置下框架库.点击右侧的绿色+号,选择 Module dependency.可以尝试的写 MainUpView ,看看有没有提示或者不报错,如果没有问题,那你就成功了,可以开始写TV方面的应用了.2.2 Eclipse 导入框架教程.暂时没有教程喔,只能自己拷贝过去吧,有办法的联系我.第3章进入开发的世3.1 TV模拟器的使用这里推荐Genymotion, 天天模拟器.我们这里使用天天模拟器.设置模拟器的分辨率为 1920x1080, 1280x800, 1280x720 来开发.一款合格的TV开发的模拟器,要满足以上两个功能:调节分辨率和 dpi.3.2 一个简单的demo.大家都知道,一切的编程的开头学习都是都从 Hello World 开始.对,我们这里也不例外,我们从button开始,哈哈.希望用这个DEMO带领大家走进android TV开发的大门.。
