关闭

Android之 Activity

1020人阅读 评论(0) 收藏 举报
分类:

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开发文档的内容

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:145164次
    • 积分:2614
    • 等级:
    • 排名:第14468名
    • 原创:110篇
    • 转载:15篇
    • 译文:0篇
    • 评论:28条
    最新评论