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

Android学习笔记(三)Activity之间的通信

2012-02-09 12:49 204 查看
“最远的旅行是从自已的身体到自己的心”

上次我们初步体验了一下Android中Activity的创建和操作,本次继续学习多个Activity之间的通信,也就是通过intent在两个Activity之间传递数据和切换。

一、Intent的概念

Activity、Service和Broadcast Receiver这些核心组件之间通过消息激活,这个消息就是Intent。

Intent消息可用于当前运行时同应用内部的组件之间或者不同应用的组件之间通信。Intent自身,即一个Intent对象,包含说明一个执行操作的抽象数据结构,传递给执行操作的组件,或者,常见于broadcast的情况,该数据结构用于描述正在执行或者已经发生的事情。

针对组件类型不同,发送Intent有不同的机制:

针对Activity,Context.startActivity()方法传递Intent,启动一个新的Activity,或者Activity.startActivityForResult()方法启动新的Activity做完事情后返回到本Activity来;

针对Service,Context.startService()方法,用于创建一个Service或者传递给已经运行Service一个指令,于此类似,Context.bindService()建立当前组件和Service之间的连接,可选的,如果该Service未运行,可以创建新的实例;

针对Broadcast Receiver,可通过:Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()方法发送Intent给所有感兴趣的broadcast receiver。

在以上各种情况下,Android系统找到适合响应该Intent的activity、service或者broadcast service集合。不会出现重叠现象,即,broadcast intent只会发送给broadcast receiver,而不会发送给Activity或者Service。

Intent对象

Intent对象可绑定一组信息:

接收intent的组件需要的信息,比如需要调用系统照相机Activity,要告知它照片存放的路径;

Android系统需要的信息,比如那个种类的组件可以处理这个Intent,在比如,告知如何启动Activity(比如要求它在哪个task中)。

Intent对象主要包含以下内容:

componnet name,组件名称,可处理这个Intent的组件名称。组件名称是可选的,如果填写,Intent对象会发送给指定组件名称的组件,否则,也可以通过其他Intent信息定位到适合的组件。组件名称是个ComponentName类型的对象,该对象又包括:

目标组件完整的类名,比如:com.example.project.app.FreneticActivity;

在manifest文件中设置的包名,组件的包名和manifest中定义的包名可以不匹配。

action,命名动作的字符串,用于执行动作,或者,在广播的情况下,表示发生的或者要报告的动作。Intent类定义了一组action常量,见API的Intent.ACTION_*。这些是Intent类预制的一些通用action,还有一些action定义在android其他API中。用户可以定义自己的action字符串常量,用于激活自己的应用组件。这需要把应用的包名作为该字串的前缀,比如:com.example.project.SHOW_COLOR。action名称很像java调用的方法名,下面提到的data和extra类似参数和返回值。

data,起到表示数据和数据MIME类型的作用。不同的action是和不同的data类型配套的。比如,action是ACTION_EDIT,那么data要包含要编辑的文档URI。如果action是ACTION_CALL,data可能是tel:前缀后面跟电话号码,在比如action是ACTION_VIEW,data是http:开头的URI,则应该是显示或者下载该uri的内容。在匹配intent到能处理该组件的过程中,data(MIME类型)类型是很重要的。比如,一个组件是可以显示图片数据的而不能播放声音文件。很多情况下,data类型可在URI中找到,比如content:开头的URI,表明数据在设备上,而且有content
provider控制。但是有些类型只能显式的设置。setData()方法只能设置data的uri,setType()可设置MIME类型,setDataAndType()即可设置URI也可设置MIME类型。

category,包含处理intent组件种类的额外信息。对一个Intent可以设置任意多个category描述,和cation类似,Intent类预制了一些category常量,Intent.CATEGORY_*。

extras,可以看作一个Map,通过键值对,可为处理Intent组件提供一些附加的信息。可通过put..()和get..()存取信息。也可以获取Bundle对象,然后通过putExtras()和getExtras()方法存取。

flug,用于多种情况,在intent增加flug,比如可以指示Android如何启动一个activity,比如是否属于或者不属于当前task,以及,处理完毕后activity的归属。这些flag都定义在Intent类的常量中。

二、具体实践

1、在Eclipse中创建一个新的工程,在默认Activity中添加一个Button控件

<TextView
android:id="@+id/textview1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />

<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button"
/>

在Activity中配置控件

TextView mytextview=(TextView)findViewById(R.id.textview1);
Button mybutton=(Button)findViewById(R.id.button1);
mytextview.setText("第一个Activity");
mybutton.setText("启动第二个Activity");

2、添加一个新的Activity

在工程中选择右键-》New-》Class 键入名称,点击Finish

在新的Activity中继承extends Activity 并且复写Oncreat()方法

public class OtherActivity extends Activity
{

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
}

}

3、创建一个新Activity的布局文件other.xml

在layout上点击new-》file 键入other.xml

将main中的内容拷贝的other。Xml中 并且将其中的textview重新编写id

在新Activity中使用other.xml 并且做相应配置

private TextView mytextview;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.other);使用other.xml配置文件
mytextview=(TextView)findViewById(R.id.textview2);
mytextview.setText("这是第二个Activity");
}

4、在原来的Activity 中条件button的监听器

class mybuttonlistener implements OnClickListener{

@Override
public void onClick(View v) {
// TODO Auto-generated method stub

}

}

5、在监听器中添加intent

Intent myintent =new Intent();
myintent.setClass(MyStudy3Activity.this, OtherActivity.class);
MyStudy3Activity.this.startActivity(myintent);

6、切记要在androidmanifest.xml中进行注册。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: