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

【Android开发-9】信息时代,Activity和Activity怎么交流

2014-08-26 18:26 351 查看
前言:在信息时代,人们不必像古代人那样飞鸽传书,随便一个短信、微信、QQ、微博都可以和自己亲爱的小伙伴快速沟通交流。在这样眼花缭乱的信息时代,选择一种合适自己的沟通工具是很有必要的,Android中的Activity与Activity之间的传参方法也是很多种的,在项目中怎么选择信息交互方法,就看项目的需求和自己的经验。

弄例子之前需要了解一个东西:Intent;

书上和网上看到的概念解释都很多,但本人喜欢它的英文意思:意图。你的意图想干嘛,跟它说了就行。比如我要传参,那你在这个Intent中设置完了,到第二个界面通过你设置的意图传参,就可以解析出来。比如你意图要打开界面,你在Intent里面设置好要打开的界面参数,然后通过方法调用就可以。或者更简单的说明就是起传递作用!

开始实战理解:

1.新建个项目:ActivityIntent

2.根据上一篇,创另外一个界面,创建的文件为:activity_first.xml和FirstActivity

activity_first.xml中界面布局的代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<EditText
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text=""
android:layout_centerHorizontal="true" />

<Button
android:id="@+id/close_1"
android:layout_below="@id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="关闭"

/>

</RelativeLayout>


主界面布局文件代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" >

<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="界面之间传参"
android:layout_centerHorizontal="true" />
<Button
android:id="@+id/Open_1"
android:layout_below="@id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Intent传参(第一种)"

/>
<Button
android:id="@+id/Open_2"
android:layout_below="@id/Open_1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Intent传参(第二种)"

/>
<Button
android:id="@+id/Open_3"
android:layout_below="@id/Open_2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Intent传参(第三种)"

/>

</RelativeLayout>


3.把新建的界面布局加入程序,修改下AndroidManifest.xml,在</application>节点前添加内容如下::

<activity
android:name=".FirstActivity"
android:label="@string/app_name" >
</activity>


4.编写入口代码MainActivity如下:

package com.wyz.activityintent;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button intentBtn = (Button)findViewById(R.id.Open_1);
Button intentBtn_2 = (Button)findViewById(R.id.Open_2);
Button intentBtn_3 = (Button)findViewById(R.id.Open_3);

intentBtn.setOnClickListener(new BtnListener());
intentBtn_2.setOnClickListener(new BtnListener());
intentBtn_3.setOnClickListener(new BtnListener());
}

class BtnListener implements OnClickListener {

@Override
public void onClick(View v) {

Intent intent = new Intent(MainActivity.this, FirstActivity.class);

switch(v.getId())
{
case R.id.Open_1:  //第一种

intent.putExtra("name", "wyz_1_");
intent.putExtra("age", 18);
startActivity(intent);
break;

case R.id.Open_2:  //第二种

Bundle bundle = new Bundle();
bundle.putString("name", "wyz_2_");
bundle.putInt("age", 27);

intent.putExtras(bundle);
startActivity(intent);
break;
case R.id.Open_3: //第三种

intent.putExtra("name", "wyz_3_");
intent.putExtra("age", 35);

startActivityForResult(intent, 0);

break;
default:
break;
}
}

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == 0)	//这个请求码对应startActivityForResult(intent, 0);
{
if(resultCode == 1)  //这个请求码对应打开界面的setResult(1, resultIntent);
{
String sRet = data.getStringExtra("return");

Toast.makeText(getApplicationContext(), sRet, Toast.LENGTH_LONG).show();;

}
}

super.onActivityResult(requestCode, resultCode, data);
}
}


4.编写另外一个界面业务代码FirstActivity如下:

package com.wyz.activityintent;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class FirstActivity extends Activity {

int iType=0;	//判断是第几种方法触发,默认0

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first);

EditText text = (EditText)findViewById(R.id.text);
Button close_btn = (Button)findViewById(R.id.close_1);

close_btn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
if(iType == 3)	//等于第三种时,关闭界面返回参数
{
Intent resultIntent = new Intent();
resultIntent.putExtra("return", "Hello wyz");
setResult(1, resultIntent);
FirstActivity.this.finish();
}
else
{
FirstActivity.this.finish();
}
FirstActivity.this.finish();
}
});

Intent intent = getIntent();

String sName = intent.getStringExtra("name");

//int iAge = intent.getIntExtra("age", 0);  //获取参数第一种
int iAge = intent.getExtras().getInt("age");	//获取参数第二种
String sAge = String.valueOf(iAge);
text.setText(sName+sAge);	//设置显示结果

if(sName.compareTo("wyz_3_") == 0)
{
iType = 3;
}

}
}


实战效果:



注:

1.简单理解,第一种主要是用intent直接把参数放入意图中;第二种通过bundle打包参数后放入意图中;第三种就是通过startActivityForResult让意图打开可以返回参数的界面。

2.从资料了解,还有隐式打开界面方法,即在AndroidManifest.xml配置清单中配置好intent-filter意图过滤,说俗点就是给个暗号;然后再程序中给这个暗号,在多个界面时,就会根据这个暗号在AndroidManifest.xml配置中找到对应的启动界面。

a.修改下AndroidManifest.xml,在</application>节点前添加内容改为如下:

<activity
android:name=".FirstActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.wyz.open_1" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>


b.MainActivity中启动界面代码修改如下:

intent.setAction("android.wyz.open_1");
//不加下面这行也行,因为intent的这个属性默认值即系Intent.CATEGORY_DEFAULT
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);


c.暗号信息中很重要的就是action,intent-filter必须包含,名字可以随意自定义;还有一个很重要的就是

<category android:name="android.intent.category.DEFAULT"/>必须包含;如果进一步了解,还可以知道里面还可以配置data,这样通过分配不同参数,暗号就会传达不同信息,多个界面的时候就可以根据暗号打开哪个界面,获取到不同数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: