• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

Android从零开始-面试题Activity大全

互联网 diligentman 5小时前 1次浏览

一、Activity是什么

Activity是四大组件之一,它提供一个界面让用户点击和各种滑动操作,这就是Activity。

二、Activity生命周期

Android从零开始-面试题Activity大全

onCreate():在这里创建界面,做一些数据初始化的操作。

onStart():到了这一步用户可见不可交互。

onResume():到了这一步用户可见可交互。此时,你的 Activity 位于其 Activity 堆栈的顶部。

onPause():到了这一步用户可见不可交互。系统会停止动画等消耗CPU的操作。

onStop() :到了这一步用户不可见。停止动画和刷新 UI 等。

onDestroy():这是Activity最后一个方法。可以用isFinishing()来判断它,如果有dialog在运转,要在这个界面将dialog给cancel掉,不然抛异常。

onRestart():在你的活动停止后调用,然后再次启动。总是跟着onStart()。

三、Activity主要的四种状态:

Android从零开始-面试题Activity大全

Running(运行):在屏幕前台(位于当前任务堆栈的顶部)

Paused(暂停):失去焦点但仍然对用户可见(覆盖Activity可能是透明或未完全遮挡)

Stopped(停止):完全被另一个Activity覆盖

Destroyed(销毁):退出,完全销毁

Activity栈(先进后出)

Android从零开始-面试题Activity大全

多个Activity运行时,Android 是通过一种 Activity 栈的方式来管理 Activity 的,一个 Activity 的实例的状态决定它在栈中的位置。处于前台的 Activity 总是在栈的顶端,当前台的 Activity 因为异常或其它原因被销毁时,处于栈第二层的 Activity 将被激活,上浮到栈顶。当新的 Activity 启动入栈时,原 Activity 会被压入到栈的第二层。一个 Activity 在栈中的位置变化反映了它在不同状态间的转换。

五、Activity的启动模式(launchMode)

Standard(默认):每次激活Activity时(startActivity),都创建Activity实例,并放入任务栈;

Android从零开始-面试题Activity大全

SingleTop:如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例;

Android从零开始-面试题Activity大全

SingleTask:如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶。并调用其onNewIntent();

Android从零开始-面试题Activity大全

SingleInstance:应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例。

Android从零开始-面试题Activity大全

六、进程的优先级

1、前台进程(Foreground process)。它表明用户正在与该进程进行交互操作优先级是最高的。Android系统依据下面的条件来将一个进程标记为前台进程:

     a、该进程持有一个用户正在与其交互的Activity(也就是这个activity的生命周期方法走到了onResume()方法)。

     b、该进程持有一个Service,并且这个Service与一个用户正在交互中的Activity进行绑定。

     c、该进程持有一个前台运行模式的Service(也就是这个Service调用了startForegroud()方法)。

     d、该进程持有一个正在执行生命周期方法(onCreate()、onStart()、onDestroy()等)的Service。

     e、该进程持有一个正在执行onReceive()方法的BroadcastReceiver。

2.可见进程(Visible process)。它表明虽然该进程没有持有任何前台组件,但是它还是能够影响到用户看得到的界面。android系统依据下面的条件将一个进程标记为可见进程:

     a、该进程持有一个非前台Activity,但这个Activity依然能被用户看到(也就是这个Activity调用了onPause()方法)。例如,当一个activity启动了一个对话框,这个activity就被对话框挡在后面。

     b、该进程持有一个与可见(或者前台)Activity绑定的Service。

3.服务进程(Service process)。除了符合前台进程和可见进程条件的Service,其它的Service都会被归类为服务进程。

4.后台进程(Background process)。持有不可见Activity(调用了onStop()方法)的进程即为后台进程。通常情况下都会有很多后台进程,当内存不足的时候,在所有的后台进程里面,会按照LRU(最近使用)规则,优先回收最长时间没有使用过的进程。

5.空进程(Empty process)。不持有任何活动组件的进程。保持这种进程只有一个目的,就是为了缓存,以便下一次启动该进程中的组件时能够更快响应。当资源紧张的时候,系统会平衡进程缓存和底层的内核缓存情况进行回收。

七、scheme跳转协议

1.android中的scheme是一种页面内跳转协议,通过定义自己的scheme协议,可以跳转到app中的各个页面

2.服务器可以定制化告诉app跳转哪个页面

3.App可以通过跳转到另一个App页面

4.可以通过H5页面跳转页面

实现方式:

1.在AndroidManifest.xml中对activity标签增加intent-filter设置Schema

<activity android:name="com.scc.demo.actvitiy.RedActivity"
   >
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
            android:host="scc"
            android:path="/redActivity"
            android:port="2021"
            android:scheme="sccdemo" />
    </intent-filter>
</activity>

2.调用

a、在html中调用

<a href="sccdemo://scc:2021/redActivity?color=0000&ad=10086">打开源生应用指定的RedActivity</a>

b、应用内调用

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("sccdemo://scc:2021/redActivity?color=0000&ad=10086"));
startActivity(intent);

c、获取Url和其他参数

2021-06-11 18:38:40.795 8526-8526/com.scc.demo E/-SCC-SCHEME: data:sccdemo://scc:2021/redActivity?color=0000&ad=10086
2021-06-11 18:38:40.795 8526-8526/com.scc.demo E/-SCC-SCHEME: action:android.intent.action.VIEW
2021-06-11 18:38:40.795 8526-8526/com.scc.demo E/-SCC-SCHEME: categories:null
2021-06-11 18:38:40.795 8526-8526/com.scc.demo E/-SCC-SCHEME: DataString:sccdemo://scc:2021/redActivity?color=0000&ad=10086
2021-06-11 18:38:40.795 8526-8526/com.scc.demo E/-SCC-SCHEME: scheme:sccdemo
2021-06-11 18:38:40.795 8526-8526/com.scc.demo E/-SCC-SCHEME: id:[color, ad]
2021-06-11 18:38:40.795 8526-8526/com.scc.demo E/-SCC-SCHEME: host:scc
2021-06-11 18:38:40.795 8526-8526/com.scc.demo E/-SCC-SCHEME: path:/redActivity
2021-06-11 18:38:40.796 8526-8526/com.scc.demo E/-SCC-SCHEME: port:2021

八、Android本身API并未声明会抛出异常,则其在运行时有无可能抛出Runtime异常,你遇到过吗?有的话会导致什么问题?如何解决?

会,比如NullPointerException。我遇到过,比如textview.setText()时,textview没有初始化。会导致程序无法正常运行出现forceclose(当前应用程序发生了冲突NullPointExection(空指针),IndexOutOfBoundsException(角标越界)等等一系列未捕获异常)。打开控制台查看logcat信息找出异常信息并修改程序。

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

重写onSaveInstanceState()方法,在此方法中保存需要保存的数据,该方法将会在activity被回收之前调用。通过重写onRestoreInstanceState()方法可以从中提取保存好的数据。

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

在AndroidMainfest.xml中的<activity>中配置:android:theme="@android:style/Theme.Dialog" ,另外 android:theme="@android:style/Theme.Translucent"是设置透明。

十一、如何退出Activity?如何安全退出已调用多个Activity的Application?

单一Activity的应用来说,退出很简单,直接 finish()即可。也可以用 killProcess()和 System.exit()这样的方法。

对于多个 activity:

1、抛异常强制退出:该方法通过抛异常,使程序Force Close。但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。

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

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

4、递归退出在打开新的 Activity 时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

除了第一个,都是想办法把每一个Activity都结束掉,间接达到目的。但是这样做同样不完美。你会发现,如果自己的应用程序对每一Activity都设置了nosensor,在两个Activity结束的间隙,sensor可能有效了。但至少我们的目的达到了,而且没有影响用户使用。为了编程方便,最好定义一个 Activity 基类,处理这些共通问题。

十二、Activity之间使用Intent传递大量数据带来问题

Intent在传递数据时是有大小限制的,这里官方并未详细说明,不过通过实验的方法可以测出数据应该被限制在1MB(1024KB),采用的是传递某产品详情,发现当数据大小超过1MB的时候,程序就会出现闪退、停止运行等异常(不同的手机反应不同),因此可以判断Intent的传输容量在1MB以内,但是根据不同版本、不同厂商,这个值会有区别。解决方案如下:

1.减少通过 Intent 传递的数据,将非必须字段使用 transient 关键字修饰。

2.将对象转化为 JSON 字符串,减少数据体积。因为 JVM 加载类通常会伴随额外的空间来保存类相关信息,将类中数据转化为 JSON 字符串可以减少数据大小。

十三、横竖屏切换时候activity的生命周期?

1.不设置Activity的android:configChanges,横、竖屏切换时都会重新调用各个生命周期。

2.设置Activity的android:configChanges="orientation",横、竖屏切换时都会重新调用各个生命周期。

3.设置Activity的android:configChanges="orientation|screenSize",横、竖屏切换时不会重新调用各个生命周期。仅执行onConfigurationChanged()方法。

另:附上android:configChanges该属性的有效值

Value

Description

"density"

显示密度发生变更 — 用户可能已指定不同的显示比例,或者有不同的显示现处于活跃状态。此项为 API 级别 24 中的新增配置。

"fontScale"

字体缩放系数发生变更 — 用户已选择新的全局字号。

"keyboard"

键盘类型发生变更 — 例如,用户插入外置键盘。

"keyboardHidden"

键盘无障碍功能发生变更 — 例如,用户显示硬键盘。

"layoutDirection"

布局方向发生变更 — 例如,自从左至右 (LTR) 更改为从右至左 (RTL)。

此项为 API 级别 17 中的新增配置。

"locale"

语言区域发生变更 — 用户已为文本选择新的显示语言。

"mcc"

IMSI 移动设备国家/地区代码 (MCC) 发生变更 — 检测到 SIM 并更新 MCC。

"mnc"

IMSI 移动设备网络代码 (MNC) 发生变更 — 检测到 SIM 并更新 MNC。

"navigation"

导航类型(轨迹球/方向键)发生变更。(这种情况通常不会发生。)

"orientation"

屏幕方向发生变更 — 用户旋转设备。

请注意:如果应用面向 Android 3.2(API 级别 13)或更高版本的系统,则还应声明 "screenSize" 配置,因为当设备在横向与纵向之间切换时,该配置也会发生变更。

"screenLayout"

屏幕布局发生变更 — 不同的显示现可能处于活跃状态。

"screenSize"

当前可用屏幕尺寸发生变更。

该值表示当前可用尺寸相对于当前纵横比的变更,当用户在横向与纵向之间切换时,它便会发生变更。此项为 API 级别 13 中的新增配置。

"smallestScreenSize"

物理屏幕尺寸发生变更。

该值表示与方向无关的尺寸变更,因此它只有在实际物理屏幕尺寸发生变更(如切换到外部显示器)时才会变化。对此配置所作变更对应smallestWidth的。此项为 API 级别 13 中的新增配置。

"touchscreen"

触摸屏发生变更。(这种情况通常不会发生。)

"uiMode"

界面模式发生变更 — 用户已将设备置于桌面或车载基座,或者夜间模式发生变更。此项为 API 级别 8 中的新增配置。

 

 


程序员灯塔
转载请注明原文链接:Android从零开始-面试题Activity大全
喜欢 (0)