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、信息、等等
发表评论: