android 面试

1.Activity的四种启动模式:

    1). standard

        模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。

    2). singleTop

        如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。

    3). singleTask

        如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。 

    4). singleInstance

        在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。

2.Activity启动模式设置:

        <activity android:name=".MainActivity" android:launchMode="standard" />
3.Activity生命周期

4.Intent几种常见的flags:
   1).1.FLAG_ACTIVITY_NEW_TASK:当Intent对象包含这个标记时,系统会寻找或创建一个新的task来放置目标Activity,寻找时依据目标Activity的taskAffinity属性进行匹配,如果找到一个task的taskAffinity与之相同,就将目标Activity压入此task中,如果查找无果,则创建一个新的task.
  2).FLAG_ACTIVITY_CLEAR_TOP:当Intent对象包含这个标记时,如果在栈中发现存在Activity实例,则清空这个实例之上的Activity,使其处于栈顶。
  3).FLAG_ACTIVITY_SINGLE_TOP:当task中存在目标Activity实例并且位于栈的顶端时,不再创建一个新的,直接利用这个实例。
  4).FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET:如果一个Intent中包含此属性,则它转向的那个Activity以及在那个Activity其上的所有Activity都会在task重置时被清除出task。
  5).FLAG_ACTIVITY_RESET_TASK_IF_NEEDED:这个标记在以下情况下会生效:1.启动Activity时创建新的task来放置Activity实例;2.已存在的task被放置于前台。系统会根据affinity对指定的task进行重置操作,task会压入某些Activity实例或移除某些Activity实例。

5 .activity的task相关属性 
1).android:allowTaskReparenting用来标记一个Activity实例在当前应用退居后台后,是否能从启动它的那个task移动到有共同affinity的task.
2).android:alwaysRetainTaskState用来标记应用的task是否保持原来的状态.
3).android:clearTaskOnLaunch用来标记是否从task清除除根Activity之外的所有的Activity.

6.Android使用 LruCache 缓存图片.

7.Tween动画:      Scale:缩放动画 Rotate:旋转动画 Translate:移动动画 Alpha::透明渐变动画.

8.Frame动画是一系列图片按照一定的顺序展示的过程,和放电影的机制很相似,称为逐帧动画。

9.asset 和raw区别:

           *res/raw和assets的相同点:

         1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。

          *res/raw和assets的不同点:
        1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到       R.java中,访问的时候需要AssetManager类。
           2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹

       *读取文件资源:

       1.读取res/raw下的文件资源,通过以下方式获取输入流来进行写操作

  • InputStream is = getResources().openRawResource(R.id.filename);  

      2.读取assets下的文件资源,通过以下方式获取输入流来进行写操作

  • AssetManager am = null;  
  • am = getAssets();  
  • InputStream is = am.open("filename");  
10.onSaveInstanceState是用来保存UI状态:
                 1、当用户按下HOME键时,
                 2、长按HOME键,选择运行其他的程序时。
                 3、按下电源按键(关闭屏幕显示)时。
                 4、从activity A中启动一个新的activity时。
                5、屏幕方向切换时,例如从竖屏切换到横屏时
     onSaveInstanceState方法和onRestoreInstanceState方法“不一定”是成对的被调用的。
11.JNI的调用过程;

12.listview 的优化:
        1。重用了convertView,很大程度上的减少了内存的消耗。通过判断convertView是否为null,是的话就需要产生一个视图出来,然后给这个视图数据,最后将这个视图返回给底层,呈献给用户。
     特点:如果当前的convertView为null,则通过LayoutInflat产生一个view。 
        2.使用了一个临时变量Viewview=convertView,然后修改view,最后返回view 
        3.建立一个内部类classViewHolder,这个ViewHolder,用来标识view中一些控件,方便进行一些事件相应操作的设置,比如onClick等等,这样可以不用每次都要findViewById了,减少了性能的消耗。同时重用了convertView,很大程度上的减少了内存的消耗。  
       4.设置ViewHolder为static,也就是静态的,静态类只会在第一次加载时会耗费比较长时间,但是后面就可以很好帮助加载,同时保证了内存中只有一个ViewHolder,节省了内存的开销。  

13activity 状态

Activity被创建或销毁时,它们进入或退出Activity栈。当它们做这些动作时,它们就会在四种可能的状态间迁移:

Active

Activity在栈的顶端时,它是可见的,有焦点的前台Activity,用来响应用户的输入。Android会不惜一切代价来尝试保证它的活跃性,需要的话它会杀死栈中更靠下的Activity来保证Active Activity需要的资源。当另一个Activity变成Active状态时,这个就会变成paused

Paused

在一些情况下,你的Activity可见但不拥有焦点;在这个时刻,它就是暂停的。当最前面的Activity是全透明或非全屏的Activity时,下面的Activity就会到达这个状态。当暂停时,这个Activity还是被看作是active的,但不接受用户的输入事件。在极端的情况下,Android会杀死一个pausedActivity来恢复资源给active Activity。当一个Activity完全不可见时,它就变成stopped

Stopped

当一个Activity不可见,它就“停止”了。这个Activity仍然留在内存里来保存所有的状态和成员信息;但是,在什么地方当系统需要内存时,它就是“罪犯”拉出去枪毙了。当一个Activity停止时,保存数据和当前UI状态是很重要的。一旦Activity退出或关闭,它就变成inactive

Inactive

当一个曾经被启动过的Activity被杀死时,它就变成inactiveInactive Activity会从Activity栈中移除,当它重新显示和使用时需要再次启动。


内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进一步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问题。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了一个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
### Android 开发面试常见问题及答案 #### 1. **什么是 Activity?** Activity 是 Android 应用程序中的核心组件之一,用于提供用户界面并与用户进行交互。它是 Android 构造块中最基础的部分,负责维护各个界面状态并妥善管理其生命周期和跳转逻辑[^1]。 --- #### 2. **Fragment 和 Activity 的区别及其使用场景是什么?** - **Fragment** 是一种可以在 Activity 中嵌套使用的 UI 片段,具有独立的布局和行为能力。它可以被用来构建更加模块化的界面设计。 - 使用场景上,Fragment 更适合动态调整界面结构的需求,尤其是在平板设备或多窗格布局中表现优异。 - Fragment 的主要优点在于提供了更灵活的界面管理和更高的可重用性[^2]。 --- #### 3. **Android 的四大组件分别是什么?** Android 的四大组件分别是: - **Activity**: 负责显示用户界面并与用户交互。 - **Service**: 运行在后台的任务处理单元,不依赖于任何特定的用户界面。 - **BroadcastReceiver**: 用于接收广播消息并对这些事件作出响应。 - **ContentProvider**: 提供了一种机制来共享数据,允许不同应用之间交换信息。 --- #### 4. **如何通过 SQLiteOpenHelper 创建数据库并管理版本?** `SQLiteOpenHelper` 类可以通过 `onCreate()` 方法创建一个新的数据库实例,并通过 `onUpgrade()` 方法实现数据库升级功能。开发者可以根据需求定义表结构以及更新策略。具体方法如下所示: ```java public class MyDatabaseHelper extends SQLiteOpenHelper { public static final String DATABASE_NAME = "my_database.db"; private static final int VERSION = 1; public MyDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 执行 SQL 初始化语句 db.execSQL("CREATE TABLE IF NOT EXISTS my_table (...)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion != newVersion) { // 升级逻辑 db.execSQL("DROP TABLE IF EXISTS my_table"); onCreate(db); // 可重新调用 onCreate() 或者自定义其他方式 } } } ``` 上述代码展示了如何利用 `SQLiteOpenHelper` 来生成数据库文件并对其进行版本控制[^3]。 --- #### 5. **信号量的作用是什么?** 信号量是一种同步工具,主要用于协调多个线程之间的访问权限。它不仅可以实现互斥操作(即一次只允许一个线程进入临界区),还可以指定同时处于临界区的最大线程数量。如果设置最大值为 1,则该信号量表现为典型的互斥锁[^4]。 --- #### 6. **Handler 和 Looper 的作用是什么?** - **Looper**: 它是一个循环器对象,在主线程或其他线程中运行一个消息队列。每个线程最多只能有一个 Looper 实例。 - **Handler**: 主要职责是向消息队列发送消息或将任务提交到目标线程执行。通常配合 Looper 工作以完成异步通信任务。 以下是简单的 Handler 示例代码片段: ```java new Thread(() -> { Looper.prepare(); // 准备当前线程的消息循环环境 Handler handler = new Handler(); handler.postDelayed(() -> Log.d("TAG", "This runs after delay"), 1000); Looper.loop(); // 启动消息循环 }).start(); ``` --- #### 7. **RecyclerView 和 ListView 的差异有哪些?** 虽然两者都支持列表项展示的功能,但 RecyclerView 在性能优化方面更为突出。它的优势体现在以下几个方面: - 改进了 ViewHolder 模式的实现细节; - 提供了 ItemAnimator 动画效果的支持; - 易扩展性强,便于定制复杂的布局样式。 --- ### 总结 以上列举了一些常见的 Android 面试题目及相关解答要点。对于求职者而言,熟悉理论知识的同时还需要注重实际项目经验积累,这样才能更好地应对技术挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值