Android 2017面试答案总结

本文详细介绍了Android中的Activity概念,包括Activity的生命周期、不同状态下的方法调用、横竖屏切换时的行为变化、设置为窗口样式的方法、后台Activity被回收的处理方案、Activity间的跳转与数据传递、以及与其他组件如Service、BroadcastReceiver的交互方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

· 什么是 Activity?

通俗一点说 Activity 就是一个界面,这个界面里面可以放置各种控件。Activity 的界面也是用 xml 文件表示的,放置在 res->layout 下面。每生成一个新的 Activity 后,我们需要在AndroidManifest.xml 中注册一下这个 activity

· 请描述一下 Activity 生命周期。

onCreate(Bundle savedInstanceState):创建 activity 时调用。设置在该方法中,还以 Bundle的形式提供对以前储存的任何状态的访问!onStart()activity 变为在屏幕上对用户可见时调用。

onResume()activity 开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的)。

 onPause()activity 被暂停或收回 cpu 和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧!

 onStop()activity 被停止并转为不可见阶段及后续的生命周期事件时调用。onRestart():重新启动 activity 时调用。该活动仍在栈中,而不是启动新的活动。onDestroy()activity 被完全从系统内存中移除时调用,该方法被调用

 

· 两个 Activity 之间跳转时必然会执行的是哪几个方法。

onCrante() // Activity 生命周期开始时调用onRestoreInstanceState()//用来恢复 UI 状态onReStart()// Activity 重新启动时调用 onStart()//Activity 对用户即将可见时调用onResume()// Activity 与用户交互时,绘制界面

 onSaveInstanceState()//activity 即将移出栈顶保留 UI 状态时调用onPause()//暂停当前活动 activity,提交持久数据的改变,停止动画和其他占用 CPU 资源的东西,由于下一个 activity 在这个方法返回之前不会 resume,所以这个方法的代码执行要快。 onStop()//activity 不再可见时调用onDestroy()// Activity 销毁钱被调用的最后一个方法。

· 横竖屏切换时候 Activity 的生命周期。 

1、不设置 Activity  android:configChanges 时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

2、设置 Activity  android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置 Activity  android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法

· 如何将一个 Activity 设置成窗口的样式。

1、在你的 styles.xml 文件中可以新建一如下的类似 Dialog  style <style name="Theme.FloatActivity" parent="android:style/Theme.Dialog"> </style>

2、在 AndroidManifest.xml 中在你需要显示为窗口的 activity 中添加如下属性: android:theme="@style/Theme.FloatActivity" 即可也可以直接添加您对应需要展示为 Dialog style  Activity  android:theme 属性值为android:theme="@android:style/Theme.Dialog"

· 你后台的 Activity 被系统回收怎么办?

系统会帮我们记录下回收前 Activity 的状态,再次调用被回收的 Activity 就要重新调用onCreate()方法,不同于直接启动的是这回 onCreate()里是带上参数 savedInstanceState savedInstanceState 是一个 Bundle 对象,你基本上可以把他理解为系统帮你维护的一个 Map对象,我们使用 savedInstanceState 可以恢复到回收前的状态。

 · 如何退出 Activity?如何安全退出已调用多个 Activity  Application

finish()方法退出 activity.在 2.1 之前,可以使用 ActivityManager  restartPackage 方法。

 它可以直接结束整个应用。在使用时需要权限 android.permission.RESTART_PACKAGES在 2.2,这个方法失效了,可使用以下几个人工的方法

1、记录打开的 Activity

每打开一个 Activity,就记录下来。在需要退出时,关闭每一个 Activity 即可。

2、发送特定广播:

在需要结束应用时,发送一个特定的广播,每个 Activity 收到广播后,关闭即可。

 · 如果后台的 Activity 由于某原因被系统回收了,如何在被系统回收之前保存当前状态?

被回收前调用 onSaveInstanceState()方法保存当前状态。

· 两个 Activity 之间怎么传递数据? 

在 Intent 的对象中增加要传递的参数既可。

在 Intent 的对象的请求中加入键值对,对象名字.putExtra"键值对的名字","键值对的值");在另一个 Activity 中将 Intent 请求中的数据取出来:

Intent intent=getIntent();//

String value = intent.getStringExtra("testIntent");// testIntent 对应的值赋值给 value

· 怎么在启动一个 Activity 时就启动一个 service? 

将启动 Service 的语句放在 onCreate()方法中。

· 同一个程序,但不同的 Activity 是否可以放在不同的 Task 任务栈中? 

可以放在不同的 Task 中。需要为不同的 activity 设置不同的 taskaffinity 属性,启动 activity  Intent 需要包含 FLAG_ACTIVITY_NEW_TASK 标记。

· Activity 怎么和 service 绑定,怎么在 activity 中启动自己对应的 service? 

1Activity 能进行绑定得益于 Service 的接口。为了支持 Service 的绑定,实现 onBind 方法。

2Service  Activity 的连接可以用 ServiceConnection 来实现。你需要实现一个新的ServiceConnection,重写 onServiceConnected  onServiceDisconnected 方法,一旦连接建立,你就能得到 Service 实例的引用。

3、执行绑定,调用 bindService 方法,传入一个选择了要绑定的 Service  Intent(显式或隐式)和一个你实现了的 ServiceConnection 实例

 · 什么是 Service 以及描述下它的生命周期。

Android Service 是运行在后台的代码,不能与用户交互,可以运行在自己的进程,也可以运行在其他应用程序进程的上下文里。需要通过某一个 Activity 或者其他 Context 对象来调用, Context.startService()  Context.bindService() 如果在 Service 执行耗时的操作需要启动一个新线程来执行。Android Service 只继承了 onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动 Service 时,先后调用了 onCreate(),onStart()这两个方法,当停止 Service 时,则执行onDestroy()方法,这里需要注意的是,如果 Service 已经启动了,当我们再次启 Service 时,不会在执行 onCreate()方法,而是直接执行 onStart()方法。

· Service 有哪些启动方法,有什么区别,怎样停用 Service

两种启动 Service 的方式 Context.startService()  Context.bindService() 区别 Context.startService()Service 会经历 onCreate -> onStart(如果 Service 还没有运行,则 android 先调用 onCreate()然后调用 onStart();如果 Service 已经运行,则只调用 onStart(),所以一个 Service  onStart 方法可能会重复调用多次 );stopService 的时候直接onDestroy,如果是调用者自己直接退出而没有调用 stopService 的话,Service 会一直在后台运行。该 Service 的调用者再启动起来后可以通过 stopService 关闭 ServiceContext.bindService()Service 会经历 onCreate() -> onBind()onBind 将返回给客户端一个 IBind 接口实例,IBind 允许客户端回调服务的方法,比如得到 Service 运行的状态或其他操作。这个时候把调用者(Context,例如 Activity)会和 Service 绑定在一起,Context退出了,Srevice 就会调用 onUnbind -> onDestroyed 相应退出,所谓绑定在一起就共存亡 停用 service 使用 context.stopService()

· 不用 serviceB 页面为音乐播放,从 A 跳转到 B,再返回,如何使音乐继续播放?

A 使用 startActivityForResult() 方法开启 bB 类结束时调用 finish(); A 类的 intent 有一个子 activity 结束事件 onActivityResult(),在事件里继续播放音乐

 · 什么是 IntentService?有何优点?

IntentService 也是一个 Service,是 Service 的子类, IntentService  Service 有所不同,通过 Looper  Thread 来解决标准 Service 中处理逻的阻塞问题。

优点:Acitivity 的进程,当处理 Intent 的时候,会产生一个对应的 Service Android 的进程处理器现在会尽可能的不 kill 掉你非常容易使用日历中 IntentService 的应用

· 什么时候使用 Service 

比如播放多媒体的时候用户启动了其他 Activity 这个时候程序要在后台继续播放,比如检测SD 卡上文件的变化,再或者在后台记 录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。

· 请描述一下 Intent  Intent Filter

Intent  Android 中被翻译为"意图",熟语来讲就是目的,他们是三种应用程序基本组件—activityservice  broadcast receiver 之间互相激活的手段。 在调用 Intent 名称时使用ComponentName 也就是类的全名时为显示调用。这种方式一般用于应用程序的内部调用,因为你不一定会知道别人写的类的全名。我们来看看隐式 Intent 怎么用? 首先我们先配置我们的 Activity  Intent Filter

<intent-filter>

<action android:name="com.example.project.SHOW_CURRENT" /> </intent-filter>

这样在调用的时候指定 Intent  action,系统就是自动的去对比是哪个 intent-filter 符合我们的 Activity,找到后就会启动 Activity

一个 intent filter  IntentFilter 类的实例, 但是它一般不出现在代码中,而是出现在 android Manifest 文件中, <intent-filter>的形式. (有一个例外是 broadcast receiver  intent filter 是使用 Context.registerReceiver()来动态设定的,  intent filter 也是在代码中创建的.)

一个 filter  action, data, category 等字段. 一个隐式 intent 为了能被某个 intent filter 接受,必须通过 3 个测试. 一个 intent 为了被某个组件接受, 则必须通过它所有的 intent filter 的一个.

 · Intent 传递数据时,可以传递哪些类型数据?

Intent 间传送数据一般有两种常用的办法:

1.extra

2.data.

extra 可以用 Intent.putExtra 放入数据。新启动的 Activity 可用 Intent.getExtras 取出来 Bundle, 然后用 Bundles.getLong, getInt, getBoolean, getString 等函数来取放进入的值。而 data 则是传输 urlurl 可以是指我们熟悉的 http, ftp 等网络地址, 也可以指 content来指向 ContentProvider 提供的资源。Intent.setData 可以放入数据,Intent.getData 可以取出数据。

· 说说 ActivityIntentService 是什么关系

一个 Activity 通常是一个单独的屏幕,每一个 Activity 都被实现为一个单独的类,这些类都是从 Activity 基类中继承来的,Activity 类会显示由视图控件组成的用户接口,并对视图控件的事件做出响应。

Intent 的调用是用来进行架构屏幕之间的切换的。Intent 是描述应用想要做什么。Intent

据结构中两个最重要的部分是动作和动作对应的数据,一个动作对应一个动作数据。

Android Service 是运行在后台的代码,不能与用户交互,可以运行在自己的进程,也可以运行在其他应用程序进程的上下文里。需要通过某一个 Activity 或者其他 Context 对象来调用。

Activity 跳转到 ActivityActivity 启动 ServiceService 打开 Activity 都需要 Intent 表明跳转的意图,以及传递参数,Intent 是这些组件间信号传递的承载者。

· 请描述一下 Broadcast Receiver 

Broadcast Receiver 用于接收并处理广播通知(broadcast announcements)。多数的广播是系统发起的,如地域变换、电量不足、来电来信等。程序也可以播放一个广播。程序可以有任意数量的 broadcast receivers 来响应它觉得重要的通知。broadcast receiver 可以通过多种方式通知用户:启动 activity、使用 NotificationManager、开启背景灯、振动设备、播放声音等,最典型的是在状态栏显示一个图标,这样用户就可以点它打开看通知内容。通常我们的某个应用或系统本身在某些事件(电池电量不足、来电来短信)来临时会广播一个 Intent出去,我们可以利用注册一个 Broadcast Receiver 来监听到这些 Intent 并获取 Intent 中的数据。

·  manifest 和代码中如何注册和使 broadcast receiver 

1)在 AndroidManifest.xml 中注册

<receiver android:name="Receiver1"> <intent-filter>

<!--  Intent 中的 action 对应 -->

<action android:name="com.forrest.action.mybroadcast"/> </intent-filter>

</receiver>

2)在代码中注册

1. IntentFilter filter = new IntentFilter("com.forrest.action.mybroadcast"); // 和广播中 Intent  action 对应

2. MyBroadcastReceiver br = new MyBroadcastReceiver();

3. registerReceiver(new MyBroadcastReceiver(), filter)

· 请介绍下 ContentProvider 是如何实现数据共享的? 

ContentProvider 是通过提供 Uri 来实现数据共享

· 请介绍下 Android 的数据存储方式。

Android 提供了 5 种方式存储数据:使用 SharedPreferences 存储数据;

文件存储数据; SQLite 数据库存储数据;使用 ContentProvider 存储数据;网络存储数据;

· 为什么要用 ContentProvider?它和 sql 的实现上有什么差别?

使用 ContentProvider 可以将数据共享给其他应用,让除本应用之外的应用也可以访问本应用的数据。它的底层是用 SQLite 数据库实现的,所以其对数据做的各种操作都是以 Sql 实现,只是在上层提供的是 Uri

· 请介绍下 Android 中常用的五种布局。 

最常用的布局方式为 LinearLayoutRelativeLayoutFrameLayoutTableLayout AbsoluteLayout。其中 LinearLayout  RelativeLayout 是最常用的方式,他们可以通过在 xml配置文件或者代码中进行布局。

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在 IT 领域,文档格式转换是常见需求,尤其在处理多种文件类型时。本文将聚焦于利用 Java 技术栈,尤其是 Apache POI 和 iTextPDF 库,实现 doc、xls(涵盖 Excel 2003 及 Excel 2007+)以及 txt、图片等格式文件向 PDF 的转换,并实现在线浏览功能。 先从 Apache POI 说起,它是一个强大的 Java 库,专注于处理 Microsoft Office 格式文件,比如 doc 和 xls。Apache POI 提供了 HSSF 和 XSSF 两个 API,其中 HSSF 用于读写老版本的 BIFF8 格式(Excel 97-2003),XSSF 则针对新的 XML 格式(Excel 2007+)。这两个 API 均具备读取和写入工作表、单元格、公式、样式等功能。读取 Excel 文件时,可通过创建 HSSFWorkbook XSSFWorkbook 对象来打开相应格式的文件,进而遍历工作簿中的每个 Sheet,获取行和列数据。写入 Excel 文件时,创建新的 Workbook 对象,添加 Sheet、Row 和 Cell,即可构建新 Excel 文件。 再看 iTextPDF,它是一个用于生成和修改 PDF 文档的 Java 库,拥有丰富的 API。创建 PDF 文档时,借助 Document 对象,可定义页面尺寸、边距等属性来定制 PDF 外观。添加内容方面,可使用 Paragraph、List、Table 等元素将文本、列表和表格加入 PDF,图片可通过 Image 类加载插入。iTextPDF 支持多种字体和样式,可设置文本颜色、大小、样式等。此外,iTextPDF 的 TextRenderer 类能将 HTML、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值