Activity

意图打开Activity的几种方式

方式一

//这种方式是通过显式方式打开的Activity界面
Intent intent = new Intent(content,Activity.class);
intent.putExear("key","value");
startActivity(intent);

方式二

//这种方式是通过隐式注册的Activity打开的
Intent intent = new Intent();
intent.putExear("key","value");
intent.setAction(actionName);
startActivity(intent);

方式三

//这种方式打开的Activity也是隐式注册的
Intent intent = new Intent(actionName);
intent.putExear("key","value");
startActivity(intent);

Activity的两种注册方式

  1. 显式注册
    注册方式:
    直接在清单文件的节点下添加这个一个节点就可以,
    name设置成这个activity文件的全路径
  2. 隐式注册
    注册方式:
    比上面的多一步
    在activity节点里还要添加一个意图过滤器,
    里面有两个属性和是一定要添加的还有一个可以不添加




    <– action,这个的那么可以随便定义,一般是:(包名.action.xxx)和 category都必须写上 –>

    <– 一般可以用默认的 –>

    <– 还有一个data节点,需要的话也可以写,这边写了,那么那边意图传递的时候也就一定要写data –>

传递自定义对象时的操作

  1. Serializable:java中的序列化数据
  2. Parcelable:android中的序列化流
    这两个都可以序列化对象Parcelable是android特有的,它是Serializable的优化版本,效率比它高

用Bundle对象来携带传递批数据,而不像上面那样直接用intent来零散的传递数据

//传递数据
Intent intent = new Intent(MainActivity.this, NewActivity.class) 
Bundle bundle = new Bundle();//该类用作携带数据 
bundle.putString("name", "lwen"); 
bundle.putInt("age", 4); 
intent.putExtras(bundle);//附带上额外的数据 
startActivity(intent); 

//获取数据:
Bundle bundle = this.getIntent().getExtras(); 
String name = bundle.getString("name"); 
int age = bundle.getInt("age");

得到新打开Activity关闭之后返回来的数据,也就是数据的反向传递

步骤
  1. 启动界面,等待结果

    Intent intent = new Intent(this,SmsListActivity.class);
    //startActivity(intent);//启动一个新的界面,但是不需要返回结果
    
    //1. 启动下一个界面,然后等待结果的返回
    startActivityForResult(intent,0);
    
  2. 在下一个界面设置返回的结果

    Intent intent = new Intent();
            intent.putExtra("sms", objects[position]);
            //2.返回结果
            setResult(1, intent);
    
  3. 关闭下一个界面

    //3.关闭当前界面
            finish();
    
  4. 在当前界面重写onActivityResult获取结果

    @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
    
            //4.获取到下一个界面返回的数据
            String sms = data.getStringExtra("sms");
            et_content.setText(sms);
        }
    

Activity的生命周期

  1. 正常的生命周期是:
    1. onCreate()–onStart()–onResume()–onPause()–onStop()–onDestroy()
  2. 打开一个界面到我们可以操作这个界面的生命周期是:
    1. onCreate()–onStart()–onResume()
  3. 把打开的这个界面按返回键退出的生命周期是:
    1. onPause()– onStop()–onDestroy()
  4. 一个打开的可操作的界面点击home键退出时的生命周期
    1. onPause()–onStop()
  5. 一个程序正在运行着,突然来了电话,这时的生命周期是:
    1. onPause()–onStop()
  6. 在一个activity A中启动了activity B,并完全覆盖A的界面,这时候按回退键再从B返回到A,那 么A在回退过程中调用了它的哪些生命周期方法 :(B界面完全覆盖A界面)
    1. onRestart–>onStart–>onResume
  7. 你的手机界面没有设置任意的参数,当你的手机旋转屏幕后,当前界面的生命周期是:
    1. onPause()–onStop()–onDestroy()–onCreate()–onStart()–onResume()

Activity的四个启动模式

要理解启动模式,的先了解”任务栈”这个概念

  1. task:任务

    1. 一般一个程序包含多个界面,一般一个界面就是用于处理数据交互的task(任务);
  2. 栈:

    1. 是一种特殊的数据结构,遵循先进后出的原则
  3. 所以:

    1. 任务栈就是用于记录当前程序打开过哪一些界面,方便下次用户返回的时候显示前面的界面,如果一个栈里没有了任何任务,那么说明这是一个空栈,表明当前的应用已经完全退出.

    2. 一个应用可以有一个任务或多个任务栈(当启用了singleInstance模式就有多个)

启动模式分四种(因为不同模式在任务栈中的保存的方式不同,也就会出现不同的效果)

  1. 默认模式:(android:launchMode=”standard”)在清单文件的activity节点的属性位置设置

    1. 特点:只要这个界面被启动了多少次就会产生多少个实例被压到栈顶.
  2. 单一顶部模式(android:launchMode=”singleTop”)在清单文件的activity节点的属性位置设置

    1. 特点:
      如果一个activity设置成了这种模式,但凡这个activity位于栈顶,也就是显示在屏幕上的时候, 如果还想在启动它,是不会再创建新的实例了,还是使用栈顶的这个实例.

    2. 应用场景:为了避免自己启动自己,而出现一些奇怪的问题,例如:短信编辑界面

  3. 单一任务模式:(android:launchMode=”singleTask”)在清单文件的activity节点的属性位置设 置

    1. 特点:
      如果一个activity设置成了这种模式,假设前面已经在栈中存在过这个activity的实例,那么接下来不会再创建新的实例,而是把前面的那个实例直接移动到栈顶显示,并且会把前面那个实例与栈顶中间的那些别的activity的实例给全部的销毁掉

    2. 应用场景:一般一个程序界面非常的消耗内存和cpu的时候,就把这个界面设置成singleTask模式:例如:浏览器界面

  4. 单例模式:(android:launchMode=”singleInstance”)也叫做全局唯一模式

    1. 特点:
      如果哪个activity设置成这个模式,那么它创建出来的实例会单独的创建一个栈来存放它,并且这个栈有且只有它自己一个实例对象,以后还要启动这个activity,那么只需要交替的显示不同的栈而已

    2. 应用场景:手机的来电显示就是用的是这个模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值