意图打开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的两种注册方式
- 显式注册
注册方式:
直接在清单文件的节点下添加这个一个节点就可以,
name设置成这个activity文件的全路径
- 隐式注册
注册方式:
比上面的多一步
在activity节点里还要添加一个意图过滤器,
里面有两个属性和是一定要添加的还有一个可以不添加
<– action,这个的那么可以随便定义,一般是:(包名.action.xxx)和 category都必须写上 –>
<– 一般可以用默认的 –>
<– 还有一个data节点,需要的话也可以写,这边写了,那么那边意图传递的时候也就一定要写data –>
传递自定义对象时的操作
- Serializable:java中的序列化数据
- 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关闭之后返回来的数据,也就是数据的反向传递
步骤
启动界面,等待结果
Intent intent = new Intent(this,SmsListActivity.class); //startActivity(intent);//启动一个新的界面,但是不需要返回结果 //1. 启动下一个界面,然后等待结果的返回 startActivityForResult(intent,0);
在下一个界面设置返回的结果
Intent intent = new Intent(); intent.putExtra("sms", objects[position]); //2.返回结果 setResult(1, intent);
关闭下一个界面
//3.关闭当前界面 finish();
在当前界面重写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的生命周期
- 正常的生命周期是:
- onCreate()–onStart()–onResume()–onPause()–onStop()–onDestroy()
- 打开一个界面到我们可以操作这个界面的生命周期是:
- onCreate()–onStart()–onResume()
- 把打开的这个界面按返回键退出的生命周期是:
- onPause()– onStop()–onDestroy()
- 一个打开的可操作的界面点击home键退出时的生命周期
- onPause()–onStop()
- 一个程序正在运行着,突然来了电话,这时的生命周期是:
- onPause()–onStop()
- 在一个activity A中启动了activity B,并完全覆盖A的界面,这时候按回退键再从B返回到A,那 么A在回退过程中调用了它的哪些生命周期方法 :(B界面完全覆盖A界面)
- onRestart–>onStart–>onResume
- 你的手机界面没有设置任意的参数,当你的手机旋转屏幕后,当前界面的生命周期是:
- onPause()–onStop()–onDestroy()–onCreate()–onStart()–onResume()
Activity的四个启动模式
要理解启动模式,的先了解”任务栈”这个概念
task:任务
- 一般一个程序包含多个界面,一般一个界面就是用于处理数据交互的task(任务);
栈:
- 是一种特殊的数据结构,遵循先进后出的原则
所以:
任务栈就是用于记录当前程序打开过哪一些界面,方便下次用户返回的时候显示前面的界面,如果一个栈里没有了任何任务,那么说明这是一个空栈,表明当前的应用已经完全退出.
一个应用可以有一个任务或多个任务栈(当启用了singleInstance模式就有多个)
启动模式分四种(因为不同模式在任务栈中的保存的方式不同,也就会出现不同的效果)
默认模式:(android:launchMode=”standard”)在清单文件的activity节点的属性位置设置
- 特点:只要这个界面被启动了多少次就会产生多少个实例被压到栈顶.
单一顶部模式(android:launchMode=”singleTop”)在清单文件的activity节点的属性位置设置
特点:
如果一个activity设置成了这种模式,但凡这个activity位于栈顶,也就是显示在屏幕上的时候, 如果还想在启动它,是不会再创建新的实例了,还是使用栈顶的这个实例.应用场景:为了避免自己启动自己,而出现一些奇怪的问题,例如:短信编辑界面
单一任务模式:(android:launchMode=”singleTask”)在清单文件的activity节点的属性位置设 置
特点:
如果一个activity设置成了这种模式,假设前面已经在栈中存在过这个activity的实例,那么接下来不会再创建新的实例,而是把前面的那个实例直接移动到栈顶显示,并且会把前面那个实例与栈顶中间的那些别的activity的实例给全部的销毁掉应用场景:一般一个程序界面非常的消耗内存和cpu的时候,就把这个界面设置成singleTask模式:例如:浏览器界面
单例模式:(android:launchMode=”singleInstance”)也叫做全局唯一模式
特点:
如果哪个activity设置成这个模式,那么它创建出来的实例会单独的创建一个栈来存放它,并且这个栈有且只有它自己一个实例对象,以后还要启动这个activity,那么只需要交替的显示不同的栈而已应用场景:手机的来电显示就是用的是这个模式