Activity组件
activity的生命周期,可以分为三种:完整生命周期,可视生命周期,前台生命周期
(1):完成生命周期
oncreate--onstart(可视了)--onresume(获取焦点)--onpause(失去焦点)--onstop(不可视)--ondestory
可视生命周期 结束
前台生命周期 结束
(2):activity界面之间的跳转
1,创建MyActivity继承activity(创建出我们要的界面),然后在清单文件中配置我们的信息
<activity
android:name="com.itheima.mutliuiapp.MyActivity" (包内名)
android:label="02界面" > (app名字)
</activity>
2,在布局文件中创建MyActivity的xml文件,然后在MyActivity中oncreate()--
--再setContentView(加载创建的布局文件);
3,在mainactivity中创建意图,并且设置需要跳转到的界面
Intent intent = new Intent(this,MyActivity.class); (相当于开启了一个新的界面)
一个应用程序可以有多个界面,在桌面上可以有多个快捷图标
在清单文件的activity的意图过滤器中的
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> (可以产生快捷方式,不想要可以直接删除即可)
</intent-filter>
(3)activity界面跳转时,数据传递
开启一个界面startActivity(intent)
a,在传递数据界面,
intent.putExtra(key,value); //在意图对象里面携带要传递的数据
value:满足基本的八大类型,但是不能直接传入对象,不过可以实现两个接口中的一个就可以
{实现Serializable接口}
{getParcelableExtra 安卓特有的序列化对象}
最后在开启startActivity(intent),
b,在获取数据界面
1,先获取开启我们这个界面的意图对象
Intent intent = getIntent();
2,然后在获取意图对象里面的数据
intent.getXXXExtra(); //获取相对应的数据
我们把需要传递的数据封装到intent对象里面,然后再去startActivity(intent)
传入我们的意图对象,最后在新开起的界面接受我们的intent,在获取相应的数据
这个开启方式,相当于重新开了界面.
(4)开启新的界面获取返回值
a,在MainActivity中,开启方式我们调用
//开启新的界面并且获取返回值 (请求码)
startActivityForResult(intent,requestCode)
b,在B的activity中调用setResult(resultCode,data)方法
//这里是一个空意图
Intent data = new Intent();
//设置结果数据放到意图里面
data.putExtra(key,value);
//把当前界面的数据返回给,开启我的界面
setResult(resultCode,data);
//再关闭当前界面(提高用户体验)
finish();
注意:
当finish执行的时候,当前界面关闭,此时结果数据会传给我们的开启者,
通过onActivityResult()方法
c,最后在调用者界面重写onActivityResult(int requestCode,int resultCode,Intent data)
这个方法的意识是,当我们开启一个新的activity,并且这个activity已经退出了
这个activity会把结果数据传给我们,并且调用onActivityResult()方法
下面是相关代码方便理解:
##开启新界面,获取返回值
String message = smsMessages[position];
//把当前界面的数据,返回给开启我的界面.
Intent data = new Intent();
data.putExtra("message", message);
//告诉上一个界面准备完毕
setResult(0, data);
//把当前界面关闭
finish();
在原界面重写这样一个方法,当新界面被关闭,这个方法会被执行
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
System.out.println("我们开启的新的选择短信的界面被关闭了,结果数据返回到这里");
if (data != null) {
String message = data.getStringExtra("message");
et_message.setText(message);
}
}else if(requestCode == 2) {
System.out.println("我们开启的新的选择联系人界面被关闭了,结果数据返回到这里");
}
super.onActivityResult(requestCode, resultCode, data);
(5)两种意图
##显式意图&隐式意图
* 显式意图,必须要指定被开启的Activity的类名或者路径名.
> 激活自己应用程序内部的组件,推荐使用显式意图,效率高(直接指定了省去遍历步骤)
public void open01(View view) {
Intent intent = new Intent(this,MainActivity.class);
startActivity(intent);
}
* 隐式意图,只需要指定action(动作) 和 data (数据)就可以了. category
> 激活别的应用程序的界面,或者是自己应用程序的某个界面需要暴露给别的应用程序调用.效率低,系统需要遍历全部的清单文件来确定.
>在清单文件中,在这个activity中的文件过滤器里面定义action(包名+要做得什么事情)和category(手机应用一般指定默认的,手表,tv,汽车不是)
>
Intent intent = new Intent();
intent.setAction("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
startActivity(intent);
(5)##Activity的启动模式(和任务栈密切相关)
* standard : 标准的启动模式
> 默认应用场景
* singleTop : 单一顶部模式 配置信息 launchMode属性 = singletop
> 如果Activity已经被开启,并且处于任务栈的栈顶,就不会创建新的Activity,而是复用这个已经开启的Activity. 为了防止出现一些奇怪的用户体验.推荐使用单一顶部模式.整个任务栈可以有多个实例存在.
>应用场景: 短信发送界面.
* singletask: 单一任务栈
>在整个任务栈里面只允许有一个当前Activity的实例存在.
如果要开启的Activity在任务栈中已经存在,直接复用这个已经存在的Activity,并且把这个Activity上面的所有的其他Activity给清空.
>应用场景: 如果一个Activity非常消耗内存和cpu资源,建议把这个Activity做成singletask的模式.浏览器的browserActivity
实际开发中一般主页(都使用的)如果没有使用singletask模式,浪费资源
* singleinstance :单一实例. (一个应用程序一般有一个任务栈,但是也有多个任务栈,如singleinstance)
> 整个手机操作系统只有一个实例存在,并且是运行在自己单独的任务栈里面.
> 相当于java里面的单例模式,我们查看iPhone的源码,可以知道,底层是scoket以流的形式和基站进行传输,当让通话只能一个实例使用设置成singleinstance
> 通话界面的Activity