Android面试题4

版权声明:个人见解,希望可以帮助大家,共同进步. https://blog.csdn.net/weixin_40783315/article/details/83787831

61.JNI怎样用

JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。

Java Native Interface (JNI)标准是Java平台的一部分, JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。

作用:它允许Java代码和其他语言写的代码进行交互。

优缺点:大大提高程序的性能,但是却破坏了Java的可移植性,也对Java的安全带来了一定的隐患。

62.广播的两种注册方式

 

1)动态注册/非常驻型注册/在代码中进行注册:应用程序关闭后不能再接受广播信息

在应用程序的代码中注册
注册BroadcastReceiver: registerReceiver(receiver, filter);
取消注册BroadcastReceiver: unregisterReceiver(receiver);

2)静态注册/常驻型注册/Manifast.xml中注册:应用程序关闭后广播接收器仍能接受广播信息

在AndroidManifest.xml的application里面定义receiver并设置要接收的action,程序中的核心代码示例:

Intent intent = new Intent();

intent.setAction(Intent.ACTION_EDIT);

sendBroadcast(intent);

 

63.android中Serializable和Parcelable的联系?

相同点:都是Android中自定义对象的序列化

不同点:

1) Serializable序列化时会产生大量的临时变量,因而频繁调用GC,

使用内存时Parcelable比Serializable性能高

2) Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议用Serializable

3) Serializable 的实现,只需要继承  implements Serializable 即可

 Parcelabel 的实现,需要在类中实现实现writeToParcel、describeContents函数以及静态成员变量 CREATOR,这个变量需要继承 Parcelable.Creator 接口

  1. Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。

64.一个应用中有多少个Context?

1、创建Application 对象时, 而且整个App共一个Application对象

2、创建Service对象时

3、创建Activity对象时

所以总Context实例个数 = Service个数 + Activity个数 + 1(Application对应的Context实例)

 

65.AsyncTask与使用线程处理耗时操作的优劣是?

AsyncTask:就是一个线程池,调用简单快捷,过程可控,操作灵活,但是更占用系统资源

需要多个异步操作并需要UI变更时就会变得复杂,如果异步任务的数据特别庞大,

AsyncTask这种线程池结构的优势就体现出来了

Thread:涉及到Looper,Thread,Handler,message结构清晰,功能定义明确,对于多个异步任务简单

Handler和Looper机制,它们均基于消息实现,有时可能消息队列阻塞或其他原因无法准确的使用

 

66.谈谈你对Android事件分发机制的理解?

当你点击了某个控件,首先会去调用该控件所在布局的dispatchTouchEvent方法,然后在布局的dispatchTouchEvent方法中找到被点击的相应控件,再去调用该控件的dispatchTouchEvent方法。

 

67.谈谈你对ZYGOTE进程的理解和认识?

Zygote(英文意思: 孵化)是一个简单的典型C/S结构。其他进程作为一个客服端向Zygote发出请求,Zygote接收到命令就”孵化”出一个Activity进程来。

Zygote系统代码组成及其调用结构:

Zygote.java提供访问Dalvik “zygote”的接口。主要是包装Linux系统的Fork,以建立一个新的VM实例进程。

ZygoteConnection.javaZygote的套接口连接管理及其参数解析。其他Actvitiy建立进程请求是通过套接口发送命令参数给Zygote。

ZygoteInit.javaZygote的main函数入口。

68.第三方注册及登陆怎么实现的?

所谓的第三方登录,就是利用用户在第三方平台上已有的账号来快速完成自己应用的登录或者注册的功能。

要数据,不要功能:

 1、用户触发第三方登录事件

 2、showUser(null)请求授权用户的资料(这个过程中可能涉及授权操作)

 3、如果onComplete()方法被回调,将其参数Hashmap代入你应用的Login流程

 4、否则提示错误,调用removeAccount()方法,删除可能的授权缓存数据

 5、Login时客户端发送用户资料中的用户ID给服务端

 6、服务端判定用户是已注册用户,则引导用户进入系统,否则返回特定错误码

 7、客户端收到“未注册用户”错误码以后,代入用户资料到你应用的Register流程

 8、Register时在用户资料中挑选你应用的注册所需字段,并提交服务端注册

 9、服务端完成用户注册,成功则反馈客户端引导用户进入系统

 10、否则提示错误,调用removeAccount()方法,删除可能的授权缓存数据

 

要功能,不要数据:

1、用户触发第三方登录事件

 2、调用platform.getDb().getUserId()请求用户在此平台上的ID

 3、如果用户ID存在,则认为用户是合法用户,允许进入系统;否则调用authorize()

 4、authorize()方法将引导用户在授权页面输入帐号密码,然后目标平台将验证此用户

 5、如果onComplete()方法被回调,表示授权成功,引导用户进入系统

 6、否则提示错误,调用removeAccount()方法,删除可能的授权缓存数据

 

69.Fragment怎么实现的?

继承Fragment类,重写生命周期方法,主要的不同之处就是需要重写一个onCreateView()方法来返回这个Fragment的布局

在Activity中你可以通过getFragmentManager()来获得Fragment对象,然后通过FragmentManager对象的beginFragmentTransaction()方法来获得FragmentTransaction对象。通过它的add()方法来添加一个Fragment到当前的Activity中。

一个FragmentTransaction对象可以执行多个增删修的方法,如果你想把这些修改提交到Activity上,必须在最后调用一下这个对象的commit()方法

两个单独的Fragment之间是不应该进行通信的。应该使用他们所存在的Activity作为沟通的纽带。

为了实现两个Fragment的交互,您可以在Fragment中定义一个接口,然后再这个接口中定义一个方法,在Fragment的onAttach()方法中调用这个接口中的方法。然后让Activity实现这个方法来完成Activity和Fragment之间的通信

可以通过FragmentManager的findFragmentById()来查找一个Fragment

 

70.缓存怎么实现的?

缓存可分为二大类:  

一、通过文件缓存,

顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式;

二、内存缓存,也就是实现一个类中静态Map,对这个Map进行常规的增删查下面为一个简单的缓存代码

三. 大数据量的缓存肯定还是要保存到文件,这里当然要用到第三方开源框架来实现了,常用的有Oscache,Ehcache,Jcache,Jbosscache等等很多

 

71.解析XML PULL解析?

pull解析同样基于事件驱动型,android 官方API提供,可随时终止,调用next() 方法提取它们(主动提取事件)

Pull解析器运行方式与SAX相似。它提供了类似的事件,如 开始元素事件, 结束元素事件。使用 parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个 switch对感兴趣的事件进行选择处理。当元素开始解析时,调用 parser.nextText()可以获得下一个Text类型元素的值。

 

72.分享用的什么平台?

让应用里添加第三方分享,主要是腾讯微博与新浪微博、人人网,但是很麻烦。推荐使用友盟第三方开放平台,平台很好,它里面的功能非常多,比如什么渠道分享,问卷调查,异常查看,软件更新等···

 

73.横竖屏切换

1. 在AndroidManifest.xml中为Activity设置configChanges属性,

<application android:icon="@drawable/icon" android:label="@string/app_name">

<activity android:name=".MainActivity"
android:label="@string/app_name" android:configChanges="orientation|keyboardHidden">

<intent-filter>

  <action android:name="android.intent.action.MAIN" />

  <category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

</application>

configChanges有如下选项:  1. orientation :屏幕在纵向和横向间旋转,  2. keyboardHidden:键盘显示或隐藏 ,3.fontScale:用户变更了首选的字体大小   4.locale : 用户选择了不同的语言设定,5.  keyboard :键盘类型变更,例如手机从12键盘切换到全键盘   6. touchscreen或navigation:键盘或导航方式变化,

如果缺少了keyboardHidden选项 不能防止Activity的销毁,并且在之后提到的onConfigurationChanged事件中 只能捕获竖屏变横屏的事件 不能捕获横屏变竖屏

2. 在对应的Activity中重写:onConfigurationChanged 方法:

public class MainActivity extends Activity {

    private TextView textView;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        Log.i("--Main--", "onCreate");

        textView=(TextView)findViewById(R.id.tv_id);

    }

    @Override

    public void onConfigurationChanged(Configuration newConfig) {

        super.onConfigurationChanged(newConfig);

        Log.i("--Main--", "onConfigurationChanged");

        if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){

            textView.setText("当前屏幕为横屏");

        }else{

            textView.setText("当前屏幕为竖屏");

        }

    }

}

 

74. 高并发业务请求处理方法

高并发业务请求处理方法,涉及即时通讯领域。所述方法包括步骤:将业务请求和目的IP压入客户端的分组消息队列;根据所述目的IP,将所述业务请求压入所述分组消息队列的数据存储模块的子消息队列中;将所述子消息队列中的多个业务请求,在所述分组消息队列的网络处理模块中,合并成一个网络请求后发送给所述目的IP对应的服务器。本发明的高并发业务请求处理方法,通过设置分组消息队列,首先将业务请求按照目的IP进行分组,然后将同组的业务请求合并成网络请求后再发送给服务器。从而,减少了网络请求次数,提高了对业务请求的处理效率,节省客户端和服务器内存。 

 

75.Android中如何设置两个应用程序为同一个进程?

1.在<manifest>里面添加: android:sharedUserId,注意这个属性的取值必须包含点(dot),也就是诸如java packae的形式。比如com.aaa.bbb。没有dot的话,将来adb install xxx.apk就会出错:Failure [INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID]。最晕死的就是这一点在Android文档中没有提到,感谢万能的google赐予了我答案。所有application都要填写的一样。

2.在<manifest>里面添加:android:sharedUserLabel="@string/shared_user_label",这个label必须是一个string资源,不能是raw string。所有application都要填写的一样。

3.在<application>里面添加:android:process="xxx.xxx.xxx",这里所有的application都要填写的一样,内容就是process的名字,一般来说Android中process的名字就是manifest中的package的取值。

4.所有的application用同样的一个key来sign。如果用Eclipse ADT plugin开发,由于所有的application都使用同一个debug key来sign,所以这一步没有什么额外的工作。更具体的有关sign apk的细节,参考Android文档:http://androidappdocs.appspot.com/guide/publishing/app-signing.html

 

76.手机适配怎么做?

在多平台适配中遵循如下原则

1)  客户端的设计规范应该以平台规范为基础

2)  在多平台中,品牌标识,包括logo,视觉风格,核心功能点等等应保持统一。

3)  更多地与平台的特性相融合,运用平台提供的特色功能,来减少用户的输入或者其他体验提升点。如拍照输入,传感器的使用等。

其他需要注意的问题:

1)  移动的特性决定了手机信号的强弱不均,如何处理在弱信号下的设计?

2)  需要考虑在断网情况下,如何快速恢复中断?

3)  如何设计手机推送的问题?

4)  如何尽量避免手机的固有限制,如屏幕小,输入不方便,电源紧张等?

5)  如何尽量通过手机的特有特性来提升体验,如各类传感器,声音提示等?

Android系统采用以下方法来实现应用界面的自动适配:  

1)布局文件中定义长度的时候,最好使用wrap_content,fill_parent, 或者dp 进行描述,这样可以保证在屏幕上面展示的时候有合适的大小  

2)像素单位都使用DIP,文本单位使用SP  

3)为不同屏幕密度的手机,提供不同的位图资源,可以使得界面清晰无缩放。  

对应bitmap 资源来说,自动的缩放有时会造成放大缩小后的图像变得模糊不清,这是就需要应用为不同屏幕密度配置提供不同的资源:为高密度的屏幕提供高清晰度的图像等。  

  1. 尽量不要使用AbsoluteLayout

 

77. 手机测试包括哪些?

手机测试是一个很大的题目,涉及到硬件测试和软件测试,还有结构的测试,比如抗压,抗摔,抗疲劳,抗低温高温等。

硬件测试一般都有严格的物理电气指标,也有专门的 仪器一般都有明确的指标,相应的测试用例,严格的操作规程,还有各种仪器,一定的测试软件

手机测试,一般是指软件测试

软件测试有:

集成版上的IT测试,对日的事业者测试,ST(系统)测试,还有协议测试(一般针对3G手机的多媒体画质和视频电话),底层的基站相关的测试,各种外联设备(电压,电流,模拟器)相关的测试。还就是FT,FT大多数翻译成场测。

每一种测试的流程都是不同的。

但是基本的流程如下:

1.测试需求分析

2.测试计划/测试用例书写

3.测试环境搭建,测试数据准备以及测试执行

4.测试反馈。一般指测试过程中发现异常,进行缺陷分析定位,然后和相关的开发人员进行对应,最后促使问题得到解决的过程。(测试faxianbug->评估提交bug->开发人员bug定位解决,与开发人员针对bug进行沟通,再现->bug修复之后的再测试,确定bug修复。)

5.测试项目结束后的总结分析(有的是没有这个环节的)

6.回归测试,所有测试结束之后,在版本提交之前必须进行的。

测试过程中很注重的几点是

第一,要理解需求,不理解需求,不明白功能,测试无从谈起。

第二,设计测试用例要用心到位,测试是设计出来的,不是凭空臆测的。

第三,测试过程中的沟通和报告。包括自己不懂得业务,如何去向成手或者Leader学习业务,包括测试过程中对于不明白的功能的理解,不正常的现象的分析,bug提交前后和开发人员之间的交流等。

78.Http中get和post的区别?

1. get是从服务器上获取数据,post是向服务器传送数据。
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

 

79.侧滑怎么实现的?

 侧滑菜单实现方式有多种 具体自己项目里面用到的方法

思路:a.自定义ViewGroup ,重写构造函数,重写onLayout()方法 对三个菜单页面重新排布

      b.通过重写onTouchEvent方法,通过onSrcoll 使三个菜单页面左右切换

答:实现侧滑的步骤:

  要实现ViewPager+Fragment的滑动效果,必须继承FragmentActivity,同时要

给ViewPager设置Adapter。由于ViewPager上面要加载Fragment(需要继承Fragment

类),所以不是重载PagerAdapter,而是重写FragmentPagerAdapter类

  写好了adapter,在主函数的onCreate()函数里面初始化ViewPager,同时给

它配置adapter和设置滑动事件监听(这需要实现OnPageChangeListener接口)

  接下来要做的就是在onCreate()里面初始化RadioButton,并给它设置

OnClickListener监听点击事件

最后就是实现侧滑出左边页面的效果,这里使用了开源组件SlidingMenu,

SlidingMenu组件重写了Activity、FragmentActivity、RelativeLayout等,要实现侧滑

效果,可以把主函数继承的FragmentActivity改成SlidingFragmentActivity,也可以

去在xml布局文件里面直接设置

80.UDP和TCP的区别?

TCP是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。

UDP它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去! 用于传输少量数据(数据包模式).

TCP可靠性高更安全,UDP不安全但速度快

猜你喜欢

转载自blog.csdn.net/weixin_40783315/article/details/83787831