安卓的四大组件之Activity-活动

1、什么是Activity?

四大组件之一,一般的,一个用户交互界面对应一个activity,setContentView()设置要显示的布局,activity是Context的子类,同时事件了Window.callback和Keyevent.callback,可以处理与窗体用户交互相关的事件。开发常用的有FragmentActivity,ListActivity,TabActivity等等、、

2、描述Activity的生命周期?

Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括:onCreare、onStart、onRasume、onPause、onStop、onDestroy、还有onRestart

其实这些方法都是两两对应的,onCreate创建于onDestroy销毁;onStart可见与onStop不可见;onResume可编辑(获取焦点)与onPause不可交互;如果界面有共同的特点或者功能的时候,还会自己定义个一个BaseActivity来使用。

3、如何保存Activity的状态?

Activity的状态通常情况下系统会自动保存的,只是当我们需要保存额外的数据时才需要使用到这样的功能。

一般来说,调用onPause方法后的activity实例仍然存在与内存中,activity的所有的信息和状态数据不会消失,当activity重新回到前台之后,所有的改变会得到保留。

但是当系统内存不足时,调用onPause和onStop方法后,activity的实例可能会被系统摧毁,此时内存中就不会有activity的实例存在了。如果之后这个activity重新回到前台,之前所做的改变就会消失,为了避免这种情况的发生,我们可以覆写onSavaInstanceState方法。onSaveInstanceState方法接收一个Bundle类型的参数,开发者可以将状态数据存储到这个Bundle对象中,这样即使activity被系统回收了,但是用户重启这个activity而调用它的onCreate方法的时候,上面的Bundle对象会作为实际参数传递给onCreate方法,开发者可以从Bundle对象取出保存的数据,然后利用这些数据将activity回复到被摧毁之前的状态。

需要注意的是,onSavaInstanceState方法不一定会被调用,因为有些场景不需要保存状态数据,比如用户按下BACK键后退出activity时,用户显然想要关闭这个avtivity,此时是没有必要保存数据以提供下一次恢复数据的,也就是方法不会被调用,如果调用了onSavaIstanceState那么它将在onPause和onStop方法之前被调用。

@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
}

4、两个Activity之间跳转必将经历那些生命周期方法?

A要开启B,那么A会调用onPause,然后B会调用onCreate,onStart,onRasume方法,这个时候B覆盖了A,导致A调用onStop方法,但是需要注意的是:如果B的窗口是透明的,那么就算是B覆盖了A,那么A也不会调用onStop方法。

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

切换横竖屏的时候,会不会重新调用Acticity的生命周期方法,取决于此Activity有没有在清单文件里面配置

android:configChanges="orientation|keyboardHidden|screenSize" 

如果配置了,那么不会重新走生命周期方法,只会调用onConfigurationChanged 方法。通常在游戏中,屏幕的方向都是用代码写死的。

6、如何将Activity设置成窗口的样子?

只需要我们的Activity配置一下的属性即可:

android:theme="@android:style/Theme.Dialog 

7、如何退出Activity和关闭已经开启多个Activity的Application?

如果只是关闭一个Activity,我们只需要调用一下finish方法即可。

如果是开启了多个Activity的Application那么:

用一个List集合把前面打开的所有的Activity都存起来,在需要退出的时候,遍历出来,一个一个关闭即可

List<Activity> lists ;// 在 application 全局的变量里面 
lists = new ArrayList<Activity>();
lists.add(this);
for(Activity activity: lists)
{
activity.finish();
}
lists.remove(this);

发送特定的广播

对每一个需要关闭的Activity都注册一个,广播接收者,在需要关闭的时候发送一个广播,然后让收到广播的Acitcity关闭即可

registerReceiver(receiver, filter)

给一个Activcity注册广播接收者: 在打开后面一个Activity的时候,我们可以用StartActivityForResult来开启,这样当被开启的Acitivity销毁的时候就会调用前一个Activity的onActivityResult方法,那么我们就可以在这个方法里面finish掉自己。

其实 也可以通过 intent 的 flag 来实现 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)

激活一个新的 activity。此时如果该任务栈中已经有该 Activity,那么系统会把这个 Activity 上面的

所有 Activity 干掉。其实相当于给 Activity 配置的启动模式为 SingleTask

8、Context、Activity、Application有什么区别?

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

Context从字面上理解就是上下文的意思,姿势及应用中,它也确实起到了管理上下文环境中各个参数和变量的用途,类似于一个工具包,可以让我们方便的访问各种资源。

不同点:维护的生命周期不同。Context维护的是当前的Activity的生命周期,Applacation维护的是整个项目的生命周期。

使用Context的时候,小心内存泄露,防止内存泄露,注意以下的几个方面:

⒈不要让生命周期长的对象引用activity和context,即保证引用activity的对象要与activity本身的生命周期一样长。

⒉对于生命周期,可以使用application,context

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

9、两个Activity之间传递数据,除了intent,广播接收者,content provider还有啥?

⒈利用static静态数据,public static成员变量

⒉利用外部存储的运输,例如File文件,SharedPreferences(首选)

⒊DB(数据库)

10、Context是什么?

⒈它描述的是一个应用程序环境的信息,即上下文。

⒉该类是一个抽象类(abstract),Android提供了该抽象类的具体实现类(Contextlml)。

⒊通过它,我们可以获取应用程序的各种资源和类,也包括一些应用级别的操作,例如:启动一个Activity、发送一个广播、接收intent、信息、等等

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏非著名程序员

玩转EventBus,详解其使用

? 概述 EventBus是一款针对Android优化的发布/订阅(publish/subscribe)事件总线。主要功能是替代Intent,Handler,...

2076
来自专栏小鄧子的技术博客专栏

【译】Retrofit 2 - 如何从服务器下载文件

如果你在阅读本文前没有写过任何一行Retrofit请求代码,那么最好看一下前面几篇博客。对于很多Retrofit使用者来说:定义一个下载文件的请求与其他请求几乎...

2301
来自专栏yang0range

Activity详解(二)——异常情况下的生命周期分析

最近 无意当中看到一道面试题是关于Activity异常情况下的生命周期分析,感觉自己还有所欠缺,随即在书中寻找完整答案,特记录如下。

2114
来自专栏Android开发小工

在Android开发中怎样使用Application类

自己独立开发项目才发现以前对Application类并不是十分了解,现在开始直接搭建一个新项目的框架才重新踩过这个坑。

1415
来自专栏AndroidTv

【Android】再来一篇Fragment的懒加载(只加载一次哦)

2017-7-14更新: 目前有人使用后出现了诸如首次打开显示空白界面,但点击有反应;或来回切换又变空白界面的问题。这些问题我暂时还不知道该怎么解决,后期有时...

5307
来自专栏7号代码

Android网络与数据存储——File存储(实现SD卡文件浏览器)

AndroidManifest.xml中manifest标签下有一个属性android:installLocation,用于指定应用程序安装在什么地方,该属性有...

2903
来自专栏郭霖

Android任务和返回栈完全解析,细数那些你所不知道的细节

任务和返回栈 一个应用程序当中通常都会包含很多个Activity,每个Activity都应该设计成为一个具有特定的功能,并且可以让用户进行操作的组件。另外,Ac...

2477
来自专栏向治洪

android程序崩溃后重启

有时候由于测试不充分或者程序潜在的问题而导致程序异常崩溃,这个是令人无法接受的,在android中怎样捕获程序的异常崩溃,然后进行一些必要的处理或重新启动 ...

3137
来自专栏Android先生

Android小技巧: 这里涵盖了所有实现 “一键退出 App” 的方法

即 需要2个步骤 才可 完成 一键退出 App 需求。下面,我将根据这两个步骤进行功能实现讲解。

842
来自专栏移动开发面面观

Android图片加载库内存缓存策略分析

1152

扫码关注云+社区

领取腾讯云代金券