Android基础——Activity的使用



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。


效果图:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值