Activity多界面跳转

在android开发中Activity相当于web开发的页面,或者说如j2ee开发中对应的jsp页面。在开发jsp时,经常会遇到页面跳转的问题,在android也同样会遇到。以下的几个例子是我对android的Activity跳转的小结,也是最近做项目的小结。 

第一个例子:demo1  
Main—>SecondActivity—>Main 
从流程上看就是从Main跳转到SecondActivity,再从SecondActivity返回到Main。也就是将子Activity的数据返回给父Activity。 
代码如下: 
Java代码   收藏代码
  1. public class Main extends Activity {  
  2.       
  3.     private Button btn;  
  4.     private TextView request_text;  
  5.     private final int FIRST_REQUEST_CODE = 1;  
  6.       
  7.     /** Called when the activity is first created. */  
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.main);  
  12.           
  13.         request_text = (TextView)this.findViewById(R.id.request_text);  
  14.           
  15.         btn = (Button)this.findViewById(R.id.btn);  
  16.         btn.setOnClickListener(new OnClickListener() {  
  17.             public void onClick(View v) {  
  18.                 Intent i = new Intent(Main.this,SecondActivity.class);  
  19.                 i.putExtra("request_text_for_main""从Main传递到SecondActivity");  
  20.                 startActivityForResult(i, FIRST_REQUEST_CODE);  
  21.             }  
  22.         });  
  23.     }  
  24.       
  25.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  26.         super.onActivityResult(requestCode, resultCode, data);  
  27.         if(requestCode==FIRST_REQUEST_CODE && resultCode==Activity.RESULT_OK){  
  28.             if(data != null) {  
  29.                 request_text.setText(data.getStringExtra("request"));  
  30.             }  
  31.         }  
  32.     }  
  33. }  


Java代码   收藏代码
  1. public class SecondActivity extends Activity{  
  2.       
  3.     private TextView request_text;  
  4.     private Button btn;  
  5.     private String text;  
  6.       
  7.     public void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.second);  
  10.           
  11.         request_text = (TextView)this.findViewById(R.id.request_text);  
  12.           
  13.         if (getIntent().getStringExtra("request_text_for_main") != null) {  
  14.             text = getIntent().getStringExtra("request_text_for_main");  
  15.             request_text.setText(text);  
  16.         }  
  17.           
  18.         btn = (Button)this.findViewById(R.id.btn);  
  19.         btn.setOnClickListener(new OnClickListener() {  
  20.             public void onClick(View v) {  
  21.                 Intent i = new Intent();  
  22.                 i.putExtra("request",text+"\n"+"从SecondActivity传递到ThirdActivity");  
  23.                 setResult(Activity.RESULT_OK,i);  
  24.                 finish();  
  25.             }  
  26.         });  
  27.     }  
  28. }  


 
图一 

图一所示是demo初始化的样子,点击“第一次跳转”进入图二。 

 
图二 
图二显示从Main到SecondActivity这个过程,再点击“第二次跳转”即返回Main这个Activity。 

 
图三 
图三表示跳转结束,Button按钮上面的文字记录跳转的过程。 

这个例子最主要是第一个Activity Main设置的onActivityResult()方法和startActivityForResult()方法。 
在Main中通过startActivityForResult()调用SecondActivity,然后在onActivityResult()中获取其返回参数,或者说通过onActivityResult()进行回调。 

SecondActivity中要返回第一个Main必须: 
setResult(Activity.RESULT_OK,i); 
finish(); 


第二个例子:demo2  
Main—>SecondActivity—>ThirdActivity—>Main 
这个例子的流程,比上一个更复杂一些,经历了3个Activity,最好跳转回第一个Activity。 
代码如下: 
Java代码   收藏代码
  1. public class Main extends Activity {  
  2.       
  3.     private Button btn;  
  4.     private TextView request_text;  
  5.     private final int FIRST_REQUEST_CODE = 1;  
  6.       
  7.     /** Called when the activity is first created. */  
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.main);  
  12.           
  13.         request_text = (TextView)this.findViewById(R.id.request_text);  
  14.           
  15.         btn = (Button)this.findViewById(R.id.btn);  
  16.         btn.setOnClickListener(new OnClickListener() {  
  17.             public void onClick(View v) {  
  18.                 Intent i = new Intent(Main.this,SecondActivity.class);  
  19.                 i.putExtra("request_text_for_main""从Main传递到SecondActivity");  
  20.                 startActivityForResult(i, FIRST_REQUEST_CODE);  
  21.             }  
  22.         });  
  23.     }  
  24.       
  25.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  26.         super.onActivityResult(requestCode, resultCode, data);  
  27.         if(requestCode==FIRST_REQUEST_CODE && resultCode==Activity.RESULT_FIRST_USER){  
  28.             if(data != null) {  
  29.                 request_text.setText(data.getStringExtra("request_text_for_third"));  
  30.             }  
  31.         }  
  32.     }  
  33. }  


Java代码   收藏代码
  1. public class SecondActivity extends Activity{  
  2.   
  3.     private TextView request_text;  
  4.     private Button btn;  
  5.     private final int SECOND_REQUEST_CODE = 2;  
  6.     private String text;  
  7.       
  8.     public void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.second);  
  11.           
  12.         request_text = (TextView)this.findViewById(R.id.request_text);  
  13.           
  14.         if (getIntent().getStringExtra("request_text_for_main") != null) {  
  15.             text = getIntent().getStringExtra("request_text_for_main");  
  16.             request_text.setText(text);  
  17.         }  
  18.           
  19.         btn = (Button)this.findViewById(R.id.btn);  
  20.         btn.setOnClickListener(new OnClickListener() {  
  21.             public void onClick(View v) {  
  22.                 Intent i = new Intent(SecondActivity.this,ThirdActivity.class);  
  23.                 i.putExtra("request_text_for_second", text+"\n"+"从SecondActivity传递到ThirdActivity");  
  24.                 startActivityForResult(i, SECOND_REQUEST_CODE);  
  25.             }  
  26.         });  
  27.     }  
  28.       
  29.     @Override  
  30.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {       
  31.         super.onActivityResult(requestCode, resultCode, data);        
  32.         if(requestCode==SECOND_REQUEST_CODE && data != null){  
  33.             setResult(Activity.RESULT_FIRST_USER, data);  
  34.             finish();  
  35.         }  
  36.     }  
  37. }  



Java代码   收藏代码
  1. public class ThirdActivity extends Activity{  
  2.   
  3.     private TextView request_text;  
  4.     private Button btn;  
  5.     private String text;  
  6.       
  7.     public void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.third);  
  10.           
  11.         text = getIntent().getStringExtra("request_text_for_second");  
  12.         request_text = (TextView)this.findViewById(R.id.request_text);  
  13.         request_text.setText(text);  
  14.           
  15.         btn = (Button)this.findViewById(R.id.btn);  
  16.         btn.setOnClickListener(new OnClickListener() {  
  17.             public void onClick(View v) {  
  18.                 Intent i = new Intent();  
  19.                 i.putExtra("request_text_for_third", text+"\n"+"从ThirdActivity再次传递到Main");  
  20.                 setResult(Activity.RESULT_FIRST_USER, i);  
  21.                 finish();  
  22.             }  
  23.         });  
  24.     }  
  25.       
  26. }  


 

 

 

 

这个demo2比起前面的demo1的不同之处在于就是通过ThirdActivity进行跳转到Main。 
在代码上的区别是: 
(1)Main的onActivityResult()方法中,它的resultCode==Activity.RESULT_FIRST_USER而不是前面的resultCode==Activity.RESULT_OK 
(2)SecondActivity中增加了onActivityResult()方法,该方法是用于回调ThirdActivity,并且该方法执行了跳转过程跳转到Main这个Activity。 
(3) ThirdActivity和demo1的SecondActivity很类似。 



第三个例子:demo3  
Main—>SecondActivity—>ThirdActivity—>SecondActivity—>Main 
这个过程看起来复杂,其实不然,最后一步是借助SecondActivity的另一个Button实现的。 
代码如下: 
Java代码   收藏代码
  1. public class Main extends Activity {  
  2.     private Button btn;  
  3.     private TextView request_text;  
  4.     private final int FIRST_REQUEST_CODE = 1;  
  5.       
  6.     /** Called when the activity is first created. */  
  7.     @Override  
  8.     public void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.main);  
  11.           
  12.         request_text = (TextView)this.findViewById(R.id.request_text);  
  13.           
  14.         btn = (Button)this.findViewById(R.id.btn);  
  15.         btn.setOnClickListener(new OnClickListener() {  
  16.             public void onClick(View v) {  
  17.                 Intent i = new Intent(Main.this,SecondActivity.class);  
  18.                 i.putExtra("request_text_for_main""从Main传递到SecondActivity");  
  19.                 startActivityForResult(i, FIRST_REQUEST_CODE);  
  20.             }  
  21.         });  
  22.     }  
  23.       
  24.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  25.         super.onActivityResult(requestCode, resultCode, data);  
  26.         if(requestCode==FIRST_REQUEST_CODE && resultCode==Activity.RESULT_FIRST_USER){  
  27.             if(data != null) {  
  28.                 request_text.setText(data.getStringExtra("final_request"));  
  29.             }  
  30.         }  
  31.     }  
  32. }  


Java代码   收藏代码
  1. public class SecondActivity extends Activity{  
  2.   
  3.     private TextView request_text;  
  4.     private Button btn,finalBtn;  
  5.     private final int SECOND_REQUEST_CODE = 2;  
  6.     private String text;  
  7.       
  8.     public void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.second);  
  11.           
  12.         request_text = (TextView)this.findViewById(R.id.request_text);  
  13.           
  14.         if (getIntent().getStringExtra("request_text_for_main") != null) {  
  15.             text = getIntent().getStringExtra("request_text_for_main");  
  16.             request_text.setText(text);  
  17.         }  
  18.           
  19.         btn = (Button)this.findViewById(R.id.btn);  
  20.         btn.setOnClickListener(new OnClickListener() {  
  21.             public void onClick(View v) {  
  22.                 Intent i = new Intent(SecondActivity.this,ThirdActivity.class);  
  23.                 i.putExtra("request_text_for_second", text+"\n"+"从SecondActivity传递到ThirdActivity");  
  24.                 startActivityForResult(i, SECOND_REQUEST_CODE);  
  25.             }  
  26.         });  
  27.           
  28.         finalBtn = (Button)this.findViewById(R.id.finalBtn);  
  29.         finalBtn.setOnClickListener(new OnClickListener() {  
  30.             public void onClick(View v) {  
  31.                 Intent i = new Intent();  
  32.                 i.putExtra("final_request", text+"\n"+"从SecondActivity最后传递到Main");  
  33.                 setResult(Activity.RESULT_FIRST_USER,i);  
  34.                 finish();  
  35.             }  
  36.         });  
  37.     }  
  38.       
  39.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  40.         super.onActivityResult(requestCode, resultCode, data);  
  41.         if(requestCode==SECOND_REQUEST_CODE && resultCode==Activity.RESULT_OK){  
  42.             if(data != null) {  
  43.                 text = data.getStringExtra("request_text_for_third");  
  44.                 request_text.setText(text);  
  45.             }  
  46.         }  
  47.     }  
  48. }  


Java代码   收藏代码
  1. public class ThirdActivity extends Activity{  
  2.   
  3.     private TextView request_text;  
  4.     private Button btn;  
  5.     private String text;  
  6.       
  7.     public void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.third);  
  10.           
  11.         text = getIntent().getStringExtra("request_text_for_second");  
  12.         request_text = (TextView)this.findViewById(R.id.request_text);  
  13.         request_text.setText(text);  
  14.           
  15.         btn = (Button)this.findViewById(R.id.btn);  
  16.         btn.setOnClickListener(new OnClickListener() {  
  17.             public void onClick(View v) {  
  18.                 Intent i = new Intent();  
  19.                 i.putExtra("request_text_for_third", text+"\n"+"从ThirdActivity再次传递到SecondActivity");  
  20.                 setResult(Activity.RESULT_OK, i);  
  21.                 finish();  
  22.             }  
  23.         });  
  24.     }  
  25. }  


 

 

 

 

 


比起前一个demo2其实没有更复杂之处,只是从ThirdActivity跳转回SecondActivity,而通过SecondActivity的另一个Button来跳转回Main的。
这个实验描述了Activity之间的另外一种切换方式,通常Activity的切换方式是Activity1通过startActivity切换到Activity2, Activity2再通过startActivity切换到其他的Activity,但是有的时候我们需要启动一个新的Activity获取用户的输入,然后返回到原来的Activity,比如activity是一个通讯录列表,我们通过一个增加按钮打开另一个activity让用户输入新的联系人,输入后再返回通讯录列表。 这个时候,我们可以通过startActivityForResult(Intent, int)方法启动新的Activity,新的Activity通过setResult(int, Intent)方法返回老的Activity,这个时候会触发老的Activity的onActivityResult(int, int, Intent)方法,我们可以在这个方法的实现中处理返回事件。 startActivityForResult(Intent, int),其中int为Request Code,也是onActivityResult的第一个参数,通常一个Activity不仅仅只触发一个获取事件,比如上面提到的通讯录,可能会有一个增加联系人的事件,也可能会有一个修改联系人或给指定联系人增加一个电话的事件,但我们只有一个onActivityResult方法,所以我们需要这么一个Request Code区分是哪个事件的返回,这个值是用户自己定义的,而且完全是用户自己进行管理,很人性化。 setResult(int, Intent),其中的int是Result Code,它表示的是返回的状态,也是onActivityResult的第二个参数。这个参数需要特别注意一下,android为这个值提供了三个默认的常量。我们先看前两个,RESULT_CANCELED和RESULT_OK,这个从字面上很好理解,一个是运行取消,另一个是运行成功返回,当用户按BACK键时,Result Code就是RESULT_CANCELED。但我们看看他们分别对应的值,就会发现奇怪的地方,RESULT_CANCELED=0,RESULT_OK=-1!!!在其他系统中OK通常都是1,而在android,它是-1,这是为什么呢,来让我们看看第三个默认的常量,RESULT_FIRST_USER=1,明白了吧!android把所有大于0的数字都留给了用户自己,多么人性化啊!但是要注意了,如我前面所说,大部分系统都喜欢将大于0作为正确返回,小于0作为错误返回,所以很多人(包括我),喜欢用if(result > 0)表示返回成功,这个在android是不通行的,一定要特别注意!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值