Android面试基础片---Activity(下)

一、如何保存Activity的状态

Activity的状态通常情况下系统会自己保存的,只有当我们需要保存额外的数据时才需要使用到这样的一个功能,我们一般来讲,调用 onPause() 和 onStop() 方法后的activity 实例仍然存在于内存中,activity 的所有信息和状态数据不会消失,当 activity 重新回到前台之后,所有的改变都会得到保留,但是当系统内存不足时,调用 onPause() 和 onStop() 方法后的 Activity 可能会被系统摧毁,此时内存中就不会存有该 Activity 的实例对象了,如果之后这个 Activity 重新回到前台,之前所做的改变就会消失.
为了避免这种情况的发生,需要我们覆写 onSaveInstanceState() 方法接受一个 Bundle 类型的参数,开发者可以将状态数据存储到这个 Bundle 对象中,这样即使 Activity 被系统摧毁,当用户重新启动这个 Activity 而调用它的 onCreate() 方法时,上述的 Bundle 对象会作为实际参数传递给 onCreate() 方法,开发者可以从 Bundle 对象中取出保存的数据,然后利用这些数据将 activity 恢复到被摧毁之前的状态.
但是值得我们注意的是,onSaveInstanceState() 方法并不是一定会被调用的,因为有些场景是不需要保存状态数据的。比如用户按下 BACK 键退出 Activity 时,用户显然想要关闭这个 Activity,此时是没有必要保存数据以供下次恢复的,也就是 onSavaInstanceState() 方法不会被调用,如果调用 onSavaInstanceState() 方法,调用将发生在 onPause() 和 onStop() 方法之前。

二、两个Activity之间跳转时必然会执行的是哪几个方法

这里写图片描述

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

Android开发过程中经常需要退出整个应用

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

2,对于多Activity的应用来说,在打开多个Activity后,如果想在最后打开的Activity直接退出,上边的方法都是没有用的,因为上边的方法都是结束一个Activity而已.

3,在2.1之前,可以使用ActivityManager的restartPackage方法。它可以直接结束整个应用。在使用时需要权限android.permission.RESTART_PACKAGES。

4,在2.2,这个2.1的方法失效了。在2.2添加了一个新的方法,killBackgroundProcesses(),需要权限android.permission.KILL_BACKGROUND_PROCESSES。可惜的是,它和2.2的restartPackage一样,根本起不到应有的效果。

5,另外还有一个方法,就是系统自带的应用程序管理里,强制结束程序的方法,forceStopPackage()。它需要权限android.permission.FORCE_STOP_PACKAGES。
并且需要添加android:sharedUserId=”android.uid.system”属性同样可惜的是,该方法是非公开的,他只能运行在系统进程,第三方程序无法调用。
因为需要在Android.mk中添加LOCAL_CERTIFICATE := platform。而Android.mk是用于在Android源码下编译程序用的。
以下几种结束的方法仅供参考:
1、抛异常强制退出:
该方法通过抛异常,使程序Force Close。验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。

2、记录打开的Activity:
每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。

3、发送特定广播:
在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。

4、递归退出
在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

附加:service是否在main thread中执行,service里面是否能执行耗时的操作?

默认情况,如果没有显示的指定service所运行的进程,service和Activity是运行在当前app所在进程的main thread(UI主线程)里面

service里面不能执行耗时的操作(网络请求,拷贝数据库,大文件)

在子线程中执行 new Thread().start();

特殊情况,可以在清单文件配置service执行所在的进程,让service在另外的进程中执行。

四、Conetxt、Activity、Application 有什么区别

相同:
Activity 和 Application 都是 Context 的子类

Context 从字面上理解就是上下文的意思,在实际应用中它也确实起到了管理上下文环境中各个参数和变量的作用,便于我们可以简单的访问到各种资源

不同:
维护的生命周期不同

1.Activity 维护的是当前的 Activity 的生命周期,所以其对应的 Context 也只能访问该 Activity 内的各种资源

2.Application 维护的是整个项目的生命周期

使用 Context 的时候,小心泄露内存,防止内存泄漏,注意以下几点:
1. 不要让生命周期唱的对象引用 activity context,即保证引用 activity 的对象要与 activity 本身生命周期是一样的。

2.对于生命周期长的对象,可以使用 application context

3.避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化.

五、一个应用程序有几个 Context?

在应用程序中Context的具体实现子类就是: Activity, Service, Application. 那么Context数量 = Activity数量 + Service数量 + 1
这里写图片描述

六、你知道 onNewIntent 吗?

只有启动模式是 SingleTop 或者使用 FLAG_ACTIVITY_SINGLE_TOP 来 startActivity(Intent). 这个方法才回被调用. 如果新 Activity 已经位于任务栈的栈顶, 那么此 Activity 不会被重新创建.

onNewIntent–>onRestart–>onStart–>onResume.

七、TaskAffinity 是什么?

Activity 的归属, 也就是 Activity 应该在哪个 Task 中. 一般情况下在同一个应用中, 启动的 Activity 都在同一个 Task 中.
每个 Activity 都有 taskAffinity 属性, 这个属性指出了它希望进入的 Task. 如果一个 Activity 没有显式的指明 taskAffinity, 那么它就会使用 Application 的 taskAffinity, 如果 Application 也没有指明, 那么该 taskAffinity 的值就等于包名.

转到请说明出处:https://blog.csdn.net/weixin_42558540/article/details/81394225

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值