Activity的三种跳转

本文详细介绍了 Android 开发中 Activity 的三种跳转方式:普通跳转、有返回值的跳转及透传跳转,并提供了具体实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个界面跳转到另一个界面,这就Activity的跳转。我们在开发中常见的跳转有三种。普通跳转、有返回值的跳转、透传跳转。我们先来看一种。


1 . Activity的普通跳转(传值跳转)

这个跳转是最简单的

Intent intent=new Intent();

intent.setClass(this, OtherActivity.class);

intent.setClassName(this, "com.zy.MutiActivity.OtherActivity");  //方法3 此方式可用于打开其它的应用

intent.setComponent(new ComponentName(this, OtherActivity.class));  //方法4

intent.putXXX("key" , value);//传值

startActivity(intent2); //只用Activity的这个方法,因为与有返回值的跳转使用的跳转的方法是不一样的。

2 . Activity有返回值得跳转

先看代码:

发起请求的界面

public class SecondActivity extends Activity {
    private Button but ,but1 ;
    private TextView textView ;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView( R.layout.secondlayout);
        but = (Button) findViewById( R.id.but2);
        but1 = (Button) findViewById( R.id.but22);
        textView = (TextView) findViewById( R.id.text);
        but.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClass( SecondActivity.this , ThirdActivity.class);
                startActivityForResult(intent , 1 ); //第二参数为请求码,代表是从这个界面跳转的。
            }
        });
        but1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
        System.out.println(" =======> onCreate");
    }
    @Override
    protected void onStart() {
        super.onStart();
        System.out.println(" =======> onStart");
    }
    @Override
    protected void onResume() {
        super.onResume();
        System.out.println(" =======> onResume");
    }
    @Override
    protected void onPause() {
        super.onPause();
        System.out.println(" =======> onPause");
    }
    @Override
    protected void onStop() {
        super.onStop();
        System.out.println(" =======> onStop");
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        System.out.println(" =======> onDestroy");
    }
    @Override
    protected void onRestart() {
        super.onRestart();
        System.out.println(" =======> onRestart");
    }


    /**
     * 这个方法用来接收返回值
     * @param requestCode 请求码,当requestCode与上面跳转时传的请求码一样时,说明是这个界面的请求
     * @param resultCode  结果码(是否成功)
     * @param data        返回来的数据保存在这里面
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        System.out.println("===========> onActivityResult");
        if(requestCode == 1 ){
            if(resultCode == Activity.RESULT_OK){
                textView.setText(data.getStringExtra("key"));
            }
        }
    }
}

返回结果的界面 代码:

public class ThirdActivity extends Activity{
    private Button but , but1 ;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView( R.layout.thirdlayout);
        but = (Button) findViewById( R.id.but3);
        but1 = (Button) findViewById( R.id.but33);
        but.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClass( ThirdActivity.this , MainActivity.class);
                startActivity( intent );
            }
        });
        but1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("key" , "有返回值的跳转");
                setResult(Activity.RESULT_OK ,intent ); //Activity.RESULT_OK结果码,OK为成功 , intent保存数据
                finish();
            }
        });
    }
}
看结果:

      

    

图是有点丑了,但能说明效果就可以了。


 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        System.out.println("===========> onActivityResult");
        if(requestCode == 1 ){
            if(resultCode == Activity.RESULT_OK){
                textView.setText(data.getStringExtra("key"));
            }
        }
    }
方法的解析

 requestCode : 这个值是通过startActivityResult( )方法传递过去的Requstcode的请求码,传递过去的是多少这个值就是多少。那么不要这个值是否可以?设想一下,假如ActivityA 界面有两个操作,一个操作是从AcitivityB获取返回的结果,另外一个操作是从ActivityC获取操作,而我们不重写onActivityResult方方法接受返回值,那么如何区分是哪个界面的返回值呢?这个时候就需要判断requestCode值,requestCode 这个值是通过startActivityResult( )方法原封不动的传递过去的,所以我们可以定义一个从B跳转的requestCode 值(假设为  1 ) ,设B的跳转requestCode 值(假设为 2 )。我们就可以在A界面的onActivityResult()方法中根据requestCode值来判断只从那个界面返回的值了,然后做不同的逻辑处理。

resultCode :结果的状态,这个值分别为Activity.CANCE , Activtity.RESULT_OK:OK代表返回值正常,这个时候我们就可以处理结果,如果为canse说明异常这个时候获取不到数据。

data : 返回的数据就保存在这个里面,从这个里面获取数据。

05-12 17:17:30.276 23514-23514/com.example.administrator.sharedpreferences I/System.out: ===========> onActivityResult
05-12 17:17:30.276 23514-23514/com.example.administrator.sharedpreferences I/System.out:  =======> onRestart
05-12 17:17:30.276 23514-23514/com.example.administrator.sharedpreferences I/System.out:  =======> onStart
05-12 17:17:30.276 23514-23514/com.example.administrator.sharedpreferences I/System.out:  =======> onResume

说明onActivityResult()再onRestart()的前面执行。需要注意

2 . Activity的透传跳转。

看代码:

MainActivity

public class MainActivity extends FragmentActivity {
    private boolean tager = false;
    private EditText keyET;
    private EditText valueET;
    private Button insertBtn;
    private Button deleteBtn;
    private Button modifyBtn;
    private Button queryBtn;
    private Button clearBtn;
    private Button startActivity ;
    private TextView textView;
    /** 存储的文件名 */
    public static final String DATABASE = "Database";
    /** 存储后的文件路径:/data/data/<package name>/shares_prefs + 文件名.xml */
    public static final String PATH = "/data/data/code.sharedpreferences/shared_prefs/Database.xml";

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        keyET = (EditText) findViewById(R.id.key);
        valueET = (EditText) findViewById(R.id.value);
        insertBtn = (Button) findViewById(R.id.insert);
        deleteBtn = (Button) findViewById(R.id.delete);
        modifyBtn = (Button) findViewById(R.id.modify);
        queryBtn = (Button) findViewById(R.id.query);
        clearBtn = (Button) findViewById(R.id.clear);
        startActivity = (Button) findViewById( R.id.but1);
        // 用于显示存储文件中数据
        textView = (TextView) findViewById(R.id.content);
        insertBtn.setOnClickListener(new OperateOnClickListener());
        deleteBtn.setOnClickListener(new OperateOnClickListener());
        modifyBtn.setOnClickListener(new OperateOnClickListener());
        queryBtn.setOnClickListener(new OperateOnClickListener());
        clearBtn.setOnClickListener(new OperateOnClickListener());
        startActivity.setOnClickListener( new OperateOnClickListener());
    }

    class OperateOnClickListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            // 获取SharedPreferences对象
            SharedPreferences sp = getSharedPreferences(DATABASE, Activity.MODE_PRIVATE);
            // 获取Editor对象
            SharedPreferences.Editor editor = sp.edit();
            // 获取界面中的信息
            String key = keyET.getText().toString();
            String value = valueET.getText().toString();
            switch (v.getId()) {
                // 插入数据
                case R.id.insert:
                    if(!tager) {
                        editor.putString("1", "123");
                        editor.commit();
                        tager = true;
                    }else{
                        editor.putInt("1", 456);
                         editor.commit();
                        tager = false;
                }
                    textView.setText(MainActivity.this.print());
                    break;
                // 删除数据
                case R.id.delete:
                    //editor.remove(key);
                    int value1 = Integer.valueOf(value);
                    editor.putInt(key, value1);
                    editor.commit();
                    textView.setText(MainActivity.this.print());
                    break;
                // 修改数据
                case R.id.modify:
                    editor.putString(key, value);
                    editor.commit();
                    textView.setText(MainActivity.this.print());
                    break;
                // 查询数据
                case R.id.query:
                    String result = sp.getString(key, "");
                    textView.setText("key=" + key + ",value=" + result);
                    break;
                // 清空所有数据
                case R.id.clear:
                    editor.clear();
                    editor.commit();
                    textView.setText(MainActivity.this.print());
                    break;
                case R.id.but1:
                    Intent intent = new Intent();
                    intent.setClass( MainActivity.this , SecondActivity.class);
                    startActivityForResult(intent , 100);
                    break;
            }
        }
    }

    /** 获取存储文件的数据 */
    private String print() {
        StringBuffer buff = new StringBuffer();
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(PATH)));
            String str;
            while ((str = reader.readLine()) != null) {
                buff.append(str + "/n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return buff.toString();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode  == 100 && resultCode == Activity.RESULT_OK){
            textView.setText(data.getStringExtra("key"));
        }
    }
}


SencedActivity

public class SecondActivity extends Activity {
    private Button but ,but1 ;
    private TextView textView ;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView( R.layout.secondlayout);
        but = (Button) findViewById( R.id.but2);
        but1 = (Button) findViewById( R.id.but22);
        textView = (TextView) findViewById( R.id.text);
        but.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClass( SecondActivity.this , ThirdActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
                startActivity( intent );
                finish();
            }
        });
        but1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
        System.out.println(" =======> onCreate");
    }
    @Override
    protected void onStart() {
        super.onStart();
        System.out.println(" =======> onStart");
    }
    @Override
    protected void onResume() {
        super.onResume();
        System.out.println(" =======> onResume");
    }
    @Override
    protected void onPause() {
        super.onPause();
        System.out.println(" =======> onPause");
    }
    @Override
    protected void onStop() {
        super.onStop();
        System.out.println(" =======> onStop");
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        System.out.println(" =======> onDestroy");
    }
    @Override
    protected void onRestart() {
        super.onRestart();
        System.out.println(" =======> onRestart");
    }
}

ThirdActivity

public class ThirdActivity extends Activity{
    private Button but , but1 ;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView( R.layout.thirdlayout);
        but = (Button) findViewById( R.id.but3);
        but1 = (Button) findViewById( R.id.but33);
        but.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setClass( ThirdActivity.this , MainActivity.class);
                startActivity( intent );
            }
        });
        but1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("key" , "有返回值的跳转");
                setResult(Activity.RESULT_OK ,intent ); //Activity.RESULT_OK结果码,OK为成功 , intent保存数据
                finish();
            }
        });
    }
}

关键在SecondActivtiy 跳转时,Intnet设置Flag标志

看结果:

      















这个实验描述了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、付费专栏及课程。

余额充值