安卓学习笔记之获取Activity的返回值以及Activity的启动模式

             上一次聊了Activity的跳转和通信,虽然可以从一个Activity传数据给另一个被它所开启的Activity,
但是被开启的Activity如何将一些数据返回给前者呢?在实际运用中,常常需要打开一个Activity后,
让它计算处理一些数据后返回结果给前一个Activity,实现的过程主要靠的是三个方法:startActivityForResult、onActivityResul、setResult。
   startActivityForResult(Intent intent, int requestCode),参数intent是开启参数Intent对象对应的Activity,其中 requestCode是用于区分不同Activity的。

   setResult( int resultCode,Intent data);是被开启的Activity用Intent对象以键值对来返回数据给打开它的Activity,resultCode是告诉它要返回数据的Activity它自己的身份。
 

   onActivityResult(int requestCode, int resultCode, Intent data)是当被打开的Activity被销毁之后,该方法会处理返回的数据。Intent对象携带返回的数据,另外两个参数int requestCode, int resultCode都可以用于区分返回数据的Activity的身份,只是一个是自己设定的编号,另一个是被打开的Activity设定的。  
   

      no代码say个JB。。
    下面是一个非常简单的例子:  MainActivity有两个按钮,一个点击跳转到ActivityA,一个跳转到ActivityB。按返回键时,ActivityA返回“open ActivityA”
,ActivityB返回“open ActivityB”,MainActivity将接受的字符串显示在TextView上。
   MainActivity.Java:



public class MainActivity extends Activity {
    /** Called when the activity is first created. */
	private Button A ;
	private Button B;
	private TextView tv;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //根据控件的ID来取得代表控件的对象
       
        A = (Button)findViewById(R.id.A);
        B = (Button)findViewById(R.id.B);
       tv = (TextView) findViewById(R.id.textView1);
       
      
        //将监听器的对象绑定到按钮对象上面
        A.setOnClickListener(new CalculateListener());
        B.setOnClickListener(new CalculateListener());
    }
   
    
   
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		
		String str = data.getStringExtra("who");
		//判断requestCode,由自己的startActivityForResult确定
		if(requestCode == 0)
			
			tv.setText(str);
        if(requestCode == 1)
			
			tv.setText(str);
//		判断resultCode,由打开的Activity的setResult确定
//        if(resultCode == 2)
//			
//			tv.setText(str);
//        if(resultCode == 3)
//			
//			tv.setText(str);
	}



	class CalculateListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			Intent intent = new Intent();
			
			switch(v.getId()){
			//跳转到ActivityA
			case R.id.A:
				intent.setClass(MainActivity.this, ActivityA.class);
				MainActivity.this.startActivityForResult(intent, 0);
				break;
			//跳转到ActivitB	
			case R.id.B:
				intent.setClass(MainActivity.this, ActivityB.class);
				MainActivity.this.startActivityForResult(intent, 1);
				break;
			default:
				break;
			}
			
		}
    }
	
}
  ActivityA:

  

public class ActivityA extends Activity{
	private TextView resultView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.a);
		Intent data = new Intent();
		data.putExtra("who", "open ActivityA");
		//将数据返回,并确定resultCode以向MainAcitivity表明身份
	    setResult(2, data);
		
	}
	

}
  ActivityB:

public class ActivityB extends Activity{
	private TextView resultView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.b);
		Intent data = new Intent();
		data.putExtra("who", "open ActivityB");
		////将数据返回,并确定resultCode以向MainAcitivity表明身份
	    setResult(3, data);
		
	}
	


}

GO!--

MainActivity:


点击按钮“打开ActivityA”:


点击返回键,激动人心的时刻到了!


已经得到返回的数据啦!!

再点击“打开ActivityB”:


后退键:


ActivityB也成功返回了数据!

把注释的这段话

//		判断resultCode,由打开的Activity的setResult确定
//        if(resultCode == 2)
//			
//			tv.setText(str);
//        if(resultCode == 3)
//			
//			tv.setText(str);

恢复,注释掉

//判断requestCode,由自己的startActivityForResult确定
		if(requestCode == 0)
			
			tv.setText(str);
        if(requestCode == 1)
			
			tv.setText(str);

同样也可以实现,试试看吧各位~~~

  

最后说下Activity的启动模式。在android系统中,每个应用都会有一个任务栈的东西管理Activity,每当创建新的Activity实例,就被将该实例压入任务栈中,显示在屏幕的是当前的Activity。当Activity被销毁,就把栈顶Activity弹出栈。Activity的启动模式就和任务栈息息相关。一般有四种启动模式:

   

       1.Standard: 默认的标准模式,调用startActivity就会创建新的Activity的实例,每次添加到任务栈顶。适用于大部分情况。(当栈顶有多个相同的Activit实例的时候会出现按后退键后当前Activity仍然停留在同一个Activtiy的情况)

       2. singleTop: 如果开启的Activity在栈顶(非栈顶还是会创建),则调用startActivity就不会创建新的Activity的实例,不调用onCreate方法而是调用onNewIntent(避免栈顶的Activity被重复创建,避免按后退后仍然在同一个Activity的情况)。

        应用场景:浏览器书签。

        3.singleTask:保证任务栈中只有一个该Activity的实例,若该Activity的实例已经存在于任务栈了,则再次开启会服用之前的实例,并且将在任务栈中于其之上的Activity全部清空!

        应用场景:浏览器Activity。一般用于消耗内存大的Activity实例以节约内存。

        4.singleInstance:单一实例,手机操作系统只有一个实例(不同应用打开也是共享同一个实例)拥有单独、独立的任务栈(即专门开一个任务栈给它用),任务栈只有一个实例。(类似java的单例模式)

        应用场景:手机来电界面。


发布了66 篇原创文章 · 获赞 63 · 访问量 8万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览