前言

Intent是一种轻量级的不同活动之间的消息传递机制,能够实现类似于不同活动切换等这类的功能。


活动的创建:

首先要定义三个活动类,本实验用intent进行几个活动之间的切换。分别是:MainActivity、RegisterActivity、WelcomeActivity

活动要在注册表中注册,类似于像系统声明的东西:

AndroidManifest.xml:
</activity>
        <activity android:name="cn.zhuangzhihuang.myintent.WelcomeActivity">
            <intent-filter >
                <action android:name="cn.zhuangzhihuang.myintent.WELCOMEACTIVITY"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
</activity>
<activity android:name="cn.zhuangzhihuang.myintent.RegisterActivity"></activity>

Intent的创建:

通过监听到不同的事件,分别产生一个消息传递,从而打开另一个活动,而之前的Main活动也没有被杀死,而是被暂停了,执行了在生命周期中的onStop()方法。当然,如果登陆成功,也可以将该登陆界面的activity杀死,执行finish()方法就ok。同时Intent有显示意图和隐式意图的构造,以下我们展示显示的构造,顾名思义就是给两个要通信的活动名作为构造参数。

登陆界面切换:
if(input_name.equals(name) && input_password.equals(password)) {
					Intent intent = new Intent(MainActivity.this,WelcomeActivity.class);
					intent.putExtra("name", input_name);
					startActivityForResult(intent, REGISTER1);
					finish();
				}
注册界面切换:
 tv_main_new.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent = new Intent(MainActivity.this, RegisterActivity.class);
				startActivityForResult(intent, REGISTER);
			}
		});

Intent回调

目标的活动完成后回到我们一开始通过Intent过去的活动(假设称它为主调活动,另一个成为被调活动),因为我们是通过startActivityForResult()这个方法过去的,主调活动会执行onActivityResult()这个类似于回调函数的方法,而参数列表中的第一个参数requestCode就是我们刚开始启动这个活动传过去的requestCode。所以我们可以通过这个活动号辨别哪个活动传回消息。
借鉴一篇写的非常好的总结:各个参数的作用总结

在一个主界面(主Activity)通过意图跳转至多个不同子Activity上去,当子模块的代码执行完毕后再次返回主页面,将子activity中得到的数据显示在主界面/完成的数据交给主Activity处理。这种带数据的意图跳转需要使用activity的onActivityResult()方法。
(1)startActivityForResult(Intent intent, int requestCode)
   第一个参数:一个Intent对象,用于携带将跳转至下一个界面中使用的数据,使用putExtra(A,B)方法,此处存储的数据类型特别多,基本类型全部支持。
   第二个参数:如果> = 0,当Activity结束时requestCode将归还在onActivityResult()中。以便确定返回的数据是从哪个Activity中返回,用来标识目标activity。
  与下面的resultCode功能一致,感觉Android就是为了保证数据的严格一致性特地设置了两把锁,来保证数据的发送,目的地的严格一致性。
(2)onActivityResult(int requestCode, int resultCode, Intent data)
  第一个参数:这个整数requestCode用于与startActivityForResult中的requestCode中值进行比较判断,是以便确认返回的数据是从哪个Activity返回的。
  第二个参数:这整数resultCode是由子Activity通过其setResult()方法返回。适用于多个activity都返回数据时,来标识到底是哪一个activity返回的值。
  第三个参数:一个Intent对象,带有返回的数据。可以通过data.getXxxExtra( );方法来获取指定数据类型的数据,
(3)setResult(int resultCode, Intent data)
  在意图跳转的目的地界面调用这个方法把Activity想要返回的数据返回到主Activity,
  第一个参数:当Activity结束时resultCode将归还在onActivityResult()中,一般为RESULT_CANCELED , RESULT_OK该值默认为-1。
  第二个参数:一个Intent对象,返回给主Activity的数据。在intent对象携带了要返回的数据,使用putExtra( )方法。上面由济南大介绍。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		if(requestCode == REGISTER) {
			if(resultCode == RESULT_OK) {
				name = data.getStringExtra("name");
				password = data.getStringExtra("password");
				et_main_user.setText(name);
				et_main_password.setText("");
				et_main_password.requestFocus();
			}
		}
	}

Android代码:

MainActivity:

package cn.zhuangzhihuang.myintent;

import java.util.LinkedList;

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.TextView;
import android.widget.Toast;


public class MainActivity extends Activity {

	protected static final int REGISTER = 0;  //注册
	protected static final int REGISTER1 = 1; //登陆成功
    private String name;
    private String password;
	private EditText et_main_user;
	private EditText et_main_password;
	
	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        et_main_user = (EditText) findViewById(R.id.et_main_user);
        et_main_password = (EditText) findViewById(R.id.et_main_password);
        Button bt_main_login = (Button) findViewById(R.id.bt_main_login);
        TextView tv_main_new = (TextView) findViewById(R.id.tv_main_new);
        
        bt_main_login.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				String input_name = et_main_user.getText().toString().trim();  //
				String input_password = et_main_password.getText().toString().trim();  //
				if(input_name.isEmpty() || input_password.isEmpty()) {
					Toast.makeText(MainActivity.this, "用户名、密码不能为空!", 0).show();
				}
				else if(input_name.equals(name) && input_password.equals(password)) {
					Intent intent = new Intent(MainActivity.this,WelcomeActivity.class);
					intent.putExtra("name", input_name);
					startActivityForResult(intent, REGISTER1);
					finish();
				}
				else {
					Toast.makeText(MainActivity.this, "用户名、密码有误!", 0).show();
				}
			}
		});
        
        tv_main_new.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent = new Intent(MainActivity.this, RegisterActivity.class);
				startActivityForResult(intent, REGISTER);
			}
		});
        
    }
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		if(requestCode == REGISTER) {
			if(resultCode == RESULT_OK) {
				name = data.getStringExtra("name");
				password = data.getStringExtra("password");
				et_main_user.setText(name);
				et_main_password.setText("");
				et_main_password.requestFocus();
			}
		}
	}


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

RegisterActivity:

package cn.zhuangzhihuang.myintent;

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.EditText;
import android.widget.Toast;

public class RegisterActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_register);
		
		final EditText et_register_user = (EditText) findViewById(R.id.et_register_user);
		final EditText et_register_password = (EditText) findViewById(R.id.et_register_password);
		final EditText et_register_surepassword = (EditText) findViewById(R.id.et_register_surepassword);		
		Button bt_register = (Button) findViewById(R.id.bt_register);
		
		
		bt_register.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				String name = et_register_user.getText().toString().trim();
				String password = et_register_password.getText().toString().trim();
				String surepassword = et_register_surepassword.getText().toString().trim();
				
				if(name.equals(null) || name.equals("") || password.equals(null) || password.equals("") || surepassword.equals(null) || surepassword.equals("")) {
					Toast.makeText(RegisterActivity.this, "用户名、密码、确认密码不能为空!", 0).show();
				}
				else if(!password.equals(surepassword)) {
					Toast.makeText(RegisterActivity.this, "密码与确认密码不一致!", 0).show();
				}
				else {
					Intent info = new Intent();
					info.putExtra("name", name);
					info.putExtra("password", password);
					setResult(RESULT_OK,info);
					finish();
				}
			}
		});
	}
}

WelcomeActivity:

package cn.zhuangzhihuang.myintent;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class WelcomeActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub 
		
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_welcome);
		
		TextView tv_welcome_show = (TextView) findViewById(R.id.tv_welcome_show);
		
		Intent intent = getIntent();//获取启动这个activity的那个intent,用于传递用户名
		String name = intent.getStringExtra("name");
		tv_welcome_show.setText(name+",欢迎您!");
	}
}