2024年Android 面试题之Activity干货篇(2),android高阶面试题

新的开始

改变人生,没有什么捷径可言,这条路需要自己亲自去走一走,只有深入思考,不断反思总结,保持学习的热情,一步一步构建自己完整的知识体系,才是最终的制胜之道,也是程序员应该承担的使命。

《系列学习视频》

《系列学习文档》

《我的大厂面试之旅》

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

BlueActivity.class

Intent intent = getIntent();

Bundle bundle = intent.getExtras();

Log.e(getClass().getName(),bundle.getString(“scc”)+“:”+bundle.getString(“size”));

打印结果:heiha:18

2.2.2使用Serializable(序列化)

创建一个实体类User implements Serializable

MainActivity.class

Intent intent = new Intent(MainActivity.this,BlueActivity.class);

intent.putExtra(“user”,new User(“帅次”,“男”,20));

startActivity(intent);

BlueActivity.class

User user = (User)getIntent().getSerializableExtra(“user”);

Log.e(getClass().getName(),user.getName()+“:”+user.getGender()+user.getAge());

打印结果:帅次:男20

3.启动带返回值

启动的MainActivity.java

Intent intent = new Intent(MainActivity.this,BlueActivity.class);

intent.putExtra(“scc”,“俺来咧”);

startActivityForResult(intent,998);

Log.e(getClass().getName(),“startActivityForResult”);

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

Log.e(getClass().getName(),“requestCode:”+requestCode+“:resultCode:”+resultCode);

//启动ActivityCode值998,回传ActivitiyCode值500

if(requestCode998&&resultCode500){

Log.e(getClass().getName(),“Intent data:”+data.getStringExtra(“scc_result”));

}

}

被启动的BlueActvitiy.java

Log.e(getClass().getName(),getIntent().getStringExtra(“scc”));

btn_back.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Log.e(getClass().getName(),“onClick.setResult”);

Intent intent = new Intent();

intent.putExtra(“scc_result”, “恕瑞玛你们的皇帝回来啦”);

setResult(500, intent);

finish();

}

});

打印结果:

点击MainActivity启动按钮

MainActivity$1: startActivityForResult

BlueActivity: 俺来咧

点击BlueActvitiy返回按钮

lueActivity$1: onClick.setResult

requestCode:998:resultCode:500

Intent data:恕瑞玛你们的皇帝回来啦

这就算完事了。

注意:requestCode不能等于resultCode,否则回传会失效。

6、Activity的启动模式(launchMode)

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

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

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

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

7、进程的优先级

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

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

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

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

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

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

1.2、该进程持有一个正在执行方法Service.startForeground()的Service。

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

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

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

5.1.这些进程通常包含用户当前不可见的一个或多个Activity实例(onStop()方法已被调用并返回)。

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”

<data

android:host=“scc”

android:path=“/redActivity”

android:port=“2021”

android:scheme=“sccdemo” />

2.调用

2.1、在html中调用

打开源生应用指定的RedActivity

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 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?

对于单个 activity退出:

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

对于多个 activity同时退出:

最后

希望大家能有一个好心态,想进什么样的公司要想清楚,并不一定是大公司,我选的也不是特大厂。当然如果你不知道选或是没有规划,那就选大公司!希望我们能先选好想去的公司再投或内推,而不是有一个公司要我我就去!还有就是不要害怕,也不要有压力,平常心对待就行,但准备要充足。最后希望大家都能拿到一份满意的 offer !如果目前有一份工作也请好好珍惜好好努力,找工作其实挺累挺辛苦的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

,平常心对待就行,但准备要充足。最后希望大家都能拿到一份满意的 offer !如果目前有一份工作也请好好珍惜好好努力,找工作其实挺累挺辛苦的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

[外链图片转存中…(img-cDSxBhLx-1715587350844)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值