专栏首页上善若水037android初级篇之Activity的几个重要函数

037android初级篇之Activity的几个重要函数

常规的生命周期的几个函数就不说了,说几个之前自己用的不多的

onTouchEvent

public boolean onTouchEvent(MotionEvent event)  

手机屏幕事件的处理方法onTouchEvent。该方法在View类中的定义,并且所有的View子类全部重写了该方法,应用程序可以通过该方法处理手机屏幕的触摸事件。该方法的签名如下所示。

参数event:参数event为手机屏幕触摸事件封装类的对象,其中封装了该事件的所有信息,例如触摸的位置、触摸的类型以及触摸的时间等。该对象会在用户触摸手机屏幕时被创建。

返回值:该方法的返回值机理与键盘响应事件的相同,同样是当已经完整地处理了该事件且不希望其他回调方法再次处理时返回true,否则返回false。

onNewIntent

protected void onNewIntent(Intent intent) 

singTask模式下,系统创建一个新的Task,并在Task的底部实例化Activities。然而,当一个实例存在于一个独立的Task时,系统不是去创建一个新的实例,而是调用onNewIntent()路由到其他任务的实例。在同一时间,只存在一个Activity实例。

Activity第一启动的时候执行onCreate()---->onStart()---->onResume()等后续生命周期函数,也就时说第一次启动Activity并不会执行到onNewIntent(). 而后面如果再有想启动Activity的时候,那就是执行onNewIntent()---->onResart()------>onStart()----->onResume(). 如果android系统由于内存不足把已存在Activity释放掉了,那么再次调用的时候会重新启动Activity即执行onCreate()---->onStart()---->onResume()等。

当调用到onNewIntent(intent)的时候,需要在onNewIntent() 中使用setIntent(intent)赋值给Activity的Intent.否则,后续的getIntent()都是得到老的Intent。

onKeyDown

跟onTouchEvent类似,不过处理的是按键事件

moveTaskToBack

模拟现在的主流应用最后按Back键时不是强制退出应用或直接结束根Activity,而是采取类Home键效果,此时可以直接通过此函数实现,非常实用。

@Override
 public void onBackPressed() {
     moveTaskToBack(true);
 }

startActivityForResult / onActivityResult / setResult 函数组合

此函数组合主要用于如下场景:用户在A Activity上点击某个按钮,跳转到B Activity,然后用户在B Activity上进行一些具体的操作,待操作完成后返回到A Activity,同时常常将B Activity中操作的一些数据返回到A Activity中。

再如上场景中,A -> B 需要通过startActivityForResult()方式打开。

onSaveInstanceState / onRestoreInstanceState调用时机

onSaveInstanceState调用时机:当Activity变得“容易”被系统销毁时,onSaveInstanceState即被回调,除非该activity是被用户主动销毁的,例如当用户按BACK键的时候。

注意上面的双引号,何为“容易”?言下之意就是该activity还没有被销毁,而仅仅是一种可能性。这种可能性有哪些?

1.当用户按下HOME键时;
2.长按HOME键,选择运行其他的程序时;
3.按下电源按键(关闭屏幕显示)时;
4.从activity A中启动一个新的activity时;
5.屏幕方向切换时,例如从竖屏切换到横屏时。

onRestoreInstanceState调用时机,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用。另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,也可以选择在onCreate方法中做数据还原。

@Override
 2     protected void onRestoreInstanceState(Bundle savedInstanceState) {
 3         // TODO Auto-generated method stub
 4         super.onRestoreInstanceState(savedInstanceState);
 5         savedInstanceState.getString("name", "");
 6         
 7     }
 8 
 9     @Override
10     public void onSaveInstanceState(Bundle savedInstanceState) {
11         super.onSaveInstanceState(savedInstanceState);
12         savedInstanceState.putString("name", "corn");
13     }

或在onCreate中:

 1 public class AActivity extends ActionBarActivity {
 2 
 3     private String name;
 4 
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.a);
 9 
10         if (savedInstanceState != null) {
11             name = savedInstanceState.getString("name");
12         }
13 
14     }
15 
16 }

需要注意的是,onSaveInstanceState被调用时,其调用发生在Activity生命周期中具体的位置。以A->B为例,A中onSaveInstanceState调用发生在A:onPause -> B:onCreate -> B:onResume -> A:onSaveInstanceState -> A:onStop。

onSaveInstanceState常常用于存储应用程序中当前Activity中重要的状态数据,以免Activity被系统意外杀掉的情况下当用户再次回来时不能找到之前的状态。如同一个Activity中使用多个fragment实现菜单功能时,最好需要在此函数中记录下当前菜单对应的fragment id等。

参考链接

  1. Android总结篇系列:Activity中几个主要函数详解

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 010android初级篇之Activity的返回值

    使用startActivity方式启动的Activity和它的父Activity无关,当它关闭时也不会提供任何反馈。 但是使用startActivityFor...

    上善若水.夏
  • 022android初级篇之android的Context

    Interface to global information about an application environment. This is an abs...

    上善若水.夏
  • 004计算机图形学之多边形的扫描转换和区域填充

    多边形的扫描转换是指: 把多边形的顶点表示转换为点阵表示。也就是知道多边形的边界,如何找到多边形内部的点,即把多边形内部填上颜色。

    上善若水.夏
  • Android中点击按钮启动另一个Activity及Activity之间传值问题

    点击第一个Activity中的按钮,启动第二个Activity,关闭第二个Activity,返回到第一个Activity。

    砸漏
  • android:excludeFromRecents 属性需要注意的小地方

    在 Android 系统中,如果我们不想某个 Activity 出现在 “Recent screes” 中,可以设置属性 android:excludeFro...

    夏洛克的猫
  • 3分钟短文 | Laravel 自定义 SQL 查询参数绑定

    laravel使用模型进行数据库操作时,并不是所有的字段或者关联关系 都能满足查询需求,有时候会有一些MySQL的函数计算等功能放在数据库 层面执行。

    程序员小助手
  • SQL联表细节,MySQL JOIN 的执行过程

      对于 MySQL 的 JOIN,不知道大家有没有去想过他的执行流程,亦或有没有怀疑过自己的理解(自信满满的自我认为!);如果大家不知道怎么检验,可以试着回答...

    三哥
  • 五年Android开发,让我“刻骨铭心”的那些坑

    这篇文章是本人对在开发过程中踩坑经历的一次总结;分为系统API的坑、使用不当导致的坑、开源项目中的坑等几个方面,知识面有限,认知难免会有...

    open
  • 【2】快速代码集的由来及概览

    喜爱编程,尽管编程开发并非自己的主要工作,但多年来,也一直没有间断开发。既有工作单位的一些项目,也有纯粹自己的一些想法而做的程序(我的原创)。在使用C#开发各类...

    用户1075292
  • VS2017中使用CppSQLite报出编译器错误C2440

    最近在VS2017中使用CodeProject上面的CppSqlite这个Sqlite的C++封装库时,引入了sqlite.lib以及CppSqlite的两个文...

    ccf19881030

扫码关注云+社区

领取腾讯云代金券