记android学习之路----Activity(4)----Activity之间的跳转与数据传递

本文详细介绍了Android中Activity的两种跳转方式——无参跳转与含参跳转,包括显式Intent与隐式Intent的应用场景及实现方法,并提供了具体的代码示例。

Activity的跳转和数据传递

Activity跳转的类型

activity之间的跳转有两种情况:
   1:无参跳转:Activity之间跳转的时候并不传递数据;
   2:含参跳转:Activiy在跳转的过程中同时传递数据;
接下来,具体看一下各种情况:

无参跳转

无参跳转只是通过activity去启动另一个activity,但是并不会携带参数!

1:通过显式的intent跳转

ActivityA:
核心代码:

  Intent intent = new Intent(ActivityA.this,ActivityB.class);
  startActivity(intent);

具体代码:
ActivityA:
ActivityA.java:

package com.example.lk.myactivityceshi;

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

public class ActivityA extends Activity {
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);
        button = (Button) findViewById(R.id.buttona);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(ActivityA.this,ActivityB.class);
                startActivity(intent);
            }
        });
    }
}

activity_a.xml:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.lk.myactivityceshi.ActivityA">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="ActivityA页面"
        android:textSize="75dp"
        android:id="@+id/textView"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="63dp"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="跳转至ActivityB"
        android:textSize="50dp"
        android:id="@+id/buttona"
        android:layout_marginBottom="63dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentStart="true"/>
</RelativeLayout>

ActivityB.java:

package com.example.lk.myactivityceshi;

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

/**
 * Created by Administrator on 2016/11/21 0021.
 */
public class ActivityB extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);
    }
}

activity_b.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.lk.myactivityceshi.ActivityA">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="ActivityB页面"
        android:textSize="75dp"
        android:id="@+id/textView"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="63dp"/>
</RelativeLayout>

2:通过隐式的intetn跳转—仅仅限制action

核心代码:

Intent intent = new Intent("and.intent.action.MY_ACTION");
startActivity(intent);

注:在本次跳转中只限制了要跳转的目标Activity的action;只要符合该action的activi都会响应!

实例
代码:和上面的代码一致,仅仅是ActivityA需要做修改:

package com.example.lk.myactivityceshi;

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

public class ActivityA extends Activity {
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_a);
        button = (Button) findViewById(R.id.buttona);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //在此处要修改
                Intent intent = new Intent("android.intent.action.MY_ACTION");
                startActivity(intent);
            }
        });
    }
}

AndroidManifest.xml:

        <activity android:name=".ActivityB">
            <intent-filter>
                //在此处自定义action
                <action android:name="android.intent.action.MY_ACTION"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

3:通过隐式inent跳转—限制action和category

核心代码:

Intent intent = new Intent("and.intent.action.MY_ACTION");
intent.addCtegory("and.intent.category.MY_CATEGORY");
startActivity(intent);

注:在本次跳转中设置了两个跳转条件,两个条件都满足的activit就会响应本次跳转!
如果category被设置为default.则同样不用设置addCategory();

具体实例:
AndroidManifest.xml:

        <activity android:name=".ActivityB">
            <intent-filter>
                //在此处自定义action
                <action android:name="android.intent.action.MY_ACTION"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.ABC"/>
            </intent-filter>
        </activity>

ActivityA.java

            public void onClick(View v) {
                Intent intent = new Intent("android.intent.action.MY_ACTION");
                intent.addCategory("android.intent.category.ABC");
                startActivity(intent);
            }

4:通过隐式intent跳转—-传入参数

核心代码:

Intetn intent = new Intent("and.intent.action.MY_ACTION");
intent.addCategory("and.intent.category.MY_CATEGORY");
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity();

注:1在本次跳转中设置了两个跳转条件,并且向目标activity中传入了uri参数,在第二节Activity的注册中讲了一个activity是可以设置他能够响应的uri类型的;
2 在目标activity中,我们设置其and:scheme=”http”,则该activity在满足action/category匹配的情况下,也要求传入的uri参数是http请求,其才能响应!
但是注意;我们设置这个activity可以响应http请求,但是这个activity并不能加载web页面,仅做测试用!
实例:加载web页面/拨打电话;

实例:
加载一个web页面:

#############

转向拨号页面:

拨号页面

5:含参跳转:

在这种情况下,两个activity的切换会为彼此传入参数;

1:A–>B:将数据传入B页面,但是不用接收B页面的数据;
  A:的核心代码:
        Intent intenta = Intent(ActivityA.this,ActivityB.class);
        String aimData = "来自A页面的数据";
        intent.putExtra("data",aimData);
        startActivity(intenta);
  B:的核心代码:
        //获取A页面传过来的数据
        Intent intentb = this.getIntent();
        String rcvData = intentb.getStringExtra("data");
2:A–>B:由A去启动B,并向B传入数据,同时接收由B返回的数据
  A:的核心代码:
        Intent intenta = Intent(ActivityA.this,ActivityB.class);
        String aimData = "来自A页面的数据";
        intent.putExtra("data",aimData);
        startActivityForResult(intenta,cource_ok);


            //接收数据
        public void onActivityResult(int request_code,int result_code,Intent data){
            switch(request_code){
                case 1:
                if(result_code == result_ok){
                    String resultString = data.getStringExtra("data_return");
                    Log.i("returnData",resultString);
                }
            }
        }
  B:的核心代码:
        //获取A页面传过来的数据
        Intent intentb = this.getIntent();
        String rcvData = intentb.getStringExtra("data");

   B向A页面返回数据:

        Intent intentc = new Intent();
        String returnData = "来自B页面返回的数据";
        intentc.putExtra("data_return",returnData);
        setResult(result_ok,intentc);
        finish();

注:

    //在ActivityB中如果不是点下按钮返回A,而是按下返回键,则可拦截返回按钮的点击事件:
        public void onBackPressed(){
                Intent intentc = new Intent();
                String returnData = "来自B页面返回的数据";
                intentc.putExtra("data_return",returnData);
                setResult(result_ok,intentc);
                finish();
        }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值