2 Star 20 Fork 43

胡老皮 / 2023年Android面试题合集解析

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
企业常见174道面试题.md 9.33 KB
一键复制 编辑 原始数据 按行查看 历史
胡老皮 提交于 2023-02-08 03:31 . 企业常见174道面试题

这套Android面试题汇总大全,希望对大家有帮助哈~

全部答案,更新日期:2月8日,直接下载吧

全部答案,更新日期:2023年2月8日,直接下载吧!

下载链接:高清全答案解析,累计935页+大厂面试题 PDF

1、SD卡

路径

a).Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) //sd卡挂载状态
b).Environment.getExternalStorageDirectory().getPath() //sd卡路径 ->/storage/emulated/0
c).Environment.getDownloadCacheDirectory().getPath() //data/cache路径
d).Environment.getDataDirectory().getPath() //data

权限

<uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE”/>
<uses-permission android:name=“android.permission.MOUNT_UNMOUNT_FILESYSTEMS”/>

2、.android的数据存储方式

文件存储 a).InputStream getResouces().openRawResource(int id) //返回 InputStream,针对res/raw b).InputStream getAssets().open(String path) //open(“img/smail.jpg”) c).Bitmap BitmapFactory.decodeResouce(resources,int,option) xml、SharedPreference //1).SharedPreference位于data/data/包名/shared_prefs 的xxx.xml文件 SQLiteDatabase ContentProvider 网络

3、BroadcastReceiver

//隐式广播需要在manifest中加上
>>class Receiver:BroadcastReceiver{。 //自定义监听器
onReceive(context:Context?,intent:Intent?){
val action=intent.getAction()
when(action)->{
}
}
}
>>IntentFilter if=IntentFilter() //动态注册广播
if.addAction("action1")
registerReceiver(re:BroadcastReceiver,if)
override fun destroy(){
unregisterReceiver(re:BroadcastReceiver)
}
>>隐式广播(通过action和category匹配)
:1.在Manifest上添加<category android:name="android.intent.category.DEFAULT"/>
:2.标识为android.intent.category.LAUNCHER,则不用添加DEFAULT
>>sendBroadcast(intent) //发送普通广播,静态注册必须描述action标签
:1.val intent=Intent()
intent.action=""intent.addCategory()
>>sendOrderedBroadcast(intent,receivePermission) //发送有序广播
a).<receiver android:name=".smsReceiver">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
b).setResultExtras(bundle:Bundle) //后续广播通过getResultExtras(true)取回Bundle
c).abortBroadcast() //终止广播传递
>>sendStickyBroadcast(intent) //发送粘性广播,粘性广播以最后一次的内容进行保留
:1.removeStickyBroadcast(intent)
:2.在Manifest中声明android.permission.BROADCAST_STICKY

4、sp频繁操作会有什么后果?sp能存多少数据?

sp的底层由xml来实现,操作sp的过程就是xml的序列化和解析。xml是存在磁盘上的,因此要考虑io速度。另外dvm的内存是有限的,同时dvm的堆内存为16M,所以不能超过此数字

5、dvm与jvm的区别

架构不同

JVM基于栈则意味着需要去栈中读写数据

DVM是基于寄存器的

字节码的执行顺序不同 执行顺序为: .java文件 -> .class文件 -> .jar文件 java文件 –>.class文件-> .dex文件

每个应用都运行在一个DVM实例中,且一个DVM运行在一个独立的进程空间dvm的垃圾回收

采用标记清除

缺点:容易产生很多彼此分隔的小内存块

dvm可划分为Active Heap+Zygote Heap+Card Table+Live Heap Bitmap+MARK HEAP Bitamp ->Zygote Heap 为初始时的进程,而应用程序是由Zygote fork出来的->当创建了应用程序后,会从Zygote heap分出一部分创建Active Heap,之分配的对象都在Active堆进行 ->堆的垃圾回收标记 采用Heap Bitmap位图来存储,划分为Live + Mark ->垃圾回收遍历采用递归,垃圾回收的标准为Live=1,Mark=0 ->垃圾回收的两个阶段,第一个阶段标记根对象 (静态对象、栈、全局变量、寄存器),不允许其他线程运行 第二个阶段遍历被根对象所引用的对象,并标记,此时为Concurrent GC->CardTable,用位图标识第二阶段需要被重新标记的对象,在第二阶段完成后继续标记,此时禁止其他线程

6、ART

//android4.4之后采用ART作为虚拟机 GC算法分为多种 :

1.Mark-Sweep GC,标记-清楚 :

2.Compacting GC,标记-压缩 新生代采用复制算法,老年代采用标记压缩 //复制算法:内存分为相等的两块,一块用于分配

7、Activity的生命周期

//结合ActivityThread
->onCreate 创建时执行
a).mInstrumentation.callActivityOnCreate
b).performStart
c).mInstrumentation.callActivityOnRestoreInstanceState
->onStart 可见时执行
->onResume 获取焦点时执行
a).handleResumeActivity
>performResumeActivity
->onPause 失去焦点时执行
a).handlePauseActivity
>performPauseActivity
>if(!r.activity.mFinished&&r.saveState)
mInstrumentation.callActivityOnSaveInstanceState
->onStop 不可见时执行
a).handleStopActivity
>performStopActivityInner
>performPauseActivityIfNeeded
->onDestroy 销毁
a).handleDestroyActivity
->案例分析:Activity A -> Activity B
:1.Activity A的创建,A::onCreate , A:onStart ,A:onResume
:2.跳转 , A:onPause ,B::onCreate,B:onStart,B:onResume,A:onStop
:3.Activity B返回,B:onPause,A:onRestart,A:onStart,A:onResume,B:onStop,B:onDestroy

8、Application能不能启动Activity

startActivity(intent:Intent,FLAG_ACTIVITY_NEW_TASK) standard模式启动的Activity,该实例会存放在启动该Activity的Activity所在的任务栈中,而ApplicationContext不存放在任务栈中

9、Activity的状态都有哪些

->foreground activity ->visible activity ->background activity ->empty process

10、横竖屏切换时Activity的生命周期

在没有配置activity的configChanges属性时 Activity的生命周期:onPause->onStop->onCreate->onStart->onResume 配置了activity的configChanges onConfigurationChanged

11、如何设置activity成窗口样式

android:theme=“@android:style/Theme.Dialog”

12、Activity的启动方式

standard 不管有没有已存在的实例,都生成新实例

singleTop 如果发现有对应的Activity实例位于栈顶,则重复利用,否则创建实例

singleTask a)栈内复用,复用时具有clearTop机制 b)single taskAffinity in task

singleInstance a)启用一个新的栈结构,将Activity放置于栈结构中,并保证不会有其它Activity实例进入 b)方便多个应用共享全局唯一的实例

13、Service的生命周期

通过startService调用 onCreate->onStartCommand->onDestroy 通过bindService调用 onCreate->onBind->onUnbind->onDestroyService Binder

>>//示例
a).public class LocalService extends Service{
private static LBinder binder=new LBinder(); //必须声明为static
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
@Override
public IBinder onBind(Intent intent)
{
return binder;
}
static class LBinder extends Binder{
public int getCount(){
return count;
}
}
}

14、IntentService

//开启线程处理耗时操作

>>onCreate //创建单独的HandlerThread处理所有的intent请求
:1.HandlertThread thread = new HandlerThread("")
thread.start()
mServiceLooper =thread.getLooper()
mServiceHandler =new ServiceHandler(mServiceLooper)

onSTartCommand.

:1.public int onStartCommand(Intent intent,int startId){
onStart(intent,startId)
return mRedelivery?START_REDELIVER_INTENT:START_NOT_STICKY;//在于service挂掉了intent是否会回

}
:2.public void onStart(Intent intent,int startId)
{
Message msg=mServiceHandler.obtainMessage()
msg.obj=intent
msg.arg1=startId
mServiceHandler.sendMessage(msg)
}

ServiceHandler.

//onHandleIntent,为自定义的类所实现的耗时操作
:1.private final class ServiceHandler extends Handler{
public ServiceHandler(Looper looper){super(looper);}
public void handleMessage(Message msg)
{
onHandleIntent((Intent)msg.obj)
stopSelf(msg.arg1)//当id为最后一个startService的startId时,进行关闭
}
}

总结

a).通过HandlerThread创建线程,并调用getLooper获取looper变量,以新建Handler

b).IntentService通过onStartCommand接收新的intent,并放在message.obj发送过handler

c).handler调用实现的onHandleIntent(intent)

d).Message msg=mServiceHandler.obtainMessage() //obtainMessage和Looper调用msg.relycleUnchecked是以插入链表头部和拆除的形式分配、释放Message资源

15、Fragment和Activity的onCreateOptionsMenu

>>override fun onCreateOptionsMenu(menu:Menu)
{
getMenuInflater.inflate(R.menu.menu1,menu)
return super.onCreateOptionsMenu(menu)
}
>>setHasOptionsMenu(true) //Fragment onCreate

16、Service的onStartCommand有几种返回值

17、Service的onRebind什么情况下执行

18、Handler防止内存泄露

19、IntentFilter的匹配法则

20、Fragment与Activity传值

由于篇幅原因,此处仅展示部分内容,查看更多Android面试题点击直接查看

全部答案,更新日期:2023年2月8日,直接下载吧!

下载链接:全部答案,整理好了

新增:高清全答案解析,累计935页+大厂面试题 PDF

1
https://gitee.com/hu-laopi/NewDevBooks.git
git@gitee.com:hu-laopi/NewDevBooks.git
hu-laopi
NewDevBooks
2023年Android面试题合集解析
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891