android实习报告(共7篇)
实习目的:
生产实习是计算机科学与技术专业重要的实践性教学活动,其目的是使学生们进一步加深对所学知识的理解,理论联系实际,巩固所学有关计算机基础理论知识和基本技能,学习有关计算机最新技术方面的应用,增强学生对计算机在社会生活,社会生产中应用的感性认识,深入了解计算机在各个领域中的应用状况,学生在实习的同时,进行一定的社会实践与调查活动,对于提高学生的综合能力和全面素质具有重要意义。
实习内容:
Android主要有四大组件,分别为:Activity 活动、Service 服务、Broadcast receivers 广播接受者、Content Provider 内容提供者。还有上激活组件Intent。
1.Activity
Activity就是一个用户可以直接接触并看到的窗口,当新建一个Android Project后可以
看到在工程文件下的src中有一个已建好的java类FirstActivity,系统也会自动为他配备一个布局文件main.xml,并在AndroidManifest中对此Activity进行注册。
用户想要自己创建一个Activity,首先创建一个java类继承自Activity,可以为他配备一个布局文件用来显示Activity创建后的布局。最后在主配置文件manifest.xml中对创建的Activity进行注册,这一步是必不可少的,没有注册Activity无法运行。
在manifest.xml中会有许多的Activity,但系统一次只能运行一个Activity,因此必须修选定一个最先运行的Activity。在注册Activity是加入
可指定当前的Activity为主Activity最先被执行。其他Activity可借助激活组件Intent
进行启动。通过Intent还可实现来了两个Activity之间传递数据
Activity具有生命周期,他有三种状态:运行状态、暂停信息和停止状态。运行态是在屏幕台前位于当前任务堆栈的顶部,即获取焦点的Activity。暂停信息是指失去了焦点但对于用户仍可见,此状态下当程序处于低内存是仍有可能被消除。停止状态是指完全被另一个Activity覆盖,但他仍然保留所有的信息与状态。
2.Android图形设计UI
Android UI控件一般写在布局文件中,此次实习所学控件主要有:TextView,EditText
Button、AlertDialog、RadioButton、CheckBox、Spinner和TableRow等。将这些控件及相应的属性写在layout下的布局文件中就可在与其绑定的Activity中显示相应的对话框,文本框,按钮等。
Android的界面布局是为了使控件能够更友好的呈现在用户的眼中。主要有:绝对布局Absolutelayout、线形布局LinearLayout、框架布局FramLayout、相对布局RelativeLayout和
表格布局TableLayout。其中框架布局适合于单张图片的显示。
3.Service 服务
Service事实运行在后台的一段代码。他与Activity一样有相似的生命周期,但不同的是他不能自己运行,必须通过某一个Activity或者其他的Context对象来调用。
Service可通过调用Context.StartService()启动,还可以通过ServiceConnection来访问Service。可以将其他的组件绑定到Service上。
4.数据存储
Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。
openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/”,如果文件不存在,Android 会自动创建它。创建的文件保存在/data/data/
/files目录,如: /data/data/cn.itcast.action/files/itcast.txt,通过点击Eclipse菜单“Window”-“Show View”-“Other”,在对话窗口中展开android文件夹,选择下面的File Explorer视图,然后在File Explorer视图中展开/data/data/
/files目录就可以看到该文件。
openFileOutput()方法的第二参数用于指定操作模式,有四种模式android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data/
/files),其他程序无法访问。除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE,只有这样其他程序才能正确访问。
实习流程:
2月18——2月27日,老师对于ANDROID开发进行了详细的讲解,其内容包括:ANDROID 的背景介绍,发展过程,自身的优势与不足.Android的控件、布局、Activity、Service等一系列基础知识,对整个Android的开发有了大致的了解
2月28日——3月2日: 学生自己开发ANDROID 3GABS项目,老师答疑及验收
实习心得:
时间过的飞快,半个月的实习就要结束了,在这次实习中我们不仅学习了相关的专业知识而且让我对Android系统又有了一个更加深入的了解,它也是我们计算机专业的一个新的方向并且发展很迅速,为了今后的发展我们还需不断努力学习!我国的信息产业还很落后,随着社会的发展和国家的支持,手机上网是社会发展的趋势,到时候手机上网将无处不在!之前我对Android系统的了解之停留在应用的层次上,对于更深层次的了解是很少的,通过这次实习,让我对Android系统有了一个更深层次的了解,同时它页使我意识到无论朝哪个方向发展,主要还是要扎实深刻地学习,同时也得不断努力探索!
IT业发展速度一直都是相当惊人的,不想被社会淘汰,我们就得必须不断地学习,现在的社会不再是一劳永逸,其他行业也是如此,我们必须不断地拿知识来武装自己,不然被淘汰那是肯定的!现在就业难原因其实在于竞争的家具,为了在竞争中得到成功,我们必须时时刻刻学习,还学到了很多做人做事的道理,不仅懂得了要想在计算机这一行立足必须具备扎实的技术理论知识,还必须学会与人沟通,合作的能力,同时更懂得了尝试的重要性,很多事情不是听说是困难的它就是困难的,只有亲自去做亲自去体会才知道,其实它并没有那么困难,这就是实践的重要性!无论做什么事情都必须要坚持,只有坚持下去,才会成功!事在人为,就怕不做!我们不能怕失败,关键是要从失败中总结经验,带着勇气,带着自信,坚持不懈,踏踏实实。这一次的实习是短暂的,但我收获良多。回顾以前所走过的路,太多的无奈和迷茫,这次实习就像是我人生道路上的航标,为我指明了前景的方向,是我对自己的前途充满了信心,我不仅知道了在人生的岔道口更适合朝哪个方向前进!更知道了在今后的道路上怎么去武装自己!
发 大作业报告
姓 名: 学 号: 班 级: 院 系: 日 期:
任课教师:
一、程序的运行环境、安装步骤
1、运行环境 游戏运行环境:Android1.5以上版本
2、程序的组成部份:
2.1、JDK安装
1.我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量: 2.JAVA_HOME值为: D:Program FilesJavajdk1.6.0_18(你安装JDK的目录)3.CLASSPATH值为:.;%JAVA_HOME%libtools.jar;%JAVA_HOME%libdt.jar;%JAVA_HOME%bin;4.Path: 在开始追加 %JAVA_HOME%bin;5.NOTE:前面四步设置环境变量对搭建Android开发环境不是必须的,可以跳过。
安装完成之后,可以在检查JDK是否安装成功。打开cmd窗口,输入java –version 查看JDK的版本信息。出现类似下面的画面表示安装成功了:
2.2、Eclipse安装 2.3、Android SDK安装
在Android Developers下载android-sdk_r05-windows.zip,下载完成后解压到任意路径。运行SDK Setup.exe,点击Available Packages。如果没有出现可安装的包,请点击Settings,选中Misc中的“Force https://...”这项,再点击Available Packages。
选择希望安装的SDK及其文档或者其它包,点击Installation Selected、Accept All、Install Accepted,开始下载安装所选包
在用户变量中新建PATH值为:Android SDK中的tools绝对路径(本机为D:AndroidDevelopandroid-sdk-windowstools)。image图
2、设置Android SDK的环境变量
“确定”后,重新启动计算机。重启计算机以后,进入cmd命令窗口,检查SDK是不是安装成功。
运行 android –h 如果有类似以下的输出,表明安装成功:
图
3、验证Android SDK是否安装成功
2.4、ADT安装
打开 Eclipse IDE,进入菜单中的 “Help”-> “Install New Software” 点击Add...按钮,弹出对话框要求输入Name和Location:Name自己随便取,Location输入http://dl-ssl.google.com/android/eclipse。如下图所示:
确定返回后,在work with后的下拉列表中选择我们刚才添加的ADT,我们会看到下面出有Developer Tools,展开它会有Android DDMS和Android Development Tool,勾选他们。如下图所示:
然后就是按提示一步一步next。完成之后:
选择Window > Preferences...在左边的面板选择Android,然后在右侧点击Browse...并选中SDK路径,本机为:
D:AndroidDevelopandroid-sdk-windows点击Apply、OK。配置完成。2.5、创建AVD 为使Android应用程序可以在模拟器上运行,必须创建AVD。
1、在Eclipse中。选择Windows > Android SDK and AVD Manager
2、点击左侧面板的Virtual Devices,再右侧点击New
3、填入Name,选择Target的API,SD Card大小任意,Skin随便选,Hardware目前保持默认值
4、点击Create AVD即可完成创建AVD 注意:如果你点击左侧面板的Virtual Devices,再右侧点击New,而target下拉列表没有可选项时,这时候你:
点击左侧面板的Available Packages,在右侧勾选https://dl-ssl.google.com/android/repository/repository.xml,如下图所示:
然后点击Install Selected按钮,接下来就是按提示做就行了
要做这两步,原因是在1.3、Android SDK安装中没有安装一些必要的可用包(Available Packages)。2.5、创建Android工程
三、程序开发平台
(1)代码行数:1000
(2)开发环境:Android Developer Tools Build: v22.6.2-1085508
apache-ant-1.9.3
四、程序功能说明:
单机屏幕按住不放可以拖动魔方转动,魔方上下左右空白处可以转动魔方相对那一面。
五、应用核心源码
class MFtestSurfaceView extends GLSurfaceView {
private MFtestRenderer mRenderer;
private float mPreviousX;
private float mPreviousY;//上一次的点
private float mDownPreviousX;
private float mDownPreviousY;//上一次的Down点
// private int oldDownX;
// private int
private float theta;
private float fai;//球坐标
public MFtestSurfaceView(Context context){
super(context);
theta=(float)3.14159/4;
fai=(float)3.14159/4;
// Set the Renderer for drawing on the GLSurfaceView
mRenderer = new MFtestRenderer();
setRenderer(mRenderer);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
}
@Override
public boolean onTouchEvent(MotionEvent e){
// MotionEvent reports input details from the touch screen
// and other input controls.In this case, you are only
// interested in events where the touch position changed.float x = e.getX();
float y = e.getY();
switch(e.getAction()){
case MotionEvent.ACTION_MOVE://如果是 移动的话
float dx = xmPreviousY;//x,y的变换值(不是0,就是1)
float te=theta;
theta=theta+dy/100;//角度是弧度值
if(!(theta>0&&theta<3.14159))
{
theta=te;//法线始终向上
}
fai=fai+ dx/100;
//x=rsinθcosφ
mRenderer.eyez=(float)(3*Math.sin(theta)*Math.cos(fai));
//y=rsinθsinφ
mRenderer.eyex=(float)(3*Math.sin(theta)*Math.sin(fai));
////z=rcosθ
利用球坐标使观察点始终维持在半径为3的球上
mRenderer.eyey=(float)(3*Math.cos(theta));
requestRender();
//System.out.println(x+“
”+y);
break;
case MotionEvent.ACTION_DOWN:
mDownPreviousX=x;
mDownPreviousY=y;
break;
case MotionEvent.ACTION_UP:
if((((x-mDownPreviousX)>-5)&&((x-mDownPreviousX)<5))&&(((y-mDownPreviousY)>-5)&&((y-mDownPreviousY)<5)))//(((x-mDownPreviousX)>-3)||((x-mDownPreviousX)>-3))&&(((y-mDownPreviousY)>-3)||((y-mDownPreviousY)>-3))
{
//System.out.println(x-mDownPreviousX);
if(x
<(mRenderer.width*(1-Math.sqrt(18)/6)/2))
{
//左
//System.out.println(x+“
左
”+y);
mRenderer.action = 1;
DrawAnimation();
}
else if(x
>
mRenderer.width-(mRenderer.width*(1-Math.sqrt(18)/6)/2))
{
//右
//System.out.println(x+“
右
”+y);
mRenderer.action = 2;
DrawAnimation();
}
else if(y
<
mRenderer.height/2.0-!)
switch(mRenderer.action){
case 1:
if((mRenderer.eyex > 0)&&(mRenderer.eyez > 0)){
mRenderer.move=76;
}
else if((mRenderer.eyex > 0)&&(mRenderer.eyez < 0)){
mRenderer.move=70;
}
else if((mRenderer.eyex < 0)&&(mRenderer.eyez < 0)){
mRenderer.move=82;
}
else if((mRenderer.eyex < 0)&&(mRenderer.eyez > 0)){
mRenderer.move=66;
}
break;
case 2:
if((mRenderer.eyex > 0)&&(mRenderer.eyez > 0)){
mRenderer.move=66;
}
else if((mRenderer.eyex > 0)&&(mRenderer.eyez < 0)){
mRenderer.move=76;
}
else if((mRenderer.eyex < 0)&&(mRenderer.eyez < 0)){
mRenderer.move=70;
}
else if((mRenderer.eyex < 0)&&(mRenderer.eyez > 0)){
mRenderer.move=82;
}
break;
case 3:
mRenderer.move=85;
break;
case 4:
mRenderer.move=68;
break;
}
}
private void memcpy(int one,int two){
mRenderer.face_color[one]=mRenderer.face_color[two];
mRenderer.face_color[one+1]=mRenderer.face_color[two+1];
mRenderer.face_color[one+2]=mRenderer.face_color[two+2];
}
private void LeftShift(int a,int b,int c,int d){
// a
float temp1=mRenderer.face_color[a];
float temp2=mRenderer.face_color[a+1];
float temp3=mRenderer.face_color[a+2];
memcpy(a,b);
memcpy(b,c);
memcpy(c,d);
mRenderer.face_color[d]= temp1;
mRenderer.face_color[d+1]=temp2;
mRenderer.face_color[d+2]=temp3;
} }
private void DrawRotation(GL10 gl){
// 绘制小立方体
switch(move){ case 70: DrawCube19(gl);DrawCube11(gl);DrawCube2(gl);DrawCube22(gl);DrawCube13(gl);DrawCube5(gl);DrawCube25(gl);DrawCube16(gl);DrawCube8(gl);DrawCube18(gl);DrawCube10(gl);DrawCube1(gl);DrawCube21(gl);DrawCube4(gl);DrawCube24(gl);DrawCube15(gl);
gl.glPushMatrix();gl.glRotatef(-angle,0.0f,0.0f,1.0f);DrawCube0(gl);DrawCube9(gl);DrawCube17(gl);DrawCube3(gl);DrawCube12(gl);DrawCube20(gl);DrawCube6(gl);DrawCube14(gl);
DrawCube7(gl);
DrawCube23(gl);
gl.glPopMatrix();break;case 66: DrawCube0(gl);DrawCube9(gl);DrawCube17(gl);DrawCube3(gl);DrawCube12(gl);DrawCube20(gl);DrawCube6(gl);DrawCube14(gl);
DrawCube23(gl);DrawCube18(gl);DrawCube10(gl);DrawCube1(gl);
DrawCube21(gl);DrawCube4(gl);DrawCube24(gl);DrawCube15(gl);DrawCube7(gl);
gl.glPushMatrix();
gl.glRotatef(angle,0.0f,0.0f,1.0f);
DrawCube19(gl);DrawCube11(gl);DrawCube2(gl);DrawCube22(gl);
DrawCube13(gl);DrawCube5(gl);DrawCube25(gl);DrawCube16(gl);DrawCube8(gl);
gl.glPopMatrix();
break;
case 85:
DrawCube3(gl);DrawCube23(gl);DrawCube24(gl);DrawCube25(gl);
DrawCube4(gl);DrawCube5(gl);DrawCube6(gl);DrawCube7(gl);
DrawCube8(gl);DrawCube12(gl);DrawCube13(gl);DrawCube14(gl);
DrawCube15(gl);DrawCube16(gl);DrawCube20(gl);DrawCube21(gl);DrawCube22(gl);
gl.glPushMatrix();
gl.glRotatef(-angle,0.0f,1.0f,0.0f);
DrawCube0(gl);DrawCube1(gl);DrawCube2(gl);DrawCube9(gl);
DrawCube10(gl);DrawCube11(gl);DrawCube17(gl);DrawCube18(gl);DrawCube19(gl);
gl.glPopMatrix();
break;
case 68:
DrawCube0(gl);DrawCube1(gl);DrawCube2(gl);DrawCube3(gl);
DrawCube4(gl);DrawCube5(gl);DrawCube9(gl);DrawCube10(gl);
DrawCube11(gl);DrawCube12(gl);DrawCube13(gl);DrawCube17(gl);
DrawCube18(gl);DrawCube19(gl);DrawCube20(gl);DrawCube21(gl);DrawCube22(gl);
gl.glPushMatrix();
gl.glRotatef(angle,0.0f,-1.0f,0.0f);
DrawCube6(gl);DrawCube7(gl);DrawCube8(gl);DrawCube14(gl);
DrawCube15(gl);DrawCube16(gl);DrawCube23(gl);DrawCube24(gl);DrawCube25(gl);
gl.glPopMatrix();
break;
case 82:
DrawCube9(gl);DrawCube10(gl);DrawCube11(gl);DrawCube25(gl);
DrawCube12(gl);DrawCube13(gl);DrawCube14(gl);DrawCube15(gl);
DrawCube16(gl);DrawCube17(gl);DrawCube18(gl);DrawCube19(gl);
DrawCube20(gl);DrawCube21(gl);DrawCube22(gl);DrawCube23(gl);DrawCube24(gl);
gl.glPushMatrix();
gl.glRotatef(-angle,1.0f,0.0f,0.0f);
DrawCube0(gl);DrawCube1(gl);DrawCube2(gl);DrawCube3(gl);
DrawCube4(gl);DrawCube5(gl);DrawCube6(gl);DrawCube7(gl);DrawCube8(gl);
gl.glPopMatrix();
break;
case 76:
DrawCube0(gl);DrawCube1(gl);DrawCube2(gl);DrawCube3(gl);
DrawCube4(gl);DrawCube5(gl);DrawCube6(gl);DrawCube7(gl);
DrawCube8(gl);DrawCube9(gl);DrawCube10(gl);DrawCube11(gl);
DrawCube12(gl);DrawCube13(gl);DrawCube14(gl);DrawCube15(gl);DrawCube16(gl);
gl.glPushMatrix();
gl.glRotatef(-angle,-1.0f,0.0f,0.0f);
DrawCube17(gl);DrawCube18(gl);DrawCube19(gl);DrawCube20(gl);
DrawCube21(gl);DrawCube22(gl);DrawCube23(gl);DrawCube24(gl);DrawCube25(gl);
gl.glPopMatrix();
break;
default:
break;
}
六、工程运行效果截图
10月20日 查找Android开发的配置及流程 10月22日 查找资料确定要使用的算法与数据结构 10月23日 系统设计 10月24日 开始编码
10月28日 游戏基本功能完成,进入测试阶段 11月2日 程序开发完成,编写文档
八、总结
刚开始接触Android感觉到它很有意思,在界面开发上和web也可以形成了相通的架构,更加方便,视觉上也是非常的酷,在前期我通过的大量的Android SDK开发范例大全中的例子以及Android提供的APIDEMOS进行学习,尽管例子之间的连接比较零散,不过通过这些例子的学习我可以学习到了很多和以前java上相通的思想,因为Android在现在也是全新的技术和框架,在其中我也学到了如何用单例模式、工厂模式等常用的设计模式进行学习,通过API进行开发客户端,对Request发送,Response处理中通过比较方便的JSON对象传输,以及对XML、JSON、图片、业务等下载处理,对API接口调用等问题处理。
首先在界面上,我们同样可以通过不同布局进行设计非常酷的界面,这些界面可以通过include进行引入,和jsp、html也有相通的地方,同样在android上可以用到自定义的样式这和css也有比较相通的地方,我们可以通过一些公用的方法写个BaseActivity这个基类,通过继承方式比较不错的实现了Activity的界面,因为这样你可以Header(头部)和Footer(尾部)进行处理一些触发事件或者特效等。布局模式以相对模式为主,线线布局模式可以在比较简单的include进行完成,最重要的一点就是:我们可以自己通过重写方法或者通过实现View或者Layout等类进行扩充项目需
要的布局(或者控件),在学习界面中,我发现Android为我们提供了很好的类似反射机制,通过Layout文件夹下的配置文件,可以快速的形成界面,在配置文件可以设置属性或者样式都是很快捷方便。对比较特殊的界面也可以通过处理嵌入到指定的界面,同样你可以通过java代码直接创建View进行添加,不过这种方式比较复杂。对一些点击、选中、按键等处理的事件,界面之间的 跳转Intent管理,通过Bundle对数据在界面之间进行传输。
Android的界面显示同样也是基于控件的。通常是用View(包括ViewGroup)控件配上XML的样式来做的。具体细节不想说了,可以参考 Samples里的ApiDemos/View,和View的Doc,以及Implementing a UI这篇Doc。其他还有很多,感觉算是SDK讲述的最多的内容。从控件的使用上,和网页的设计类似,尽量用parent_width之类的抽象长度,用Theme来做风格,抽取所有的字串等信息做本地化设计。相关内容参看Implementing a UI就好。
一类比较重要的是数据绑定控件。如果做过ASP.Net会从中看到很多类似的地方。一个支持数据绑定的控件,比如ListView。可以通过一个 ListAdapter绑定到一个数据源上。ListAdapter是一个抽象类,主要的实现类包括SimpleAdapter和 SimpleCursorAdapter。前者是绑定一个静态的Array,后者是绑定一个动态的Cursor。Cursor前面说过,是一个指向数据源的随机迭代器,将View绑定到Cursor通常要设置这样几个参数。一个是每一行的样式,称作Row Layout,其实就是一个普通的Layout的XML文件。还有就是一个列和现实控件的对应关系。那个控件显示哪个列的值,这是需要配置的。为了定制一个良好的数据显示控件,最简单你可以定制很PP的Row Layout,复杂一点就是可以重载绑定控件View,或者是适配器ListAdapter。如果是一个数据显示密集的应用,且你对UI有些追求,这个工作估计是必不可少的。
一个主要用于显示数据内容的Activity,可以选择派生自ListActivity。它提供了一个具有
ListView 的Layout,还有
simple_list_item_1, simple_list_item_2, two_line_list_item等默认的Row Layout,还有一些比较不错的API,和可供响应选择Item的事件。可以满足你比较基础的需求。如果你觉得只有一个ListView的界面太突兀,你可以为这个ListActivity指定一个Layout,需要注意的是,你需要提供一个id为@android:id/list的ListView控件,避免Activity在内部偷偷寻找该控件的时候失败。
腾讯科技讯 据外媒报道,根据移动设备诊断和商业情报领导者Blancco公司近日发布的第三季度报告,苹果iOS系统的全球故障率上升到62%,该系统被认为是第三季度性能最差的移动操作系统。有趣的是,该公司的报告亦称,苹果iOS的故障率明显高于Android,后者的故障率只有47%。Blancco是在测试和分析了从全球数百万设备收集的数据之后得出该结论的。
这份报告的标题是“20第三季度移动设备性能和健康趋势报告”,发布于11月中旬。全球的媒体,无论是线上还是线下媒体,都争相恐后抢先报道,但它们都没有检查这份报告的数据的真实性。
当下,媒体的盲目性已经深入骨髓,记者和编辑轻信任何摆在他们面前的东西,一切都向着广告商的钱看。在内容筛查上的疏忽导致上百家出版商――包括Android Authority、Android Headlines、BGR、PhoneArena、PR Newswire、Digit和雅虎等知名品牌――报道了错误的信息,指责苹果iOS系统存在高故障率。
令人怀疑的iOS和Android故障率报告
Blancco在上周发布的报告中着重指出,iOS系统在年第三季度的故障率明显上升。根据这份报告,iOS设备的故障率从2016年第二季度的58%上升到第三季度的62%,增长4%。该公司直言不讳地指出,iPhone和iPad发生故障的几率几乎是Android设备的两倍。
乍一看,这些数据是基于数百万部设备发送的.故障报告得出的,没有任何问题。但在对这份报告中的数字逐条进行分析之后,报告的真实性就很可疑了。
该报告用图表列出了第三季度故障率最高的10款iOS设备。每款设备的故障率是按占iOS设备总故障率(62%)的百分比计算的。如果将这10款设备的故障率全部相加,得出结果是50%。因此,其余的iOS设备的故障率加起来必须是剩下的50%。这是不可能的,因为除了这10款设备之外,市场上只有4-5款iOS设备在售。这些设备的故障率都没有大于1%。
这还不是这份报告唯一一处让人感到怀疑的调查结果。
我们还注意到,“2016年第三季度故障率最高的10款iOS设备”和“2016年第三季度故障率最高的10款Android设备”的故障率数字也存在问题。
看下面的图片,你发现有什么可疑的地方了吗?如果没有,你再横向比较一下两边设备的故障率。数字是完全一样的!
所有这些让我们深深怀疑这份报告的调查结果。
哪个操作系统的故障率最高――iOS还是Android?
是iOS的整体故障率错了吗?如果没有,那么我们转到下一个问题!
Android的整体故障率是否有错误?
前10款iOS设备的故障率是否有错误? 如果没有,我们立即接着问――
前10款Android设备的故障率是否有错误?
原先故障率为58%,增长4%之后,结果是62%?(数学是体育老师教的!)
互联网信息来源:福兮祸兮?
我们一直在说“互联网拥有所有的信息和资源”。确实是这样,没有什么是在互联网上找不到的。我们只需点一下鼠标,就能获得所需的信息。然而,网上的信息都准确可靠吗?
互联网用户需要且理应获得逻辑正确、数据驱动的丰富内容,以做出正确的决定。这意味着我们迫切需要内容撰写者和分析师。可悲的是,任何掌握良好英语写作技能的人都会考虑成为内容作者。另一方面,为了发布更
iOS设备故障率明显比Android高?Blancco报告太不靠谱多能吸引读者的内容,媒体公司和博客网站都在鼓动内容作者成为分析师。尽管他们在内容中添加了大量数据,但这种双重角色的结果是,他们的文章经常充斥着大量不正确的数据,误导性内容,甚至完全错误的信息。出版商们都急于转发网上出现的任何信息。它们太注重抢先于同行发布新闻,以致于忽视了这样做可能造成的深刻危害。向数百万读者提供错误信息只是整个互联网社区垮掉的开端。
这个想必大家并不陌生吧,该文件就是 java 类对应的 头文件,当然如果你比较厉害的话可以不用这样生成,自己敲代码完成也行;反正我是不行。
如下,建立文件夹:
拷贝之前的文件进去:
分别实现:
net_qiujuer_ndkdemo_jni_MathKit.cpp
#includeJNIEXPORT jint JNICALL Java_net_qiujuer_ndkdemo_jni_MathKit_square (JNIEnv *env, jclass cls, jint num) { return num*num; }net_qiujuer_ndkdemo_jni_StringKit.cpp
1.安装下载编译器和链接器软件.Sourcery G++ Lite Edition for ARM.
arm-none-linux-gnueabi-gcc.exe是编译命令
bin/arm-none-linux-gnueabi-ld.exe是链接命令
2.编写C代码
为了演示方便编写最简单的代码,输出hello,world,例如:我在d:/temp目录写建立hello.c文件
#include
int main{
printf(“helloworld ”);
return 0;
}
3.编译hello.c文件
cmd---d:/---cd temp进入temp目录下arm-none-linux-gnueabi-gcc hello.c -static -o hello,在目录中生成hello二进制文件
4.将hello文件push到手机
启动模拟器---adb push hello /data/data/hello
5.修改属性
adb shell
cd /data/data/
chmod 777 hello
将hello修改为可执行文件
6.执行文件
./hello
7.显示
activity主要生命周期的方法说明:
onCreate(Bundle savedInstanceState):创建activity时调用。设置在该方法中,还以Bundle的形式提供对以前储存的任何状态的访问!
onStart():activity变为在屏幕上对用户可见时调用。
onResume():activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。
onPause():activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧!
onStop():activity被停止并转为不可见阶段及后续的生命周期事件时调用。
onRestart():重新启动activity时调用。该活动仍在栈中,而不是启动新的活动。
onDestroy():activity被完全从系统内存中移除时调用,该方法被
2.横竖屏切换时候activity的生命周期
3.android中的动画有哪几类,它们的特点和区别是什么
两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
{Android的animation由四种类型组成 XML中
alpha 渐变透明度动画效果 scale渐变尺寸伸缩动画效果
translate 画面转换位置移动动画效果 rotate 画面转移旋转动画效果
JavaCode中
AlphaAnimation ScaleAnimation 渐变透明度动画效果 渐变尺寸伸缩动画效果
TranslateAnimation画面转换位置移动动画效果 RotateAnimation 画面转移旋转动画效果
Android动画模式
Animation主要有两种动画模式: 一种是tweened animation(渐变动画)XML中 JavaCode alpha AlphaAnimation scaleScaleAnimation
一种是frame by frame(画面转换动画)XML中 JavaCode translate TranslateAnimation rotate RotateAnimation
}
4.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
5.说说activity,intent,service是什么关系
[教程] 新手入门之应用解析(Activity、Intent、Service等)
Activity, Intent, Service, IntentReceiver, ContentProvider 一般刚开始学Android时对这些基本的东西还是要明确一下的,下面的东西摘自新版android开发教程里面的,介绍比较简单,希望能够有帮助。
一、Activity
Activity是android中最今本的应用程序组件,应用程序中,一个Activity通常是一个单独的屏幕,每一个Activity都被实现为一个单独的类,这些类都是从Activity基类中继承来的,Activity类会显示由视图控件组成的用户接口,并对视图控件的事件做出响应。一个复杂的应用是由多个屏幕显示组成。这里每一个屏幕的显示就是一个Activity,从一个屏幕的显示到另一个新屏幕的显示并完成相关的事件是很容易实现的,这些屏幕Activity是相互交互的,他们直接通信从而完成相应的功能。当一个新的屏幕打开时,前一个屏幕将会暂停,并保存在历史堆栈中,用户可以从历史堆栈中返回前一个屏幕。当屏幕不再使用时,我们可以从历史堆栈中删除它,默认情况下,Android会保留从主屏幕到每一个应用的运行屏幕。Activity代表一个用户所能看到的屏幕,Activity主要是处理一个应用的整体性工作,如监听系统事件(按键、触摸屏幕等)、为用户显示指定的View、启动其他Activity等,其他的Activity继承Activity基类后,通过重写父类的方法来实现各种功能。
二、Intent
Android专有类Intent的调用是用来进行架构屏幕之间的切换的。Intent是描述应用想要做什么。Intent数据结构中两个最重要的部分是动作和动作对应的数据,典型的动作类型有:Main(活动的门户)、View、Pick、Edit等,而动作对应的数据是应URI的形式进行表示的,这里的URI就相当于这些动作的ID,一个动作对应一个动作数据。Android使用了Intent这个特殊类,实现在屏幕与屏幕之间的移动。Intent类用用来描述一个应用将会做什么事情。与之有关系的一个类叫IntentFilter类,相对于intent是一个有效的做事情的请求,一个IntentFilter则用于描述一个Activity(或者IntentReceiver)能够操作那些intent。一个Activity如果要显示一个人的联系方式时,需要事先声明一个IntentFilter,这个IntentFilter要知道怎么去处理View动作和表示一个人的URI,IntentFilter需要AndroidManifest.xml中 定义,如AndroidManifest.xml中的:
通过解析各种intent,从一个屏幕导航到另一个屏幕是很简单的。当向前导航时,activity 将会调用startActivity(IntentmyIntent)方法。然后,系统会在所有安装的应用程序中定义的IntentFilter 中查找,找到最匹配myIntent 的Intent 对应的activity。新的activity 接收到myIntent 的通知后,开始运行。当startActivity 方法被调用将触发解析myIntent 的动作,这个机制提供了两个关键好处:
A、Activities 能够重复利用从其它组件中以Intent 的形式产生的一个请求;
B、Activities 可以在任何时候被一个具有相同IntentFilter 的新的Activity 取代。
三、IntentReceiver
当你希望你的应用能够对一个外部的事件(如当电话呼入时,或者数据网络可用时,或者到了晚上时)做出响应,你可以使用一个IntentReceiver。虽然IntentReceiver 在感兴趣的事件发生时,会使用NotificationManage通知用户,但它并不能生成一个UI。IntentReceiver 在AndroidManifest.xml 中注册,但也可以在代码中使用Context.registerReceiver()进行注册。当一个intentreceiver 被触发时,你的应用不必对请求调用intentreceiver,系统会在需要的时候启动你的应用。各种应用还可以通过使用Context.broadcastIntent()将它们自己的intentreceiver 广播给其它应用程序。
四、Service
一个Service 是一段长生命周期的,没有用户界面的程序。比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲。然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的。在这个例子中,媒体播放器这个activity 会使用Context.startService()来启动一个service,从而可以在后台保持音乐的播放。同时,系统也将保持这个service 一直执行,直到这个service 运行结束。另外,我们还可以通过使用Context.bindService()方法,连接到一个service 上(如果这个service 还没有运行将启动它)。当连接到一个service 之后,我们还可以service 提供的接口与它进行通讯。拿媒体播放器这个例子来说,我们还可以进行暂停、重播等操作。
五、Content Provider
Android 应用程序能够将它们的数据保存到文件、SQLite 数据库中,甚至是任何有效的设备中。当你想将你的应用数据与其它的应用共享时,内容提供器就可以发挥作用了。因为内容提供器类实现了一组标准的方法,从而能够让其它的应用保存或读取此内容提供器处理的各种数据类型。数据是应用的核心。在Android 中,默认使用鼎鼎大名的SQLite 作为系统DB。但是在Android 中,使用方法有点小小的不一样。在Android 中每一个应用都运行在各自的进程中,当你的应用需要访问其他应用的数据时,也就需要数据在不同的虚拟机之间传递,这样的情况操作起来可能有些困难(正常情况下,你不能读取其他的应用的db 文件),ContentProvider 正是用来解决在不同的应用包之间共享数据的工具。
1、所有被一个Android 应用程序创建的偏好设置,文件和数据库都是私有的。
6.android中线程与线程,进程与进程之间如何通信
1、一个 Android 程序开始运行时,会单独启动一个Process。
默认情况下,所有这个程序中的Activity或者Service都会跑在这个Process。
默认情况下,一个Android程序也只有一个Process,但一个Process下却可以有许多个
Thread。
2、一个 Android 程序开始运行时,就有一个主线程Main Thread被创建。该线程主要负责UI界面的显示、更新和控件交互,所以又叫UI Thread。
一个Android程序创建之初,一个Process呈现的是单线程模型--即Main Thread,所有的任务都在一个线程中运行。所以,Main Thread所调用的每一个函数,其耗时应该越短越好。而对于比较费时的工作,应该设法交给子线程去做,以避免阻塞主线程(主线程被阻塞,会导致程序假死现象)。
3、Android单线程模型:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。如果在子线程中直接修改UI,会导致异常。
Android中Handler、Thread(HanlderThread)、Runnable之间的关系
首先说明Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。而Runnable是一个接口,Thread是Runnable的子类。所以说,他俩都算一个进程。HandlerThread顾名思义就是可以处理消息循环的线程,他是一个拥有Looper的线程,可以处理消息循环。与其说Handler和一个线程绑定,不如说Handler是和Looper一一对应的。最后需要说明的是,在UI线程(主线程)中: mHandler=new Handler();mHandler.post(new Runnable(){ void run(){ //执行代码...} });这个线程其实是在UI线程之内运行的,并没有新建线程。
常见的新建线程的方法是: Thread thread = new Thread();thread.start();HandlerThread thread = new HandlerThread(“string”);thread.start();
7.widget相对位置的完成在antivity的哪个生命周期阶段实现
onStart
8.说说mvc模式的原理,它在android中的运用 : MVC(Model_view_contraller)”模型_视图_控制器”。MVC 应用程序总是由这三个部分组成。Event(事件)导致 Controller改变 Model 或View,或者同时改变两者。只要 Controller改变了 Models 的数据或者属性,所有依赖的 View 都会自动更新。类似的,只要 Controller改变了 View,View会从潜在的 Model 中获取数据来刷新自己。
9.说说在android中有哪几种数据存储方式
在Android中,可供选择的存储方式有SharedPreferences、文件存储、SQLite数据库方式、内容提供器(Content provider)和网络
10.android中有哪几种解析xml的类,官方推荐哪种?以及它们的原理和区别
DOM、SAX(Simple API for XML)、XmlPullParser
11.listview你是怎么优化的。
Adapter的作用就是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View。想过没有? 在我们的列表有1000000项时会是什么样的?是不是会占用极大的系统资源?
先看看下面的代码:
public View getView(int position, View convertView, ViewGroup parent){
View item = mInflater.inflate(R.layout.list_item_icon_text, null);
((TextView)item.findViewById(R.id.text)).setText(DATA[position]);
((ImageView)item.findViewById(R.id.icon)).setImageBitmap((position & 1)== 1 ? mIcon1 : mIcon2);
return item;
}
怎么样?如果超过1000000项时,后果不堪设想!您可千万别这么写!
我们再来看看下面的代码:
public View getView(int position, View convertView, ViewGroup parent){
if(convertView == null){
convertView = mInflater.inflate(R.layout.item, null);
}
((TextView)convertView.findViewById(R.id.text)).setText(DATA[position]);
((ImageView)convertView.findViewById(R.id.icon)).setImageBitmap((position & 1)== 1 ? mIcon1 : mIcon2);
return convertView;
}
怎么样,上面的代码是不是好了很多?系统将会减少创建很多View。性能得到了很大的提升。
还有没有优化的方法呢? 答案是肯定的:
public View getView(int position, View convertView, ViewGroup parent){
ViewHolder holder;
if(convertView == null){
convertView = mInflater.inflate(R.layout.list_item_icon_text, null);
holder = new ViewHolder();
holder.text =(TextView)convertView.findViewById(R.id.text);
holder.icon =(ImageView)convertView.findViewById(R.id.icon);
convertView.setTag(holder);
} else {
holder =(ViewHolder)convertView.getTag();
}
holder.text.setText(DATA[position]);
holder.icon.setImageBitmap((position & 1)== 1 ? mIcon1 : mIcon2);
return convertView;
}
static class ViewHolder {
TextView text;
ImageView icon;
}
怎么样?会不会又给您的系统带来很大的提升呢?看看下面三种方式的性能对比图您就知道了!
12.view的刷新
Android中对View的更新有很多种方式,使用时要区分不同的应用场合。我感觉最要紧的是分清:多线程和双缓冲的使用情况。
1.不使用多线程和双缓冲
这种情况最简单了,一般只是希望在View发生改变时对UI进行重绘。你只需在Activity中显式地调用View对象中的invalidate()方法即可。系统会自动调用 View的onDraw()方法。
2.使用多线程和不使用双缓冲
这种情况需要开启新的线程,新开的线程就不好访问View对象了。强行访问的话会报:android.view.ViewRoot$CalledFromWrongThreadException:Only the original thread that created a view hierarchy can touch its views.这时候你需要创建一个继承了android.os.Handler的子类,并重写handleMessage(Message msg)方法。android.os.Handler是能发送和处理消息的,你需要在Activity中发出更新UI的消息,然后再你的Handler(可以使用匿名内部类)中处理消息(因为匿名内部类可以访问父类变量,你可以直接调用View对象中的invalidate()方法)。也就是说:在新线程创建并
发送一个Message,然后再主线程中捕获、处理该消息。
3.使用多线程和双缓冲
Android中SurfaceView是View的子类,她同时也实现了双缓冲。你可以定义一个她的子类并实现SurfaceHolder.Callback接口。由于实现SurfaceHolder.Callback接口,新线程就不需要android.os.Handler帮忙了。SurfaceHolder中lockCanvas()方法可以锁定画布,绘制玩新的图像后调用unlockCanvasAndPost(canvas)解锁(显示),还是比较方便得。
13.IPC及原理
什么是Android操作系统,所谓的Android:是基于Linux内核的软件平台和操作系统,早期由Google开发,后由开放手机联盟Open Handset Alliance)开发。
Linux系统中进程间通信的方式有:socket, named pipe,message queque, signal,share memory。Java系统中的进程间通信方式有socket, named pipe等。android应用程序理所当然可以应用JAVA的IPC
机制实现进程间的通信,取而代之的是Binder通信。Google为什么要采用这种方式呢,这取决于Binder通信方式的高效率。Binder通信是通过linux的binder driver来实现的。Binder通信操作类似线程迁移(thread migration),两个进程间IPC看起来就象是一个进程进入另一个进程执行代码然后带着执行的结果返回。Binder的用户空间为每一个进程维护着一个可用的线程池,线程池用于处理到来的IPC以及执行进程本地消息,Binder通信是同步而不是异步。Android中的Binder通信是基于Service与Client的,所有需要IBinder通信的进程都必须创建一个IBinder接口。
系统中有一个进程管理所有的system service,Android虚拟机不允许用户添加非授权的System service,当然现在源码开发了,我们可以修改一些代码来实现添加底层system Service的目的。
对用户程序来说,我们也要创建server,或者Service用于进程间通信,这里有一ActivityManagerService管理JAVA应用层所有的service创建与连接(connect)。disconnect,所有的 Activity也是通过这个service来启动,加载的。ActivityManagerService也是加载在Systems Servcie中的。
Android虚拟机启动之前系统会先启动service Manager进程,service Manager打开binder驱动,并通知binder kernel驱动程序这个进程将作为System Service Manager。然后该进程将进入一个循环,等待处理来自其他进程的数据。用户创建一个System service后,通过defaultServiceManager得到一个
远程ServiceManager的接口。
通过这个接口我们可以调用 addService函数将System service添加到Service Manager进程中,然后client可以通过getService获取到需要连接的目的Service的IBinder对象。这个IBinder是 Service的BBinder在binder kernel的一个参考,所以service IBinder 在binder kernel中不会存在相同的两个
IBinder对象。
每一个Client进程同样需要打开Binder驱动程序。对用户程序而言,我们获得这个对象就可以通过binder kernel访问service对象中的方法。Client与Service在不同的进程中,通过这种方式实现了类似线程间的迁移的通信方式,对用户程序而言当调用Service返回的IBinder接口后,访问Service中的方法就
如同调用自己的函数。实现接口时有几个原则:
抛出的异常不要返回给调用者.跨进程抛异常处理是不可取的。IPC调用是同步的。如果你知道一个IPC服务需要超过几毫秒的时间才能完成地话,你应该避免在Activity的主线程中调用。
也就是IPC调用会挂起应用程序导致界面失去响应.这种情况应该考虑单起一个线程来处理,能在AIDL接口中声明静态属性。IPC的调用步骤:
1.声明一个接口类型的变量,该接口类型在.aidl文件中定义。
2.实现ServiceConnection。
3.调用ApplicationContext.bindService(),并在ServiceConnection实现中进行传递.4.在ServiceConnection.onServiceConnected()实现中,你会接收一个IBinder实例(被调用的Service).调用 YourInterfaceName.Stub.asInterface((IBinder)service)将参数转换YourInterface类型。
5.调用接口中定义的方法。你总要检测到DeadObjectException异常,该异常在连接断开时被抛
出。它只会被远程方法抛出。
6.断开连接,调用接口实例中的ApplicationContext.unbindService()
14.Android多线程
在Android下面也有多线程的概念,在C/C++中,子线程可以是一个函数,一般都是一个带有循环的函数,来处理某些数据,优先线程只是一个复杂的运算过程,所以可能不需要while循环,运算完成,函数结束,线程就销毁。对于那些需要控制的线程,一般我们都是和互斥锁相互关联,从而来控制线程的进度,一般我们创建子线程,一种线程是很常见的,那就是带有消息循环的线程。
消息循环是一个很有用的线程方式,曾经自己用C在Linux下面实现一个消息循环的机制,往消息队列里添加数据,然后异步的等待消息的返回。当消息队列为空的时候就会挂起线程,等待新的消息的加入。这是一个很通用的机制。在Android,这里的线程分为有消息循环的线程和没有消息循环的线程,有消息循环的线程一般都会有一个Looper,这个事android的新概念。我们的主线程(UI线程)就是一个消息循环的线程。针对这种消息循环的机制,我们引入一个新的机制Handle,我们有消息循环,就要往消息循环里面发送相应的消息,自定义消息一般都会有自己对应的处理,消息的发送和清除,消息的的处理,把这些都封装在Handle里面,注意Handle只是针对那些有Looper的线程,不管是UI线程还是子线程,只要你有Looper,我就可以往你的消息队列里面添加东西,并做相应的处理。
但是这里还有一点,就是只要是关于UI相关的东西,就不能放在子线程中,因为子线程是不能操作UI的,只能进行数据、系统等其他非UI的操作。
15.Android为什么要设计4大组件,他们之间的联系,不设计行不行(主要是为了实现MVC模式,然而java中最难的模式也是这个,很少有产品能将这个模式做得很好【Technicolor 的面试官问的这个】
16,service的周期,activity的周期,谈下你对Android内部应用的了解,比如他做电话,以及联系人等等应用。框架层有很多东西还是多看看,熟悉Android怎么做的,不管你做应用程开发还是应用框架层开发很有好处的。在就是你项目经验,突出你遇到什么难点,然后是怎么解决的!尽量将每个技术点凸显出来,当然面试官有时候会为了体现你是否真正做过,他会问你,你在这个应用中做那个模块,用了多少个类之类的问题。偶尔有的面试官会问你,你用过Android自带的单元测试了没,怎么用的?当然我面试过很多家单位,有 的是做平板,手机,数字电视,有的是做出个erp之类的客户端等等,出于前面的三个,基本上都是将Android的全部改掉,如果真正要做Android的话,大家要学的还很多。总之,一句话,什么样的面试官都有,去面试的时候要做好一切心理准备,不管是技术还是基础都得扎实。一个人的交谈能力也很重要,总之不是非常标准的普通话,最起码你说的得让别人听得懂,而且得把面试官讲得非常彻底,这样你获得offer的机会更大,谈工资也有优势~~当然曾经一家公司的面试官跟我说过,技术是不惜钱的,只要你有能力,多少钱他都请。_ 确实,来北京求职期间,牛人真的很多,而且有的面试官也非常好,给了很多忠肯的意见。并不是每个面试官都特想为难你的~最主要的还是想知道你的技术,因为他们也是吃公司饭,得为这个负责。
Basic:
1.基本的UI控件和布局文件
2.UI配套的Adapter的使用
3.Activity, Intent,Service,broadCast Receiver他们的生命周期管理熟悉一下
4.操作手机上的数据库SQLite应用
17.为什么看好 Android
对于开发人员来讲:上手容易,入门简单,api齐全,适应性强 对于用户来讲:软件丰富,系统稳定,功能齐全 对于开发商来讲:可定制性高,开发成本低,免费。
18.现在在公司做哪些工作(关于 Android)错
手机软件开发一般是分平台的,目前比较火的是iPhone和Android手机平台上的软件开发。
一般大学计算机毕业,都会学过相应的编程语言,比如C或C++,有这两种语言做为基础,相信你可以快速去掌握其他的编程语言。
如果你想从事iPhone平台上的开发就要去学习Obj-C语言,想从事Android平台上的就学习Java语言,除了掌握语言以后,还有的就是不同平台上的开发工具。
如果你想从事手机软件开发方面的工作的话,我建议你可以选择一家专业的移动互联网开发培训学校,参加专业的培训能帮助你更系统更扎实的掌握目前最先进的技术
19.Android 的框架以及一些基础知识
20.Android 一些方面的领悟(如Android框架的 IoC特性,View System 的状态机机制等)
21.对多线程的运用和理解,及多线程之间handle的传值。
22.对android 虚拟机的理解,包括内存管理机制垃圾回收机制。
23.framework工作方式及原理,Activity是如何生成一个view的,机制是什么。
24.android本身的一些限制,不如apk包大小限制,读取大文件时的时间限制。
25.Linux中跨进程通信的集中方式
1.socket;
2.name pipe命名管道; 3.message queue消息队列; 4.singal信号量;
5.share memory共享内存;
26.dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念
DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。
27.sim卡的EF 文件有何作用
sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本 身可以有自己的操作系统,EF就是作存储并和手机通讯用的
28.AT命令的User case的概念
1、Use Case的作用:
我个人认为Use Case仅仅用来反映用户需求,并且在对象分析过程中,能够起到一个查漏补缺的作用。但是使用“先确定Use Case,再指认对象”实在是一种愚蠢的方法(恕我直言)。我个人认为,指认对象使用Yourdon在《Objuect Oriented Analysis》中提到的使用CheckList的方法在实践中是比较实用的。我近来读到的几本书,也印证了我的想法。就我我个人在实践中的经验,使用“首先确定Use Case”策略,非常容易导致分析员滑入“功能分解”的泥沼。而且从Use Case来导出对象将导致拙劣的分析模型。
2、Use Case之间的关系:
UML 1.3中,Use Case之间的关系只有3种,Generalization,Include和Extend,国内出版的关于UML的中文书有两本,一本是《UML从入门到精通》(其实应该叫做Rose入门),一本是北航的《面向对象的可视化建模技术》,后一本书在这个方面起到了很坏的作用(前一本书我没有怎么看,大概也好不到哪里去),一是使用了比较老的UML标准,比如使用了Use关系,而且对于Extend和Generalization关系的描述也很混乱,很多人受到了误导(尤其是Extend关系)。我建议有条件的网友尽量去看英文原版的著作,比如“UML三剑客”的《Unified Modeling Language User Guide》或者直接去读UML1.3的规范。(而且Use Case之间的关系是用虚线+箭头表示的,直到Rose 2000对此都没有支持)
3、Actor和Use Case之间的关系:
在UML 1.3之中,Actor和Use Case之间的关系应该是没有箭头的。虽然规范中并没有明确禁止使用箭头,但是从字句中隐含的意义来看,应该是没有箭头的,而且规范中给出的示例是没有箭头的。我认识的很多人,想当然的认为Actor和Use Case之间的关系上的箭头标示信息流向或者主/被动关系,其实这个关系仅仅表示某个Actor参与了某个Use Case。
29﹑Android 手机操作系统的四层架构?
架构框架以此从上到下:
1.Applications
(应用程序(应用层));
Android 会同一系列核心应用程序包一起发布,该应用程序包包括 email 客户端,SMS 短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用 JAVA 语 言编写的。
2.Application FrameWork
(应用程序扩展层(框架));
由于 Android 的手机操作系统是,基于 Liunx 2.6 系统之上封装而成。所以开发人员可也以直接访问核心程序所使用的API框架,该核心应用程序的API框架设计简化了组件的重用,任何一个核心应用程序(模块)都暴露出它的功能作用,并且其他应用程序也都可以使用该核心应用程序(模块)的功能(不过的遵守该核心应用程序框架的安全性限制)。同样,该应用程序的重用机制也使用户方便使用应程序的相关组件。API 框架隐藏的核心应用程序是一系列的应用程序的服务和系统应用,其中包括如下:
(Android 手机中的 View 是最基本的一个 UI 类)丰富而又可扩展的视图(手机界面所显示的组件(Activity上所显示的))组件,可以用来构建应用程序
如:(视图)Views, 网格(grids), 文本框(text boxes), 按钮(button), 放置图片区(imageview),文本编辑区
(edittext), 文本显示区(textview),3.Android RunTime Libraries
(Android 系统运行库);
4.Liunx Kernel
(Android 系统最底层核心系统 Liunx)
Android 的核心系统服务依赖于 Liunx 2.6 内核,如系统安全,内存管理,进程管理,网络协议栈和驱动模型。Liunx 内核也同时作为硬件和软件栈之间的抽象层。
30、Android dvm的进程和 Linux 的进程, 应用程序的进程是否为同一个概念
DVM 指 dalivk 的虚拟机。每一个 Android 应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik 虚拟机实例。而每一个 DVM 都是在 Linux 中的一个进程,所以说可以认为是同一个概念。
31、sim卡的 EF 文件有何作用
sim 卡的文件系统有自己规范,主要是为了和手机通讯,sim 本身可以有自己的操作 系统,EF就是作存储并和手机通讯用的
32、嵌入式操作系统内存管理有哪几种,各有何特性
页式,段式,段页,用到了 MMU,虚拟空间等技术
33.什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?
嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以 处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并 控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、军事设备、航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而 android 是基于 linux 内核的,因此属于软实时。
34、一条最长的短信息约占多少 byte?
中文 70(包括标点),英文 160,160 个字节
1.2.3.4.5.6.7.8.9.10.11.12.13.14.什么是Activity?
请描述一下Activity生命周期。
两个Activity之间跳转时必然会执行的是哪几个方法。
横竖屏切换时候Activity的生命周期。
如何将一个Activity设置成窗口的样式。
你后台的Activity被系统 回收怎么办?
如何退出Activity?如何安全退出已调用多个Activity的Application?
如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
两个Activity之间怎么传递数据?
怎么让在启动一个Activity是就启动一个service?
同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?
Activity怎么和service绑定,怎么在activity中启动自己对应的service? 什么是Service以及描述下它的生命周期。
Service有哪些启动方法,有什么区别,怎样停用Service?
15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.不用service,B页面为音乐播放,从A跳转到B,再返回,如何使音乐继续播放?
什么是IntentService?有何优点? 什么时候使用Service?
请描述一下Intent 和 Intent Filter。Intent传递数据时,可以传递哪些类型数据? 说说Activity,Intent,Service是什么关系。请描述一下Broadcast Receiver。
在manifest和代码中如何注册和使 用 broadcast receiver。请介绍下ContentProvider是如何实现数据共享的。请介绍下Android的数据存储方式。
为什么要用ContentProvider?它和sql的实现上有什么差别? 请介绍下Android中常用的五种布局。
谈谈UI中,Padding和Margin有什么区别?
widget相对位置的完成在antivity的哪个生命周期阶段实现。
请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。AIDL的全称是什么?如何工作?能处理哪些类型的数据?
请解释下Android程序运行时权限与文件系统权限的区别。
系统上安装了多种浏览器,能否指定某浏览器访问指定页面?
对多线程的运用和理解,及多线程之间handle的传值。对android虚拟机的理解,包括内存管理机制垃圾回收机制。
Framework工作方式及原理,Activity是如何生成一个view的,机制是什么。android本身的一些限制,比如apk包大小限制,读取大文件时的时间限。如何加载的音乐信息,如何改善其效率。
ListView如何提高其效率?
启动应用后,改变系统语言,应用的语言会改变么?
启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别?
Android程序与Java程序的区别?
Android中Task任务栈的分配。
在Android中,怎么节省内存的使用,怎么主动回收内存?
不同工程中的方法是否可以相互调用?
在Android中是如何实现判断区分通话记录中的电话状态,去电,来电、未接来电?
dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念
sim卡的EF 文件有何作用
如何判断是否有SD卡?
嵌入式操作系统内存管理有哪几种,各有何特性。
什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗? 一条最长的短信息约占多少byte? Linux中跨进程通信的几种方式。谈谈对Android NDK的理解。
谈谈Android的优点和不足之处。
Android系统中GC什么情况下会出现内存泄露呢? Android UI中的View如何刷新。简单描述下Android 数字签名。什么是ANR 如何避免它?
59.60.61.62.63.64.65.66.android中的动画有哪几类,它们的特点和区别是什么?
handler机制的原理。
android中线程与线程,进程与进程之间如何通信。
说说mvc模式的原理,它在android中的运用。
android中有哪几种解析xml的类,官方推荐哪种?以及它们的原理和区别。
【android实习报告】推荐阅读:
android实习日记07-15
android实习总结11-07
计算机系Android实习报告11-30
android商品管理07-19
Android 个人总结07-19
android 高级面试题10-24
android开发案例教程11-24
天津理工大学android06-10
android面试题和答案09-21
Android系统架构之微服务架构12-02