Android学习笔记一:两个Activity通信

来源:互联网 发布:更改电脑mac地址 编辑:程序博客网 时间:2024/05/09 09:36

出处:http://blog.csdn.net/xiazdong/article/details/7664757


一、Intent与Activity应用

 

0.创建新的Activity步骤

 

在应用中创建新的Acitivity很常见;

步骤1:创建一个class继承Activity

 

步骤2:在Android-manifest.xml中添加<activity>元素

 

比如创建了一个名为SubActivity的Activity,则需要声明如下:

[html] view plain copy
  1. <activity android:name=".SubActivity"></activity>  


 

1.最简单的跳转到新的Activity

程序描述:MainActivity点击按钮后跳转到SubActivity,MainActivity传递一个(name,xiazdong)给SubActivity,并获得显示;

 

效果如下:

 

点击按钮后:

 

IntentActivity.Java

[java] view plain copy
  1. package org.xiazdong;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9.   
  10. public class IntentActivity extends Activity {  
  11.     private Button btn1;  
  12.     @Override  
  13.     public void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.main);  
  16.         btn1 = (Button)this.findViewById(R.id.brn1);  
  17.         btn1.setOnClickListener(new OnClickListener() {  
  18.             @Override  
  19.             public void onClick(View v) {  
  20.                 Intent intent = new Intent();  
  21.                 intent.setClass(IntentActivity.this, SubActivity.class);  //从IntentActivity跳转到SubActivity  
  22.                 intent.putExtra("name""xiazdong");  //放入数据  
  23.                 startActivity(intent);  //开始跳转  
  24.             }  
  25.         });  
  26.     }  
  27. }  


SubActivity.java

[java] view plain copy
  1. package org.xiazdong;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.widget.TextView;  
  7.   
  8. public class SubActivity extends Activity{  
  9.     private TextView tv1;  
  10.     @Override  
  11.     protected void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         this.setContentView(R.layout.sub);  
  14.         tv1 = (TextView)this.findViewById(R.id.tv1);  
  15.         Intent intent = this.getIntent();    //获得当前的Intent  
  16.         Bundle bundle = intent.getExtras();  //获得全部数据  
  17.         String value = bundle.getString("name");  //获得名为name的值  
  18.         tv1.setText(value);  
  19.     }  
  20.   
  21. }  


 

2.带返回值的跳转

 

跳转到新的Activity并在结束后将返回值传给原Activity

程序描述:MainActivity跳转到SubActivity后,SubActivity执行完后返回一个结果码给IntentActivity,执行对应的过程;

程序效果:

点击跳转后执行完第二个Activity后再跳回第一个Activity

 

IntentActivity.java

[java] view plain copy
  1. package org.xiazdong;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8. import android.widget.Button;  
  9. import android.widget.TextView;  
  10.   
  11. public class IntentActivity extends Activity {  
  12.     private Button btn1;  
  13.     private TextView tv1;  
  14.     @Override  
  15.     public void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.main);  
  18.         btn1 = (Button)this.findViewById(R.id.brn1);  
  19.         tv1 = (TextView)this.findViewById(R.id.tv2);  
  20.         btn1.setOnClickListener(new OnClickListener() {  
  21.             @Override  
  22.             public void onClick(View v) {  
  23.                 Intent intent = new Intent();  
  24.                 intent.setClass(IntentActivity.this, SubActivity.class);  
  25.                 startActivityForResult(intent, 100); //requestcode=100  
  26.                   
  27.             }  
  28.         });  
  29.     }  
  30.     @Override  
  31.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  32.         super.onActivityResult(requestCode, resultCode, data);  
  33.         if(requestCode==100&&resultCode==200){  
  34.             Bundle bundle = data.getExtras();  
  35.             String response = bundle.getString("response");  
  36.             tv1.setText(response);  
  37.         }  
  38.     }  
  39.       
  40. }  

 

SubActivity.java

 

[java] view plain copy
  1. package org.xiazdong;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.widget.TextView;  
  7.   
  8. public class SubActivity extends Activity{  
  9.     private TextView tv1;  
  10.     @Override  
  11.     protected void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         this.setContentView(R.layout.sub);  
  14.         tv1 = (TextView)this.findViewById(R.id.tv1);  
  15.         Intent intent = new Intent();  //创建一个Intent  
  16.         intent.putExtra("response""来自2");  
  17.         setResult(200,intent);  //返回码为200  
  18.         finish();  
  19.     }  
  20.   
  21. }  
出处:http://www.cnblogs.com/lijunamneg/archive/2013/02/05/2892616.html

startActivityForResult和setResult详解

startActivityForResult与startActivity的不同之处在于
1、startActivity( ) 
仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。
2、startActivityForResult( ) 
可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,而当这个Text2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的onActivityResult( )方法。

 

相关函数:
startActivityForResult(Intent intent, Int requestCode)
setResut(int resultCode, Intent intent)
onActivityResult(int requestCode, int resultCode, Intent intent)

 

简单例子介绍:

1.跳转的时候不是采用startActivity(intent) 这个方法,而是startActivityForResult(intent, 0)

复制代码
Intent intent=new Intent();intent.setClass(A.this, B.class);Bundle bundle=new Bundle();String str1="aaaaaa";bundle.putString("str1", str1);intent.putExtras(bundle);startActivityForResult(intent, 0);//这里采用startActivityForResult来做跳转,此处的0为一个依据,可以写其他的值,但一定要>=0
复制代码

2.重写onActivityResult方法,用来接收B回传的数据。

复制代码
protected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (resultCode) { //resultCode为回传的标记,我在B中回传的是RESULT_OK   case RESULT_OK:    Bundle b=data.getExtras(); //data为B中回传的Intent    String str=b.getString("str1");//str即为回传的值    break;default:    break;    }}
复制代码

3.在B中回传数据时采用setResult方法,并且之后要调用finish方法。

setResult(RESULT_OK, intent); //intent为A传来的带有Bundle的intent,当然也可以自己定义新的Bundlefinish();//此处一定要调用finish()方法

 

Android activity的setResult()在什么时候调用(重点也是难点)

如果在startActivityForResult起来的Activity里面设置setResult,结果并不会马上返回给parent的Activity,只有当前Activity被finish,结果才会被发送给parent的onActivityResult去处理!

如果一个activity要返回数据到启动它的那个activity,可以调用setResult()方法。那什么时候去调用setResult()方法返回数据呢?
看一下源码就明白了:

复制代码
public final void setResult(int resultCode, Intent data) {        synchronized (this) {            mResultCode = resultCode;            mResultData = data;        }    }    public void finish() {        if (mParent == null) {            int resultCode;            Intent resultData;            synchronized (this) {                resultCode = mResultCode;                resultData = mResultData;            }            if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);            try {                if (ActivityManagerNative.getDefault()                    .finishActivity(mToken, resultCode, resultData)) {                    mFinished = true;                }            } catch (RemoteException e) {                // Empty            }        } else {            mParent.finishFromChild(this);        }    }
复制代码

这段代码可以看出activity返回result是在被finish的时候,也就是说调用setResult()方法必须在finish()之前。
那么如果在如下方法中调用setResult()也有可能不会返回成功: onPause(), onStop(), onDestroy(),
因为这些方法调用不一定是在finish之前的,当然在onCreate()就调用setResult肯定是在finish之前的

按BACK键从一个Activity退出来的,一按BACK,android就会自动调用Activity的finish()方法,然后设置resultCode为RESULT_CANCELED,也就不会返回任何数据了 .
解决方法就是在Activity里面捕获按BACK的事件,捕获到之后先setResult,然后自己来调用finish,就搞定了……把BACK事件直接自己给吞了

@Override    public void onBackPressed() {        Log.i(TAG, "onBackPressed");        setResult(Const.LIVE_OK);        super.onBackPressed();    }

当然还可以在onCreate()就调用setResult,不过我觉得这种方法没有重写onBackPressed()方法好.




在两个Activity之间实现界面切换

1.Java

[java] view plain copy
  1. /** 
  2.  *  
  3.  */  
  4. package com.itest;  
  5.   
  6. import android.app.Activity;  
  7. import android.content.Intent;  
  8. import android.os.Bundle;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.widget.Button;  
  12.   
  13. /** 
  14.  * @author Robin 
  15.  */  
  16. public class ITestP3Activity extends Activity {  
  17.     Button b1;  
  18.     View v1;  
  19.   
  20.     /** Called when the activity is first created. */  
  21.     @Override  
  22.     public void onCreate( Bundle savedInstanceState )  
  23.     {  
  24.         super.onCreate( savedInstanceState );  
  25.         //缓存View1  
  26.         v1 = getLayoutInflater().inflate( R.layout.p31, null );  
  27.         //动态修改v1中内容  
  28.         b1 = (Button) v1.findViewById( R.id.button1 );  
  29.         b1.setOnClickListener( new OnClickListener() {  
  30.             @Override  
  31.             public void onClick( View v )  
  32.             {  
  33.                 Intent in = new Intent();  
  34.                 in.setClassName( getApplicationContext(), "com.itest.ITestP4Activity" );  
  35.                 startActivity( in );  
  36.             }  
  37.         } );  
  38.         //切换到v1  
  39.         setContentView( v1 );  
  40.     }  
  41.       
  42. }  



2.java

[java] view plain copy
  1. /** 
  2.  *  
  3.  */  
  4. package com.itest;  
  5.   
  6. import android.app.Activity;  
  7. import android.content.Intent;  
  8. import android.os.Bundle;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.widget.Button;  
  12.   
  13. /** 
  14.  * @author Robin 
  15.  */  
  16. public class ITestP4Activity extends Activity {  
  17.     Button b1;  
  18.     View v1;  
  19.   
  20.     /** Called when the activity is first created. */  
  21.     @Override  
  22.     public void onCreate( Bundle savedInstanceState )  
  23.     {  
  24.         super.onCreate( savedInstanceState );  
  25.         //缓存View1  
  26.         v1 = getLayoutInflater().inflate( R.layout.p41, null );  
  27.         //动态修改v1中内容  
  28.         b1 = (Button) v1.findViewById( R.id.button1 );  
  29.         b1.setOnClickListener( new OnClickListener() {  
  30.             @Override  
  31.             public void onClick( View v )  
  32.             {  
  33.                 Intent in = new Intent();  
  34.                 in.setClassName( getApplicationContext(), "com.itest.ITestP3Activity" );  
  35.                 startActivity( in );  
  36.             }  
  37.         } );  
  38.         //切换到v1  
  39.         setContentView( v1 );  
  40.     }  
  41.       
  42. }  

切换两个Activity使用了Intent类,其实常用这个类的会有调用拨打电话、发短信等外部程序

要注意的是每次的切换,都是新启动的Activity程序,可以通过下面的代码测试一下

[java] view plain copy
  1. /** 
  2.  *  
  3.  */  
  4. package com.itest;  
  5.   
  6. import android.app.Activity;  
  7. import android.content.Intent;  
  8. import android.os.Bundle;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.widget.Button;  
  12. import android.widget.TextView;  
  13.   
  14. /** 
  15.  * @author Robin 
  16.  */  
  17. public class ITestP3Activity extends Activity {  
  18.     Button b1;  
  19.     Button b2;  
  20.     View v1;  
  21.     TextView tv1;  
  22.   
  23.     /** Called when the activity is first created. */  
  24.     @Override  
  25.     public void onCreate( Bundle savedInstanceState )  
  26.     {  
  27.         super.onCreate( savedInstanceState );  
  28.         //缓存View1  
  29.         v1 = getLayoutInflater().inflate( R.layout.p31, null );  
  30.         //动态修改v1中内容  
  31.         b1 = (Button) v1.findViewById( R.id.button1 );  
  32.         b1.setOnClickListener( new OnClickListener() {  
  33.             @Override  
  34.             public void onClick( View v )  
  35.             {  
  36.                 Intent in = new Intent();  
  37.                 in.setClassName( getApplicationContext(), "com.itest.ITestP4Activity" );  
  38.                 startActivity( in );  
  39.             }  
  40.         } );  
  41.   
  42.         tv1 = (TextView) v1.findViewById( R.id.textView1 );  
  43.           
  44.         b2 = (Button) v1.findViewById( R.id.button2 );  
  45.         b2.setOnClickListener( new OnClickListener() {  
  46.             @Override  
  47.             public void onClick( View v )  
  48.             {  
  49.                 tv1.setText( System.currentTimeMillis()+"" );  
  50.                 // TODO Auto-generated method stub  
  51.             }  
  52.         });  
  53.         //切换到v1  
  54.         setContentView( v1 );  
  55.     }  
  56.       
  57. }  

会发现在切换之前TextView上显示的数字,在切换回来之后消失了

然后按系统的返回键,会一页一页的返回上一页(可以返回到有数字的一页),从而说明每次的切换,都是新启动的Activity程序


0 0