startActivity-两种start 方式

对于activity的启动有两种方式

1.startActivity-这种方式比较简单,我们就不做讲解了

2.startActivityForResult-这种启动方式可以实现父子activity双向数据的传递,下面我们就结合demo学习这种启动方式

直接看代码

下面有三个activity(HeadSetActivity-主activity,MyActivity1,MyActivity2),用的是同一个layout(activity_main.xml),具体如下

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" >

    <RelativeLayout
        android:id="@+id/abc"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/tv"
            android:layout_width="match_parent"
            android:layout_height="400dp"
            android:background="@drawable/select"
            android:gravity="center"
            android:textSize="30dp"
            android:text="main_activity"
            android:textColor="#ff0000" />

        <Button
            android:id="@+id/bt1"
            android:layout_width="170dp"
            android:layout_height="100dp"
            android:layout_below="@+id/tv"
            android:src="@drawable/select"
            android:text="activity_1"
            android:textColor="#ff0000" />

        <Button
            android:id="@+id/bt2"
            android:layout_width="170dp"
            android:layout_height="100dp"
            android:layout_alignParentRight="true"
            android:layout_below="@+id/tv"
            android:src="@drawable/select"
            android:text="activity_2"
            android:textColor="#ff0000" />
    </RelativeLayout>

</LinearLayout>

HeadSetActivity

package com.example.alert;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class HeadSetActivity extends Activity {
    private TextView textView;
    private Button button1;
    private Button button2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.tv);
        button1 = (Button) findViewById(R.id.bt1);
        button2 = (Button) findViewById(R.id.bt2);
        button1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                //启动activity1
                Intent intent = new Intent("activity_one");
                startActivityForResult(intent, 1);
            }
        });
        button2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                //启动activity2
                Intent intent = new Intent("activity_two");
                startActivityForResult(intent, 2);
            }
        });

    }
//这个方法主要是接受子activity返回的数据的
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        //requestCode 这个是启动子activity的时候,父activity给予的标签,父分组管理
        //resultCode 这个是子activity返回来的标签,是子activity分组管理
        //data里面是子activity返回来的数据
        if (requestCode == 1) {
            if (resultCode == 10) {
                
                String string = data.getExtras().getString("activity_finish");
                textView.setText("com from activity 1 and finish"+" \n" + string);
                
            } else if (resultCode == 100) {
                
                String string = data.getExtras().getString("activity_no_finish");
                textView.setText("com from activity 1 and no finish"+" \n" + string);
            }
        } else if (requestCode == 2) {
            if (resultCode == 20) {
                textView.setText("com from activity 2 and finish");
            } else if (resultCode == 120) {
                textView.setText("com from activity 2 and no finish");
            }

        }
    }

}

MyActivity1

package com.example.alert;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MyActivity1 extends Activity {
    private TextView textView;
    private Button button1;
    private Button button2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.tv);
        textView.setText("i am activity1");
        button1 = (Button) findViewById(R.id.bt1);
        button1.setText("setresult but no finish");
        button2 = (Button) findViewById(R.id.bt2);
        button2.setText("setresult but and finish");
        button1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Intent intent = new Intent();
                Bundle bundle = new Bundle();
                bundle.putString("activity_no_finish", "i am no finish");
                intent.putExtras(bundle);

                //不传输数据
                //MyActivity1.this.setResult(100);
                //可以传输数据,数字是对应parent 中的resultCode
                MyActivity1.this.setResult(100, intent);

            }
        });
        button2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                Intent intent = new Intent();
                Bundle bundle = new Bundle();
                bundle.putString("activity_finish", "i am finish");
                intent.putExtras(bundle);
                MyActivity1.this.setResult(10,intent);
                finish();
            }
        });

    }

}

MyActivity2

package com.example.alert;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class MyActivity2 extends Activity {
    private TextView textView;
    private Button button1;
    private Button button2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.tv);
        textView.setText("i am activity2");
        button1 = (Button) findViewById(R.id.bt1);
        button1.setText("setresult but no finish");
        button2 = (Button) findViewById(R.id.bt2);
        button2.setText("setresult but and finish");
        button1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                MyActivity2.this.setResult(120);
                
            }
        });
        button2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                MyActivity2.this.setResult(20);
                finish();
            }
        });

    }
}

接下来我们直接演示结果

从上面的结果我们可以总结如下

1.startActivityForResult(intent, 1);第一个参数是父传子数据, 第二个参数是启动组号;

setResult(100, intent),第一个参数是返回组号,第二个参数是返回数据

两个组号定位onActivityResult 方法中的执行项

2.setResult 仅仅是给父activity传递消息跟数据,并不会销毁当前activity,一般我们会在调用setResult方法以后,主动调用finish方法

3.setResult 方法,当启动方式是startActivity的时候,这个方法无效,但也不会有什么异常

4.两个不同的子activity 可以拥有完全一样的启动组好跟返回组号。毕竟onActivityResult方法,只有在子activity返回父activity的时候,才会被触发一次

posted @ 2015-09-23 23:59  小白屋  阅读(4025)  评论(0编辑  收藏  举报