您的位置:首页 > 移动开发 > Android开发

Android四大组件之Activity

2015-12-13 21:23 465 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: