1,Activity间的跳转:
这里涉及到了Android中另外一个特别重要的组件 Intent ,就像他的字面意思“意图,打算”一样,我们可以把它理解为我们想要去做的事。例如从ActivityA跳转到ActivityB,系统是怎么知道我们要跳转到ActivityB而不是ActivityC或其他的呢,就是通过 Intent 得知的。
这里涉及到两个Activity,一定要在AndroidManifest.xml文件中声明:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.flyingduck.activitydemo1"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.flyingduck.activitydemo1.ActivityA"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.flyingduck.activitydemo1.ActivityB" >
</activity>
</application>
</manifest>
ActivityA.java:
package com.flyingduck.activitydemo1;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class ActivityA extends Activity {
private Button skipBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a_layout);
skipBtn = (Button) findViewById(R.id.activity_a_skip_btn);
skipBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), ActivityB.class);
Bundle arguments = new Bundle();
arguments.putString("someData", "I'm from Activity A!");
intent.putExtras(arguments);
startActivity(intent);
}
});
}
}
这里Intent通过构造函数显式的指明了要跳转到的Activity。自然还有隐式的跳转方法,后面会涉及到。在ActivityA跳转的时候还绑定了一些数据在Intent中,这里是通过Bundle对象绑定的,Bundle类就像一个Map一样,我们可以将数据的键值对放入其中,在取出的时候就可以很轻易的通过键取到对应的值。当然,如果数据较少的话我们可以采用下面的代码完成数据的传递:
Intent intent = new Intent(getApplicationContext(), ActivityB.class);
intent.putExtra(name, value);
startActivity(intent);
ActivityB.java
ActivityB的布局也很简单,只有一个用于显示ActivityA传递过来数据的TextView
package com.flyingduck.activitydemo1;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
public class ActivityB extends Activity {
private TextView showTxt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b_layout);
showTxt = (TextView) findViewById(R.id.activity_b_txt);
Intent intent = getIntent();
Bundle arguments = intent.getExtras();
String text = arguments.getString("someData");
// String text = intent.getStringExtra("someData");
showTxt.setText(text);
}
}
这里通过getIntent()方法可以得到启动当前Activity的Intent,并从中取得数据。当然,取得方法也有两种,根据你绑定数据时方法而异。在取数据的时候也可以设置默认值:
arguments.getString(key, defaultValue);
效果图如下:
2:启动其他Activity并返回结果:
例子情景:在ActivityA中启动ActivityB,并且当从ActivityB回到ActivityA时,返回一些数据到ActivityA。这样便实现了两个Activity间的通信。
首先是配置文件AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.flyingduck.activitydemo1"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.flyingduck.activitydemo1.ActivityA"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.flyingduck.activitydemo1.ActivityB" >
<intent-filter>
<action android:name="com.flyingduck.activitydemo1.B_ACTION" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
</application>
</manifest>
可以注意到这里为ActivityB设置了<intent-filter>属性,它在隐式启动ActivityB时会起到作用。
ActivityA.java
为ActivityA的布局添加一个TextView用于接收返回的数据。
package com.flyingduck.activitydemo1;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class ActivityA extends Activity {
private Button skipBtn;
private TextView showReturnResult;
public static final int REQUEST_CODE = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a_layout);
skipBtn = (Button) findViewById(R.id.activity_a_skip_btn);
showReturnResult = (TextView) findViewById(R.id.activity_a_txt);
skipBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("com.flyingduck.activitydemo1.B_ACTION");
Bundle arguments = new Bundle();
arguments.putString("someData", "I'm from Activity A!");
intent.putExtras(arguments);
startActivityForResult(intent, REQUEST_CODE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE && resultCode == ActivityB.RESULT_CODE) {
String text = data.getExtras().getString("dataFromB");
showReturnResult.setText(text);
}
}
}
注意几点:
1,在创建Intent时,我们没有显式的指明要启动哪个Activity,而是设置了Intent的Action,这与在Manifest中Activity设置的action参数很像。这就意味着,当startActivity时,根据这个意图“intent”,去找到最相近的Activity并启动它。这就是Activity的基本概念。intent 及 intent-filter的用法以后会讲到。
2,这里启动ActivityA时用到的是startActivityForResult(),这表示我们想要从启动的Activity中得到返回数据。怎样得到返回的数据呢?我们需要重写onActivityResult(....)方法,参数中有一个Intent类型的data,返回的数据就封装在其中。3,大家可能注意到了两个code,requestCode 和 resultCode。大家不要疑惑,因为在Android应用中可能不止一个Activity以这种方式工作,我们就可以根据requestCode和resultCode来区分此时返回的data是不是属于该Activity的。
ActivityB.java
package com.flyingduck.activitydemo1;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
public class ActivityB extends Activity {
private TextView showTxt;
public static final int RESULT_CODE = 101;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b_layout);
//取得ActivityA中数据并显示在EditText中
showTxt = (TextView) findViewById(R.id.activity_b_txt);
Intent intent = getIntent();
Bundle arguments = intent.getExtras();
String text = arguments.getString("someData");
showTxt.setText(text);
arguments.clear();
//修改取得的数据返回给ActivityA
arguments.putString("dataFromB", "I'm from Activity B!");
intent.putExtras(arguments);
setResult(RESULT_CODE, intent);
}
}
被启动的ActivityB可以通过setResult(...)将数据返回给启动它的Activity。
效果图: