20个必需的Android面试问题 *

寻找 自由职业者Android开发者工作?将您的生活方式设计为Android开发人员,配有Toptalal。

提交面试问题

有四个与Android平台上使用传感器相关的Java类。列出它们并解释每个的目的。

与Android平台上使用传感器相关的四个Java类arel

  • Sensor:提供用于确定特定传感器可用的功能的方法。
  • SensorManager:提供用于注册传感器事件侦听器和校准传感器的方法。
  • SensorEvent:提供原始传感器数据,包括关于准确性的信息。
  • SensorEventListener:定义将接收传感器事件通知的回调方法的界面。

了解更多信息 传感器,请参阅Android开发人员指南。

What is a ContentProvider and what is it typically used for?

A ContentProvider manages access to a structured set of data. It encapsulates the data and provide mechanisms for defining data security. ContentProvider is the standard interface that connects data in one process with code running in another process.

可以找到有关内容提供商的更多信息 这里 在Android开发人员指南中。

在下面的代码示例可能在什么条件下崩溃您的申请?您如何修改代码以避免此潜在问题?解释你的答案。

    Intent sendIntent = new Intent();
    sendIntent.setAction(Intent.ACTION_SEND);
    sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
    sendIntent.setType(HTTP.PLAIN_TEXT_TYPE); // "text/plain" MIME type
    startActivity(sendIntent);

隐式意图指定可以在能够执行操作的设备上调用任何应用程序的操作。当您的应用程序无法执行操作时,使用隐式意图是有用的,但其他应用程序可能会。如果有多个应用程序可以处理此请求的应用程序,则会提示用户选择要使用的用户。

However, it is possible that there are no applications that can handle your intent. In this case, your application will crash when you invoke startactivity(). To avoid this, before calling startactivity() you should first verify that there is at least one application registered in the system that can handle the intent. To do this use resolveActivity() on your intent object:

    // Verify that there are applications registered to handle this intent
    // (resolveActivity returns null if none are registered)
    if (sendIntent.resolveActivity(getPackageManager()) != null) {
        startActivity(sendIntent);
    } 

查看Android开发人员的指南 更多信息 关于隐含意图。

申请加入Toptal'S开发网络

并享受可靠,稳定,远程自由职业者Android开发人员工作。

申请自由职业者

通常,在执行屏幕重新定向的过程中,Android平台逐渐逐渐逐渐逐渐逐渐逐步重新创建它,在活动的布局中恢复每个视图值。

在您正在进行的应用中,您注意到在屏幕重新定向后未恢复视图的值。什么可能是您应该验证的问题的可能性,至少关于该特定视图?

You should verify that it has a valid id. In order for the Android system to restore the state of the views in your activity, each view must have a unique ID, supplied by the android:id attribute.

更多信息 这里.

The last callback in the lifecycle of an activity is onDestroy(). The system calls this method on your activity as the final signal that your activity instance is being completely removed from the system memory. Usually, the system will call onPause() and onStop() before calling onDestroy(). Describe a scenario, though, where onPause() and onStop() would 不是 be invoked.

onPause() and onStop() will not be invoked if finish() is called from within the onCreate() method. This might occur, for example, if you detect an error during onCreate() and call finish() as a result. In such a case, though, any cleanup you expected to be done in onPause() and onStop() will not be executed.

Although onDestroy() is the last callback in the lifecycle of an activity, it is worth mentioning that this callback may not always be called and should not be relied upon to destroy resources. It is better have the resources created in onStart() and onResume(), and have them destroyed in onStop() and onPause(), respectively.

查看Android开发人员的指南 更多信息 关于活动生命周期。

以下哪个代码片段是检查系统上是否存在罗盘传感器的正确方法?解释你的答案。

答案1:

    PackageManager m = getPackageManager();
    if (!m.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
        // This device does not have a compass, turn off the compass feature
    }

答案2:

    SensorManager m = getSensorManager();
    if (!m.hasSystemFeature(SensorManager.FEATURE_SENSOR_COMPASS)) {
        // This device does not have a compass, turn off the compass feature
    }

答案3:

    Sensor s = getSensor();
    if (!s.hasSystemFeature(Sensor.FEATURE_SENSOR_COMPASS)) {
        // This device does not have a compass, turn off the compass feature
    }

正确的答案是 答案1, the version that uses PackageManager.

SensorManager and Sensor are part of Android Sensor Framework and are used for direct access and acquisition of raw sensor data. These classes do not provide any method like hasSystemFeature() which is used for evaluation of system capabilities.

安卓 defines feature IDs, in the form of ENUMs, for any hardware or software feature that may be available on a device. For instance, the feature ID for the compass sensor is FEATURE_SENSOR_COMPASS.

If your application cannot work without a specific feature being available on the system, you can prevent users from installing your app with a <uses-feature> element in your app’s manifest file to specify a non-negotiable dependency.

However, if you just want to disable specific elements of your application when a feature is missing, you can use the PackageManager class. PackageManager is used for retrieving various kinds of information related to the application packages that are currently installed on the device.

了解更多信息 兼容性和处理不同类型的设备 或者 传感器 请参阅Android开发人员指南。

Describe three common use cases for using an 意图.

Common use cases for using an 意图 include:

  • 开始活动: You can start a new instance of an Activity by passing an Intent to startactivity() method.
  • 开始服务: You can start a service to perform a one-time operation (such as download a file) by passing an Intent to startService().
  • 提供广播: You can deliver a broadcast to other apps by passing an Intent to sendBroadcast(), sendOrderedBroadcast(), or sendStickyBroadcast().

更多信息 意图 可以在Android开发人员指南中找到。

假设您正在活动中启动服务,如下所示:

意图 service = new Intent(context, MyService.class);             
startService(service);

where MyService accesses a remote server via an Internet connection.

如果活动显示一个指示某种进步的动画,您可能会遇到哪些问题,您如何解决它?

通过互联网的远程服务的响应通常可能需要一段时间,由网络延迟或远程服务器上的负载,或远程服务处理和响应请求所需的时间。

结果,如果发生这种延迟,则可以阻止活动中的动画(甚至更差,整个UI线程),并且在客户端等待来自服务的响应时,用户可能会被视为“冻结”。这是因为在活动中的主应用程序线程(或UI线程)上启动了服务。

通过将任何此类远程请求降为背景线程或者在可行的时,可以避免使用异步响应机制来避免该问题(并且应该)。

注意: 从UI线程访问网络抛出较新的Android版本中的运行时异常,导致应用程序崩溃。

什么是DDM?描述其一些功能。

DDMS是这一点 dalvik调试监视器服务器 那艘船与Android。它提供了各种调试功能,包括:

  • 端口转发服务
  • 屏幕捕获
  • 线程和堆信息
  • 网络流量跟踪
  • 来电和SMS欺骗
  • 模拟网络状态,速度和延迟
  • 位置数据欺骗

What is the relationship between the life cycle of an AsyncTask and an Activity? What problems can this result in? How can these problems be avoided?

ASYNCTASK未与包含它的活动的生命周期相关联。因此,例如,如果您在活动中启动ASYNCTASK并且用户旋转设备,则将销毁该活动(并且将创建一个新的活动实例)但ASYNCTASK将 不是 死亡,而是继续生活,直到它完成。

然后,当ASYNCTASK完成时,而不是更新新活动的UI,它更新 以前的 活动的实例(即,创建它的一个,但不再显示它!)。这可能导致例外(类型) java.lang.IllegalArgumentException:查看未附加到窗口管理器 if you use, for instance, findViewById to retrieve a view inside the Activity).

由于ASYNCTASK维护了对Activty的引用,因此还可以导致内存泄漏的可能性,从而阻止活动从ASYNCTASK恢复活力时会收集活动。

由于这些原因,使用Asynctasks 长跑 背景任务通常是一个坏主意。相反,对于 长跑 背景任务应该采用不同的机制(例如服务)。

What is an 意图? Can it be used to provide data to a ContentProvider? Why or why not?

The 意图 object is a common mechanism for starting new activity and transferring data from one activity to another. However, you cannot start a ContentProvider using an 意图.

When you want to access data in a ContentProvider, you must instead use the ContentResolver object in your application’s Context to communicate with the provider as a client. The ContentResolver object communicates with the provider object, an instance of a class that implements ContentProvider. The provider object receives data requests from clients, performs the requested action, and returns the results.

片段和活动之间有什么区别?解释两者之间的关系。

一个 活动 通常是用户可以执行的单个,聚焦的操作(例如拨号数字,拍摄图片,发送电子邮件,查看地图等)。然而与此同时,没有任何内容阻止开发人员创建任意复杂的活动。

活动实现可以选择使用 片段类 出于诸如生产更多模块化代码的目的,为更大的屏幕构建更复杂的用户界面,帮助在小屏幕和大屏幕之间进行比例应用。可以在单个活动中组合多个片段,并且相反,通常可以在多个活动中重复使用相同的片段。这种结构主要旨在促进代码重用和促进规模经济。

片段基本上是活动的模块化部分,具有其自身的生命周期和输入事件,并且可以随时添加或删除。但是,重要的是要记住,片段的生命周期直接受到其主机活动的生命周期的影响;即,当活动暂停时,它的所有碎片都是如此,当活动被销毁时,它都是它的所有碎片。

更多信息 这里 在Android开发人员指南中。

可序列化和可包裹之间有什么区别? 哪个是Android中最好的方法?

Serializable是标准的Java接口。您只需通过实现接口标记序列化的类,并且Java将在某些情况下自动序列化。

可包裹是一个Android特定界面,您可以自己实现序列化。它被创建的效率远远超过序列化,并通过默认的Java序列化方案来解决一些问题。

什么是“发射模式”?它们可以定义哪种机制是什么?支持哪种特定类型的发射模式?

“启动模式”是活动的新实例与当前任务相关联的方式。

可以使用两个机制之一来定义发射模式:

  • 清单文件。 在清单文件中声明活动时,您可以在启动时指定活动应如何与任务相关联。支持的值包括:

    • standard (默认)。可以实例化的多个活动类实例,并且可以将多个实例添加到相同的任务或不同的任务中。这是大多数活动的共同模式。
    • singleTop. The difference from standard is, if an instance of the activity already exists at the top of the current task and the system routes the intent to this activity, no new instance will be created because it will fire off an onNewIntent() method instead of creating a new object.
    • singleTask. A new task will always be created and a new instance will be pushed to the task as the root. However, if any activity instance exists in any tasks, the system routes the intent to that activity instance through the onNewIntent() method call. In this mode, activity instances can be pushed to the same task. This mode is useful for activities that act as the entry points.
    • singleInstance. Same as singleTask, except that the no activities instance can be pushed into the same task of the singleInstance’s. Accordingly, the activity with launch mode is always in a single activity instance task. This is a very specialized mode and should only be used in applications that are implemented entirely as one activity.
  • 意图标志。 打电话 startactivity() 可以包括一个标志 意图 如果以及新活动应与当前任务相关联。支持的值包括:

    • FLAG_ACTIVITY_NEW_TASK. Same as singleTask value in Manifest file (see above).
    • FLAG_ACTIVITY_SINGLE_TOP. Same as singleTop value in Manifest file (see above).
    • FLAG_ACTIVITY_CLEAR_TOP. If the activity being started is already running in the current task, then instead of launching a new instance of that activity, all of the other activities on top of it are destroyed and this intent is delivered to the resumed instance of the activity (now on top), through onNewIntent(). 生成此行为的清单文件中没有相应的值。

有关启动模式的更多信息可用 这里.

What is the difference between Service and 意图Service? How is each used?

Service is the base class for Android services that can be extended to create any service. A class that directly extends Service runs on the main thread so it will block the UI (if there is one) and should therefore either be used only for short tasks or should make use of other threads for longer tasks.

意图Service is a subclass of Service that handles asynchronous requests (expressed as “Intents”) on demand. Clients send requests through startService(Intent) calls. The service is started as needed, handles each 意图 in turn using a worker thread, and stops itself when it runs out of work. Writing an 意图Service can be quite simple; just extend the 意图Service class and override the onHandleIntent(Intent intent) method where you can manage all incoming requests.

您如何将建筑争论提供给碎片?

Construction arguments for a Fragment are passed via Bundle using the Fragment#setArgument(Bundle) method. The passed-in Bundle can then be retrieved through the Fragment#getArguments() method in the appropriate Fragment lifecycle method.

It is a common mistake to pass in data through a custom constructor. Non-default constructors on a Fragment are not advisable because the Fragment may be destroyed and recreated due to a configuration change (e.g. orientation change). Using #setArguments()/getArguments() ensures that when the Fragment needs to be recreated, the Bundle will be appropriately serialized/deserialized so that construction data is restored.

什么是ANR,为什么会发生?

‘ANR’ in Android is ‘Application Not Responding.’ It means when the user is interacting with the activity, and the activity is in the onResume() method, a dialog appears displaying “application not responding.”

它发生了,因为我们开始了像下载主UI线程中的数据一样重常行的任务。问题的解决方案是使用Async任务类启动Backbround中的繁重任务。

什么是广播接收器?

广播接收机与操作系统消息通信,例如“检查Internet连接是否可用,”电池标签应该是什么等。

哪种方法仅在碎片生命周期中调用一次?

onAttached()

是否可以在没有用户界面的情况下在Android中创建活动?

是的,可以在没有任何用户界面的情况下创建活动。这些活动被视为抽象活动。

有更多的采访,而不是棘手的技术问题,因此这些是仅作为指导。不是每个值得招聘的“A”候选人将能够回答他们所有人,也不回答他们所有保证“A”候选人。在一天结束时, 招聘仍然是艺术,科学 - 以及很多工作.

提交面试问题

提交的问题和答案可能需要审查和编辑,可能会或可能不会被选中以在Toptal,LLC的唯一自行决定酌情选择。

* 各个领域都需要

Jasmin Kurti.

自由职业者Android开发商

波斯尼亚和黑塞哥维那(简称:波黑自2016年6月16日以来的Toptal会员

Jasmin是一个负责任的开发人员,具有开发创新和复杂的Android应用程序的大量经验。他'S非常有组织,以他的沟通方式为自己骄傲,并享受团队工作的好处。 Jasmin颁发挑战和解决它们。

展示更多

Patrick Keenum.

自由职业者Android开发商

美国自2018年6月11日以来的Toptal成员

Patrick是一名高级全堆员工程师,拥有超过10年的经验,开发美观,可靠和可扩展的产品。他对从概念到发射的想法引发的热情,与各级技术敏锐的客户合作,并建立帮助公司成长的产品。

展示更多

Muhammed MutaHr.

自由职业者Android开发商

美国自2018年3月2日起自2018年3月2日起的Toptal会员

Muhammad是一名高级软件工程师,拥有几年的行业经验,包括来自公共教育部门(WSU),私营的医疗保健公司(经络)和汽车行业的公共财富500强公司(GM&aam)。在他的职业生涯中,他在HTML / CSS中设计了Web应用程序,使用JavaScript Frameworks(Aganular / Ionic)开发的客户端应用程序,并使用Java和C#以开发强大的服务器端应用程序。

展示更多

寻找Android开发人员?

寻找 安卓开发人员?查看Toptal的Android开发人员。

toptal连接 最佳 3% 世界各地的自由人才。

加入Toptal社区。

学到更多