详解Android的Activity通过Intent来进行Activity与Activity之间传递参数

时间: 2015-05-08 00:54 栏目: Android 浏览: 11486 赞: 11 踩: 0 字体:

以下为本篇文章全部内容:

好些日子没更新博文了,由于最近比较忙所以学习和博客都搁置了一段时间,今天难得有空就把博文更新一下,这次给大家更新的是Android多个Activity之间如果传递参数。大家都知道在web程序当中传参很方便,最常用的就是GET和POST,但在Android里面不像PHP之前那么容易传参怎么办呢?其实传参也很简单,只需借助Intent来完成即可。下面我将给大家介绍一下Intent和其作用。

什么是Intent(意图)

1、Intent是一种运行时绑定(Rruntime binding)机制,在能在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以想Android表达某种请求或者意愿,Android会根据一员的内容选择适合的组件来请求。

2、在这些组件之间的通讯中,主要是由Intent协助完成的。Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intern的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用

3、因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调着的解耦。

4、例如:在一个联系人维护的应用中,当我们在一个联系人列表屏幕(假设对应的Activity为listActivity)上,点击某个联系人后,希望能够跳出该联系人的详细信息(假设对应的Activity为detailActivity)

5、listActivity需要构造一个,这个Intent用于告诉系统,我们要做查看详细资料的动作,此动作对应的对象是某个联系人,然后调用startActivity(Intent intent),将构造成的Intent传入,系统会根据此Intent中的描述,到ManiFest中找到满足此Intent要求的Activity,系统会调用找到的Activity,即为detailActivity,最终传入Intent,detailActivity则会根据此Intent中的描述执行相应的操作

实现页面之间跳转的两种方法

1、startActivity(intent);//无返回值

2、startActivityForResult(intent,requestCode);//有返回值

在类重载onActivityResult方法

onActivityResult(int requestCode,int resultCode,Intent data);//在A页面使用,通过这个方法接收B页面的返回值

setResult(resultCode,data);//在B页面使用,通过这个方法给A页面设置返回值

使用方法

实例化Intent对象第一个参数为当前Activity对象,第二个参数为要跳转到的Activity

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

常用方法

putExtra(key,value);//携带参数发送到另一个页面

putExtras(Bundle b);//传递Bundle类型的数据

startActivity(intent);//启动另一个页面,参数为实例化出来的Intent对象

setClass(当前Activity, 目标Activity.class);//当实例化空构造器的时候,可以通过该方法设置当前Activity和目标Activity

第二个页面获取参数

Intent intent = getIntent();//使用getIntent获取第一个页面传送过来的Intent对象

String name = intent.getStringExtra(key);//获取传送过来的字符串

Bundle b = intent.getExtras();//获取Bundle方式传过来的Bundle

1、静态变量传递数据

目标Activity的静态变量必须为public,否则无法使用

ShowActivity.name = "姓名";//目标Activity.目标Activity定义的静态变量

2、通过putExtra传递数据

        putExtra(key,value);//携带参数发送到另一个页面

        String name = intent.getStringExtra(key);//获取传送过来的字符串

3、剪切板传递数据

通过getSystemService(Context.CLIPBOARD_SERVICE)

ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);

4、全局变量传递数据

创建一个类继承Application在设置变量,并设置get方法获取变量的值

在AndroidManifest.xml的application里面添加android:name=".Defind" //Defind为类名

defind = (Defind) getApplication();//在使用的类里面通过getApplication获取全局变量类的对象

5、数据包Bundle传递数据

Bundle b = new Bundle();//创建Bundle对象

b.putString('name','姓名');//往Bundle对象添加传递的参数

b.putInt('age',1);//往Bundle对象添加传递的参数

intent.putExtras(b);在intent里面添加Bundle对象

Bundle data = intent.getExtras();//获取传递过来的Bundle对象

data.getString('name');//通过Bundle对象的key获取值

data.getInt('age');////通过Bundle对象的key获取值

以上几种就是常用的传递数据的方法,今天我将会给大家讲讲其中四种,因为剪切板我只用过一次,感觉用到的地方不是太多,所以就给大家讲讲常用的剩下几种。

静态变量传递数据:

        静态变量传递数据需要我们在即将打开的Activity当中设置静态变量,然后在第一个Activity对即将打开的Activity的静态变量进行赋值,例如我要在MainActivity点击按钮的时候打开ShowActivity,那么我就在ShowActivity里面设置一个全局的静态变量,然后在MainActivity对该变量进行赋值,可参考下面代码:

MainActivity代码

public class MainActivity extends Activity {
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {
	    @Override
	    public void onClick(View v) {
		// TODO Auto-generated method stub
		Intent intent = new Intent(MainActivity.this, ShowActivity.class);//实例化一个inent    				
		ShowActivity.age = 100;//设置静态变量传递的参数
		startActivity(intent);
            }
	});
    }
}

ShowActivity代码:

public class ShowActivity extends Activity{
    private TextView textview;
    public static int age;
    private Defind defind;
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show);
        textview = (TextView) findViewById(R.id.textview);
        textview.setText("静态变量:"+age);
    }
}

通过putExtra传递数据:

        这个方法我个人比较喜欢这样用,因为我感觉这样很快捷很方便的解决了我传递参数,这个方法跟Bundle传递相类似,也可以说根本就是一样,只是Bundle需要实例化一个Bundle对象添加参数而已。使用putExtra比较方便,只需要在提交的Activity提交然后在即将打开的Activity进行接收就可以了,详细实例参考下面代码:

MainActivity代码

public class MainActivity extends Activity {
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {
	    @Override
	    public void onClick(View v) {
		// TODO Auto-generated method stub
		Intent intent = new Intent(MainActivity.this, ShowActivity.class);//实例化一个inent    				
		intent.putExtra("name", "大家好,我是Sunny");//为putExtra添加需要传递的参数
		startActivity(intent);
            }
	});
    }
}

ShowActivity代码:

public class ShowActivity extends Activity{
    private TextView textview;
    public static int age;
    private Defind defind;
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show);
        textview = (TextView) findViewById(R.id.textview);
        Intent intent = getIntent();//获取一个intent对象
        String name = intent.getStringExtra("name");//获取传递过来的值
        textview.setText("putExtra传参:"+name);
    }
}

全局变量传递数据:

    这个方式支持开发者自己定义一个类来进行传参,但是该类需要在AndroidManifest.xml中声明出来,在AndroidManifest.xml的application里面添加android:name并给name赋值为类名,然后在类里面通过getApplication获取全局变量类的对象,再对该对象进行操作。在实例中我将用三个java源文件来演示分别是Defind.java、MainActivity.java、ShowActivity.java,参考代码如下:

先在AndroidManifest.xml中声明:

在application中添加android:name并且赋值是自己定义的类名

 <application
        android:name=".Defind"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            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=".ShowActivity"
            android:label="@string/app_name"
            ></activity>
    </application>

MainActivity代码:

public class MainActivity extends Activity {
    private Button button;
    private Defind defind;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        defind = (Defind) getApplication();
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {	
	    @Override
	    public void onClick(View v) {
	        // TODO Auto-generated method stub
                Intent intent = new Intent(MainActivity.this, ShowActivity.class);//实例化一个inent
                defind.setQq("327388905");//设置全局变量传递的参数
	        startActivity(intent);
	    }
	});   
    }
}

ShowActivity代码:

public class ShowActivity extends Activity{
    private TextView textview;
    public static int age;
    private Defind defind;
    protected void onCreate(Bundle savedInstanceState){
    	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_show);
	textview = (TextView) findViewById(R.id.textview);
	defind = (Defind) getApplication();//获取全局变量的值
	textview.setText("全局变量:"+defind.getQq());
    }
}

数据包Bundle传递数据:

        该方式跟putExtra很相似,使用的是putExtras,但是在使用putExtras之前我们得先创建一个Bundle对象来存放我们的值,该方式用于传递比较复杂类型的数据。请看下面参考代码:

MainActivity代码:

public class MainActivity extends Activity {
    private Button button;
    private Defind defind;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {
	    @Override
	    public void onClick(View v) {
	        // TODO Auto-generated method stub
	        Intent intent = new Intent(MainActivity.this, ShowActivity.class);//实例化一个inent
		Bundle b = new Bundle();
		b.putString("web", "www.sunnyos.com");
		b.putInt("views",1000);
		intent.putExtras(b);
		startActivity(intent);
	    }
        }); 
    }
}

ShowActivity代码:

public class ShowActivity extends Activity{
    private TextView textview;
    public static int age;
    private Defind defind;
    protected void onCreate(Bundle savedInstanceState){
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_show);
	textview = (TextView) findViewById(R.id.textview);
	Intent intent = getIntent();//获取一个intent对象
	Bundle b = intent.getExtras();
	textview.setText("Bundle提交:"+b.getString("web")+"浏览次数:"+b.getInt("views"));
    }
}

以上几种方式就是我们常用到的Activity与Activity传递数据的方式。我把上面代码都综合到了一个简单的例子里面,大家也可以单独看以上代码,也可以直接全部看下面代码,下面代码我将会把AndroidManifest.xml、Defind.java、MainActivity.java、ShowActivity.java、activity_main.xml、activity_show.xml所用到的java代码和布局文件都放出来

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.sunny"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="21" />

    <application
        android:name=".Defind"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            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=".ShowActivity"
            android:label="@string/app_name"
            ></activity>
    </application>
</manifest>

Defind.java:

public class Defind extends Application {
    public String qq;
	public String getQq() {
	    return qq;
	}

	public void setQq(String qq) {
	    this.qq = qq;
	}
}

MainActivity.java:

public class MainActivity extends Activity {
    private Button button;
    private Defind defind;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        defind = (Defind) getApplication();
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {	
	    @Override
	    public void onClick(View v) {
                // TODO Auto-generated method stub
        	Intent intent = new Intent(MainActivity.this, ShowActivity.class);//实例化一个inent
        	intent.putExtra("name", "我是谁");//为putExtra添加需要传递的参数
        	defind.setQq("327388905");//设置全局变量传递的参数
        	ShowActivity.age = 100;//设置静态变量传递的参数
        	Bundle b = new Bundle();
        	b.putString("web", "www.sunnyos.com");
        	b.putInt("views",1000);
        	intent.putExtras(b);
        	startActivity(intent);
            }
        });    
    }
}

ShowActivity.java:

public class ShowActivity extends Activity{
    private TextView textview;
    public static int age;
    private Defind defind;
    protected void onCreate(Bundle savedInstanceState){
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_show);
	textview = (TextView) findViewById(R.id.textview);
	defind = (Defind) getApplication();//获取全局变量的值
	Intent intent = getIntent();//获取一个intent对象
	String name = intent.getStringExtra("name");//获取putExtra提交的值
	Bundle b = intent.getExtras();
	textview.setText("putExtra提交:"+name+"\r\n静态变量:"+age+"\r\n全局变量:"+defind.getQq()+"\r\nBundle提交:"+b.getString("web")+"浏览次数:"+b.getInt("views"));		
	Button button = (Button) findViewById(R.id.show_button);
	button.setOnClickListener(new OnClickListener() {	
	    @Override
	    public void onClick(View v) {
        	// TODO Auto-generated method stub
		finish();
    	    }
	});
    }
}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

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

activity_show.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView 
        android:id="@+id/textview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
    <Button 
        android:id="@+id/show_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/show_button"
        />
</LinearLayout>

以上代码执行之后的效果图如下:

安卓Intent传参.gif

谢谢大家对本博客的支持,本站专注原创技术文章,三更半夜做实验写文章不易,且看且珍惜博主的心得。请转载带上本文链接注明出处。

扫二维码快速加群:

qun.png

如果大家有什么疑问可以加我QQ327388905进行解答,也可以加入交流群ThinkPHP交流群