Android之 Activity

原创 2016年08月29日 20:42:59

Activity的生命周期

Activity的生命周期与它的类的对象的生命周期是两回事
Activity的构造方法必须是无参的
Activity中不要使用静态属性!!!(常量可以) 它特别不靠谱

这里写图片描述

简要说一下各方法的作用:

onCreate : 创建Activity

onStart: 进入可见状态

onResume: 获得焦点

onPause: 失去焦点

onStop: 失去可见性

onDestroy: Activity被销毁

onRestart: 不可见 -> 可见 时执行的方法, 即从stoped -> started 从后台唤醒时调用

Activity的四种启动模式

standard: 什么情况都不考虑, 直接压栈和弹栈 (常用)
singleTop: 如果栈顶本身就是你想启动的Activity, 就不会再压栈
singleTask: 栈中不会含有相同Activity, 并把所有自己上面的Activity弹栈,(适合层级比较深的场合)(常用)
singleInstance: 新建一个任务栈, 并把自己放在栈顶, 切换到当前的任务栈(和硬件相关的, 打电话, 蓝牙设置)


intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//新建一个栈, 相当于singleInstance
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//启动Activity时会判断, 栈中是否有当前的Activity, 若有则会将所有的它上面的Activity弹出栈, singleTop

Activity的现场保护

进程的级别

进程级别: 空进程 后台运行的activity 后台运行的services 前台运行的activity 后台运行的系统进程

保存Activity状态

当Activity执行onStop时,系统会调用 onSaveInstanceState() 以便您的Activity可以保存带有键值对集合的状态信息。 此方法的默认实现保存有关Activity视图层次的状态信息,例如 EditText 小工具中的文本或ListView 的滚动位置。
要保存Activity的更多状态信息,您必须实现 onSaveInstanceState() 并将键值对添加至 Bundle 对象。 例如:

例如:

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
 savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
 //必须要调用该方法, 可以实现保存视图层次的状态 
 super.onSaveInstanceState(savedInstanceState);
}

恢复Activity状态

当您的Activity在先前销毁之后重新创建时,您可以从系统向Activity传递的 Bundle 恢复已保存的状态。onCreate() 和 onRestoreInstanceState() 回调方法均接收包含实例状态信息的相同 Bundle。
因为无论系统正在创建Activity的新实例还是重新创建先前的实例,都会调用 onCreate() 方法,因此您必须在尝试读取它之前检查状态 Bundle 是否为 null。 如果为 null,则系统将创建Activity的新实例,而不是恢复已销毁的先前实例。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // 必须首先调用父类方法

    //检查一下是否保存着状态
    if (savedInstanceState != null) {
    //恢找到数据
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}

Intent

显式意图和隐式意图

显式意图: 我们确定知道我们要启动的应用是什么的时候使用
隐式意图: 当我们不知道要启动的应用时使用 (设计理念: 把一个应用做好)

隐式意图

隐含意向不声明要启动的组件的类名称,而是声明要执行的操作。 该操作指定您要执行的操作,比如查看、编辑、发送或 获取 某项。 意向通常还包含与操作关联的数据,比如您要查看的地址或您要发送的电子邮件消息。根据要创建的意向,数据可能是 Uri、多种其他数据类型之一,或意向可能根本就不需要数据。
如果您的数据是 Uri,有一个简单的 Intent() 构造函数,您可用来定义操作和数据。

例如: 此处显示如何使用指定号码的Uri数据创建发起电话呼叫的意图

Uri number = Uri.parse("tel:5551234");
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);

当您的应用通过调用 startActivity() 调用此意向时,“电话”应用会发起向指定电话号码的呼叫。

查看网页:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
        startActivity(intent);

显式意图

显式意图较简单

Intent intent = new Intent(this, SecondActivity.class);
        startActivity(intent);

Activity中的数据传输

启动Activity携带数据

intent.putExtra("text", main_edit.getText().toString());
startActivity(intent);

不仅可以携带String, 也可以传输Bundle, 可以放入更多数据类型

Activity返回结果

此时我们不能用startActivity了, 我们需要使用startActivityForResult

例如:

intent.putExtra("text", main_edit.getText().toString());
        startActivityForResult(intent, 0);

重写Activity中onActivityResult方法

例如:

//接收返回数据
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     super.onActivityResult(requestCode, resultCode, data);

     switch (requestCode) {
         case 0:
             if (resultCode == RESULT_OK){
                 String text = data.getStringExtra("data");
                 textView.setText(text);
             }
             break;
     }

 }

返回数据的Activity

 Intent intent = new Intent();
 intent.putExtra("data", "OtherActivity返回");
 setResult(RESULT_OK, intent);
 //销毁当前Activity
 finish();

这里注意, 里面的requestCode和resultCode

requestCode : 请求码, 接收数据的Activity跳转时传入的, 用来区分谁的请求

resultCode: 结果码, 返回数据的Activity调用, 用于区分返回的数据来自于谁

Activity中物理返回

重写onBackPressed

例如, 下面是一个二次退出的例子

@Override
 public void onBackPressed() {
     //去掉super的调用, 因为里面有写返回的东西
     //super.onBackPressed();
     //Android的取当前时间
     if (SystemClock.uptimeMillis() - time < 3000) {
//  finish();//退出当前Activity
//   finishAffinity();//API16可用
         //兼容使用
//   ActivityCompat.finishAffinity(this);//销毁所有Activity
//   System.exit(0);//退出整个应用(虚拟机) 但是应用会恢复 相当于异常退出
//   Process.killProcess(Process.myPid());//杀死整个进程,也会恢复

     } else {
         Toast.makeText(OhterActivity.this, "再点击一次退出", Toast.LENGTH_SHORT).show();
         time = SystemClock.uptimeMillis();
     }
 }

Activity之间跳转动画问题

以后还要继续学习动画问题, 今天只是简单的写个缩放的例子

例如, 为了保持兼容性, 我们使用兼容包来实现对大部分的手机兼容, 但是虽然是使用了兼容包, 目前Activity跳转动画还是只支持Android5.0以上的系统

//         缩放动画效果
  ActivityOptionsCompat compat = ActivityOptionsCompat.
          makeScaleUpAnimation(v, v.getWidth() / 2, v.getHeight() / 2, 0, 0);
ActivityCompat.startActivity(this, intent,  compat.toBundle())

注: 本文摘抄了大量Android开发文档的内容

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android面试题——Activity

记得2010年开始接触Android(Android 1.5),使用Eclipse开发,学完JDK5新特性之后,工作中其实用的是Java6,甚至身边都没有几个人用的是Android手机,当时HTC正火...
  • geofferysun
  • geofferysun
  • 2016年10月15日 00:00
  • 1119

Android必考面试题之一——Activity的生命周期以及流程图

生命周期包括几个方法:onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()...... 我们也基本了解了Activity...
  • csdavy103
  • csdavy103
  • 2016年12月19日 16:53
  • 621

Android 项目开发必备-Activity管理栈之ActivityManager的建立

在我们日常开发当中你一定为无缘无故的内存泄漏而烦恼,或者因为多个Activity互相跳转而烦恼,这时候我们就需要一个利器-ActManager.有了这个帮助类我们就可以省去静态去写一些activity...
  • qq_40239822
  • qq_40239822
  • 2017年12月13日 16:24
  • 134

两个Activity之间的观察者模式

需求是在闪屏页面启动定位功能,在MainActivity中更改位置信息。如果定位功能在MainActivity生成之前完成。则在MainActivity初始化时就有位置信息。若由于网络原因等在Main...
  • song542363202
  • song542363202
  • 2016年04月04日 22:44
  • 541

Android源码解析(十八)-->Activity布局绘制流程

这篇文章是承接上一篇文章来写的,大家都知道Activity在Android体系中扮演者一个界面展示的角色,通过上一篇文章的分析,我们知道Activity是通过Window来控制界面的展示的,一个Win...
  • qq_23547831
  • qq_23547831
  • 2016年05月01日 00:28
  • 16249

Android Activity生命周期一探究竟 及 主Activity里带Thread跳转时的注意事项

本文通过实例,透析了Activity的生命周期,消除人们之前认识的盲区。尤其对主Activity里有Thread在运行,而又要跳转到其他Activity的情况进行了详细探讨,指出了注意事项。...
  • yanzi1225627
  • yanzi1225627
  • 2014年02月23日 22:25
  • 9334

RxAndroid/RxJava 之 Rxlifecycle 的使用

依赖代码:compile 'com.trello:rxlifecycle:1.0' compile 'com.trello:rxlifecycle-components:1.0'作用&价值:作用: 用...
  • JackLittlePig
  • JackLittlePig
  • 2018年01月03日 16:44
  • 175

Android 只开启一个Activity实例

在一个Activity中,多次调用startActivity()来启动另一个Activity,要想只生成一个Activity实例,方法有两种。 方法一:设置起动模式一个Activity有四种启动模式:...
  • xiangyong2008
  • xiangyong2008
  • 2010年08月02日 14:29
  • 16164

带你重新认识:Android Splash页秒开 Activity白屏 Activity黑屏

严振杰带你重新认识:Android Splash页秒开,如何解决Activity白屏,如何解决Activity黑屏。本篇博客要剖析和解决的两个问题: 1. APP启动时白屏/黑屏、Activity打开...
  • yanzhenjie1003
  • yanzhenjie1003
  • 2016年08月13日 21:50
  • 41280

Android之moveTaskToBack()方法实现手动隐藏当前Activity

1、moveTaskToBack()方法说明 moveTaskToBack()方法:在activity中调用 moveTaskToBack (booleannonRoot)方法即可将activity...
  • u011068702
  • u011068702
  • 2017年05月05日 20:34
  • 1042
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android之 Activity
举报原因:
原因补充:

(最多只允许输入30个字)