加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Activity中需要重写的方法

(2016-10-16 12:31:40)
标签:

oncreateonstartonres

activity中需要重写的

分类: Android/Java

http://blog.csdn.net/hwx865/article/details/38964449

2014-08-31 22:07 210人阅读 评论(0) 收藏 举报

目录(?)[+]



1.   onCreate, onStart, onResume, onPause, onStop, onRestart, onDestroy

如果连这7个方法都不清楚的话,那么就该从头开始看Android了。下图是Activity的生命周期,加深记忆用:

http://hi.csdn.net/attachment/201203/12/0_1331544222sYn4.gif

2.   onNewIntent

在AndroidManifest.xml将某activity的android: launchMode设置为singleTask或singleTop的情况下,当需要开启(startActivity)这个activity的时候,如果当前应用的Activity栈中已经存在了该activity,那么该activity将不会按照

onCreate  →  onStart  →  onResume

的顺序启动新的activity,而是会按照

onNewIntent   →  onResume

的顺序将Activity栈中已经存在的那个Activity实例调用到最前台。

调用startActivity方法时传递的intent参数会作为onNewIntent方法的参数被使用,而Activity类本身通过getIntent方法返回的intent变量则是初始的intent值,从onNewIntent方法无关,除非调用startActivity之前通过setIntent设置intent,以保持intent总是最新的intent。

3.   onSaveInstanceState与onRestoreInstanceState

当设备的配置(横竖屏、语言等)发生变化而使Activity自动重启,或者Activity从前台转到后台(如,按下Home键)的时候,Activity会调用onSaveInstanceState(Bundle)方法将当前Activity的状态保存到一个Bundle变量中。这个Bundle变量与onCreate(Bundle)方法和onRestoreInstanceState(Bundle)中的Bundle参数是同一个,也就是说,后两个方法通过传入的Bundle参数还原Activity的状态。

不过,虽然Activity的状态保存到了Bundle中,但是这些状态数据却无法从Bundle中取出。要想手动地设置一些重启后需要的状态数据,可以直接调用该Bundle实例的putXXX方法存入额外的数据信息。

如下列所示:

 

[java] view plain copy
  1. public class SaveNRestoreInstanceStateActivity extends Activity  
  2.    
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState)  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.save_restore_state);  
  7.      
  8.   
  9.  @Override  
  10.  protected void onRestart()  
  11.   super.onRestart();  
  12.   EditText et1 (EditText) findViewById(R.id.et1);  
  13.   EditText et2 (EditText) findViewById(R.id.et2);  
  14.     
  15.   et1.setText("This is et1");  
  16.   et2.setText("This is et2");  
  17.   
  18.   
  19.  @Override  
  20.  protected void onSaveInstanceState(Bundle outState)  
  21.   outState.putString("et1""This is from outState and this is et1");  
  22.   outState.putString("et2""This is from outState and this is et2");  
  23.     
  24.   super.onSaveInstanceState(outState);  
  25.   
  26.   
  27.  @Override  
  28.  protected void onRestoreInstanceState(Bundle savedInstanceState)  
  29.   super.onRestoreInstanceState(savedInstanceState);  
  30.     
  31.   EditText et1 (EditText) findViewById(R.id.et1);  
  32.   EditText et2 (EditText) findViewById(R.id.et2);  
  33.     
  34.   et1.setText(savedInstanceState.getString("et1"));  
  35.   et2.setText(savedInstanceState.getString("et2"));  
  36.   
  37.   
  38.  

[java] view plain copy
  1. public class SaveNRestoreInstanceStateActivity extends Activity  
  2.       
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState)  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.save_restore_state);  
  7.      
  8.   
  9.     @Override  
  10.     protected void onRestart()  
  11.         super.onRestart();  
  12.         EditText et1 (EditText) findViewById(R.id.et1);  
  13.         EditText et2 (EditText) findViewById(R.id.et2);  
  14.           
  15.         et1.setText("This is et1");  
  16.         et2.setText("This is et2");  
  17.      
  18.   
  19.     @Override  
  20.     protected void onSaveInstanceState(Bundle outState)  
  21.         outState.putString("et1""This is from outState and this is et1");  
  22.         outState.putString("et2""This is from outState and this is et2");  
  23.           
  24.         super.onSaveInstanceState(outState);  
  25.      
  26.   
  27.     @Override  
  28.     protected void onRestoreInstanceState(Bundle savedInstanceState)  
  29.         super.onRestoreInstanceState(savedInstanceState);  
  30.           
  31.         EditText et1 (EditText) findViewById(R.id.et1);  
  32.         EditText et2 (EditText) findViewById(R.id.et2);  
  33.           
  34.         et1.setText(savedInstanceState.getString("et1"));  
  35.         et2.setText(savedInstanceState.getString("et2"));  
  36.      
  37.   
  38.  

4.   onCreateDialog与onPrepareDialog

虽然onCreateDialog、onPrepareDialog方法,以及相关的调用方法showDialog、dismissDialog、removeDialog在API Level 11以后遭到废弃,但是对于2.2(Level 8)、2.3.1(Level 9)和2.3.3(Level 10)中却仍然是必不可少的。

简单地说onCreateDialog和onPrepareDialog就与onCreate和onStart方法之间的关系类似,onCreateDialog负责在弹出框还不存在时生成弹出框Dialog,而onPrepareDialog则是在Dialog显示前对其进行进一步的处理。

这里需要特别注意的是:使用removeDialog方法后,弹出框会被清除,下一次在本Activity中使用showDialog首先会调用onCreateDialog,然后再调用onPrepareDialog;而如果只使用dismissDialog方法使弹出框不可见,弹出框并不会被清除,下次调用showDialog时也不会调用onCreateDialog。

5.   onCreateContextMenu与onContextItemSelected

上下文菜单(ContextMenu)的实际效果是,长按某一个View控件之后弹出一个可选的菜单。ContextMenu相对真正的长按事件(OnLongClickListener)中弹出菜单的优点在于使用非常灵活,代码也相对集中。但是需要通过registerForContextMenu绑定View控件之后才能生效。

onCreateContextMenu方法的原型是:

void  onCreateContextMenu(ContextMenu  menu, View  v, ContextMenuInfo  menuInfo);

其中的ContextMenu  menu就是最终会显示的上下文菜单,需要在控件上进行的UI操作都需要在menu上进行;View  v是触发上下文菜单的View控件。

另一个方法onContextItemSelected,是用来处理上下文菜单中的选中事件的。其参数是MenuItem,也就是ContextMenu中的选中项,可以通过在onCreateContextMenu中设置的groupId、itemId、order或者title来加以区分。

6.   onCreateOptionsMenu与onOptionsItemSelected

虽然Android 4.0之后要取消菜单键,但是现在菜单键仍然非常有用。onCreateOptionsMenu就是菜单键的处理方法。咋看之下,菜单键的处理和上下文菜单的处理方法的格式几乎是一致的,实际操作中也是如此,不再赘述。具体示例如下:

[java] view plain copy
  1. public class OptionMenuTestActivity extends Activity  
  2. private TextView text;  
  3.       
  4.       
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState)  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.main);  
  9.           
  10.         text (TextView) findViewById(R.id.tv);  
  11.      
  12.   
  13.     @Override  
  14.     public boolean onCreateOptionsMenu(Menu menu)  
  15.         SubMenu sub menu.addSubMenu("0");  
  16.         sub.add("0-1").setOnMenuItemClickListener(listener);;  
  17.         sub.add("0-2").setOnMenuItemClickListener(listener);;  
  18.         sub.add("0-3").setOnMenuItemClickListener(listener);  
  19.         menu.add("1").setIcon(R.drawable.icon);  
  20.         menu.add("2");  
  21.         menu.add("4");  
  22.         menu.add("5");  
  23.         menu.add("6");  
  24.         menu.add("7");  
  25.           
  26.         return true 
  27.      
  28.       
  29.     @Override  
  30.     public boolean onOptionsItemSelected(MenuItem item)  
  31.         text.setText(item.getTitle());  
  32.         return true 
  33.      
  34.       
  35.     private OnMenuItemClickListener listener new OnMenuItemClickListener()  
  36.   
  37.         public boolean onMenuItemClick(MenuItem item)  
  38.             text.setText(item.getTitle());  
  39.             return true 
  40.          
  41.           
  42.     };  
  43.  

需要注意的是,菜单键所弹出的功能菜单一般都有项数限制(一般为6项),而且不可手动修改,如果超过这个数目,那么后面的菜单项将会被折叠起来。

另外,无论是上下文菜单还是菜单键菜单,都支持嵌套子菜单SubMenu,如上例中所示。

7.   onBackPressed

回退键的处理方法,一般用来屏蔽回退键或者在添加后退时的额外功能(弹出确认退出的对话框等)。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有