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

来源:互联网 发布:usb共享网络是什么意思 编辑:程序博客网 时间:2024/06/06 06:46

             上一次聊了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());    }          @Overrideprotected 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{@Overridepublic void onClick(View v) {Intent intent = new Intent();switch(v.getId()){//跳转到ActivityAcase R.id.A:intent.setClass(MainActivity.this, ActivityA.class);MainActivity.this.startActivityForResult(intent, 0);break;//跳转到ActivitBcase 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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的单例模式)

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


1 0
原创粉丝点击