Android Activity的各种重载方法

来源:互联网 发布:光晕系列 知乎 编辑:程序博客网 时间:2024/06/05 15:59

activity作为android开发最重要的组件,在官网API中详细描述了其生命周期

http://developer.android.com/reference/android/app/Activity.html

一般常用的流程如下:

onCreate(Bundle savedInstanceState)

onStart()

onRestart()

onResume()

onPause()

onStop()

onDestroy()

应用程序的从启动到显示出界面的流程是onCreate()  -> onStart()  -> onResume() 

退出应用程序的流程是   onPause() ->onStop() ->onDestroy()

以上这几个方法,网上的文章已经泛滥了,这里就不详细说明,下面主要说一些activity在应用开发中常用到的其他的方法



onCreateOptionsMenu(Menu menu)

onPrepareOptionsMenu(Menu menu)

onOptionsItemSelected(MenuItem item)

onOptionsMenuClosed(Menu menu)

这四个方法是和菜单menu键有关的

onCreateOptionsMenu(Menu menu) -----只在第一次刚进入activity的时候创建菜单

onPrepareOptionsMenu(Menu menu)-----每次按下menu键的时候调用的创建菜单

如果在上面在2个方法中都创建了菜单,则当然后者会覆盖前者,所以我们应用中一般都用onPrepareOptionsMenu(Menu menu),因为这个方法才能在一个activity中动态的创建不同的menu。

创建的菜单的方法可以通过menu.add的几个重载方法创建,不过这种方法比较繁琐,一般采用getMenuInflater().inflate(R.menu.xxx, menu)这种方法来创建

onOptionsItemSelected(MenuItem item) ----在选中某个菜单选项的时候调用

onOptionsMenuClosed(Menu menu) ----- 在菜单关闭的时候调用



onCreateDialog(int id)

onCreateDialog(int id, Bundle args)

onPrepareDialog(int id, Dialog dialog)

onPrepareDialog(int id, Dialog dialog, Bundle args)

showDialog(int id, Bundle args)

showDialog(int id)

removeDialog(int id)

这几个是和Dialog有关,和上面menu原理差不多,不过现在google已经不推荐使用这几种方法了,现在推荐使用3.0之后的DialogFragmentFragmentManager来代替,而在3.0之前可以使用google提供的一个第三方兼容包android-support-v4.jar来实现,这个包里面的类或方法都是3.0之后才出,google把它放出来也是为了兼容3.0之前的系统



onSaveInstanceState(Bundle outState)

onRestoreInstanceState(Bundle savedInstanceState)

这两个方法主要是用于保存状态的,特别是在横竖屏切换的时候,在应用开发中用的很多,大多数应用程序都会支持横竖屏,但游戏开发中一般是不支持的(游戏开发中的数据太多了,保存起来很麻烦)。当然在恢复数据的时候我们也可以直接写在onCreate中,这里的Bundle对象和onRestoreInstanceState里的Bundle其实都是同一个对象,不过onRestoreInstanceState是在介于onStart()  和onResume()之间调用的,如果有东西是在onstart()里面初始化的,则我们可能就只能在onRestoreInstanceState()里面来恢复



getLastNonConfigurationInstance
()

onRetainNonConfigurationInstance()

这两个方法和上面2个方法差不多也可以用来保存状态,只不过这里这里保存的对象是Object,而不是Bundle,机制上虽然稍微有点差异,不过大体上基本相同



onKeyDown(int keyCode, KeyEvent event)

onKeyUp(int keyCode, KeyEvent event)

onKeyLongPress(int keyCode, KeyEvent event)

onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)

其中onKeyDown,onKeyUp分别对应当键盘按下和松开时的调用方法,onKeyLongPress---当长按某个键时调用,

onKeyMultiple---当按多个组合键时调用

以上几个方法监听某个键的时候通过 keyCode == KeyEvent.XXX来实现

比如要监听数字键盘3则 keyCode ==KeyEvent.KEYCODE_3,监听返回键 keyCode == KeyEvent.KEYCODE_BACK

详见KeyEvent

当然监听返回键我们也可以在activity中通过重写onBackPressed()来进行监听


onTouchEvent(MotionEvent event)

用于监听触摸事件,通过event.getAction()来获取手势操作,然后根据MotionEvent中的一些常量值来判断手势:如MotionEvent.ACTION_DOWN:MotionEvent.ACTION_UP等等


在上面几种事件监听的方法中都会有个返回值表示是否消费掉了当前事件,返回true就表示消费掉了,返回false就表示没消费,继续向下传递;那什么叫消费掉了事件呢

这里就涉及到了android的事件传递机制知识,具体请参考下面2篇文章

http://www.cnblogs.com/xiaoQLu/archive/2012/04/28/2474443.html

http://www.cnblogs.com/playing/archive/2011/06/16/2082564.html



onNewIntent(Intent intent)

当把activity的启动方式设为singleTop或singleTask的时候可能会调用,注意是可能会调用,具体什么时候调用说实话我也没真正搞清楚过,网上讲这方面的的文章一大堆,各执一词,甚至就连google自己都说的是只有在singleTop方式的时候才会调用,但经过实验验证了一下,在singleTask情况下也会调用,所以不知道到底该去信谁的。。。
所以我们一般就采用了如下方法:
@Override
public void onCreate() {
    ...
    handleIntent(getIntent());
    ...
}
@Override
public void onNewIntent(Intent intent) {
    ...
    handleIntent(intent);
    ...
}
在onCreate()和onNewIntent()中都调用同一个自己写的方法handleIntent(Intent intent),这样你根本就不用去管它是否调用,因为在onCreate()和onNewIntent()两者之中必然要调用其中之一,不可能都调用或都不调用,这样就只需要把处理intent的地方都写在handleIntent里面就行了。




暂时就写到这里,后面再继续补充,未完待续。。。




原创粉丝点击