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

2、Activity生命周期

****onCreate():****你必须实现此回调,它会在系统创建你的 Activity 时触发。你的实现应该初始化Activity的基本组件。

****onStart():****此回调包含 Activity 进入前台与用户进行互动之前的最后准备工作。到了这一步用户可见不可交互。

****onResume():****此时,该Activity位于Activity堆栈的顶部,并会捕获所有用户输入。应用的大部分核心功能都是在onResume()方法中实现的。到了这一步用户可见可交互。

****onPause():****当Activity失去焦点并进入"已暂停"状态时,系统就会调用onPause()。当用户点按"返回"或"最近使用的应用"按钮时,就会出现此状态,这意味着你的Activity仍然部分可见。到了这一步用户可见不可交互。系统会停止动画等消耗CPU的操作。

****onStop():****到了这一步用户不可见。停止动画和刷新 UI 等。如果Activity重新与用户互动下一个回调将是onRestart()或Activity彻底终止下一个回调将是onDestroy()。

****onRestart():****当处于"已停止"状态的 Activity 即将重启时,系统就会调用此回调。onRestart()会从Activity停止时的状态恢复Activity至运行状态。

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

3、Activity主要的四种状态

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

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

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

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

4、Activity栈(先进后出)

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

5、启动Activity

1.简单启动

在AndroidManifest.xml中声明

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android=“http://schemas.android.com/apk/res/android”

package=“com.scc.demo”>

<application

android:allowBackup=“true”

android:icon=“@mipmap/ic_launcher”

android:label=“@string/app_name”

android:roundIcon=“@mipmap/ic_launcher_round”

android:supportsRtl=“true”

android:theme=“@style/Theme.Demo”>

<activity

android:name=“.actvitiy.MainActivity”>

在MainActivity.java中启动

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

startActivity(intent);

2.数据传递

2.1简单数据传递

MainActivity.class

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

intent.putExtra(“scc”,“aiyouyou”);

startActivity(intent);

BlueActivity.class

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

打印结果:aiyouyou

2.2复杂数据传递

2.2.1使用数据包Bundle

MainActivity.class

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

Bundle bundle = new Bundle();

bundle.putString(“scc”,“heiha”);

bundle.putString(“size”,“18”);

intent.putExtras(bundle);

startActivity(intent);

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跳转哪个页面

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

[外链图片转存中…(img-VOFNhK9Y-1714959828664)]

[外链图片转存中…(img-DjEyFue5-1714959828664)]

[外链图片转存中…(img-hzNMGyGN-1714959828664)]

[外链图片转存中…(img-5sgsy6Ei-1714959828664)]

[外链图片转存中…(img-F0riflN9-1714959828665)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值