Android 面试题之Activity干货篇(下)

简介: 8、scheme跳转协议实现方式:2.调用9、Android本身API并未声明会抛出异常,则其在运行时有无可能抛出Runtime异常,你遇到过吗?有的话会导致什么问题?如何解决?10、如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?11、如何将一个Activity设置成窗口的样式。12、如何退出Activity?如何安全退出已调用多个Activity的Application?13、Activity之间使用Intent传递大量数据带来问题14、横竖屏切换时候activity的生命周期?相关推荐Activity生命周期详解

8、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.调用


       2.1、在html中调用


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

 2.2、应用内调用


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


2.3、获取Url和其他参数


Intent intent = getIntent();
Uri data = intent.getData();
String action = intent.getAction();
String scheme = intent.getScheme();
Set<String> categories = intent.getCategories();
MLog.e("SCHEME", "data:"+data);
MLog.e("SCHEME", "action:"+action);
MLog.e("SCHEME", "categories:"+categories);
MLog.e("SCHEME", "DataString:"+intent.getDataString());
MLog.e("SCHEME", "-------------------");
MLog.e("SCHEME", "scheme:"+scheme);
MLog.e("SCHEME", "id:"+data.getQueryParameterNames());
MLog.e("SCHEME", "host:"+data.getHost());
MLog.e("SCHEME", "path:"+data.getPath());
MLog.e("SCHEME", "port:"+data.getPort());


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


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


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


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


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


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


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


image.png


对于单个 activity退出:


       单一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基类,处理这些共通问题。


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


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


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


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


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


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


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


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


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


Value

Description

"density"

显示密度发生变更 — 用户可能已指定不同的显示比例,或者有不同的显示现处于活跃状态。

"fontScale"

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

"keyboard"

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

"keyboardHidden"

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

"layoutDirection"

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

"locale"

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

"mcc"

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

"mnc"

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

"orientation"

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

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

"screenLayout"

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

"screenSize"

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

该值表示当前可用尺寸相对于当前纵横比的变更,当用户在横向与纵向之间切换时,它便会发生变更。

"uiMode"

界面模式发生变更 — 用户已将设备置于桌面或车载基座,或者夜间模式发生变更。


相关推荐


Activity生命周期详解


Activity快速转换为Diglog


相关文章
|
3月前
|
Android开发 开发者
Android UI设计: 请解释Activity的Theme是什么,如何更改应用程序的主题?
Android UI设计: 请解释Activity的Theme是什么,如何更改应用程序的主题?
42 1
|
3月前
|
数据库 Android开发 开发者
Android基础知识:请解释Activity的生命周期。
Android基础知识:请解释Activity的生命周期。
43 2
|
7月前
|
XML Java Android开发
Android面试官最喜欢问15道面试题
Android面试官最喜欢问15道面试题
93 0
|
7月前
|
存储 SQL 安全
Android面试中问的线程相关问题
Android面试中问的线程相关问题
40 0
|
6月前
|
存储 SQL 人工智能
Android Activity启动流程一:从Intent到Activity创建
Android Activity启动流程一:从Intent到Activity创建
|
1月前
|
存储 安全 Java
Android 面试题及答案整理,最新面试题
Android 面试题及答案整理,最新面试题
86 2
|
2月前
|
Android开发
[Android 四大组件] --- Activity
[Android 四大组件] --- Activity
22 1
|
7月前
|
程序员 数据库 Android开发
面试问你Android中Context,你如何回答?
面试问你Android中Context,你如何回答?
65 0
|
3月前
|
Android开发
Android基础知识:什么是Fragment?与Activity的区别是什么?
Android基础知识:什么是Fragment?与Activity的区别是什么?
289 54
|
4月前
|
XML 安全 Java
Android Studio App开发入门之活动Activity中为活动补充附加信息讲解及实战(附源码 超详细必看)
Android Studio App开发入门之活动Activity中为活动补充附加信息讲解及实战(附源码 超详细必看)
36 0