首页 > 代码库 > Android: Intent实现活动之间的交互

Android: Intent实现活动之间的交互

  

  Intent的作用:是Android中各个组件直接交互的一种重要方式,且利用Intent可以启动Activity、Service以及Broadcast Receiver。

  Intent的创建:显示和隐式。

  接下来,使用代码演示Intent的各种应用。

  1、首先,创建一个工程,然后在res/layout目录下新建两个布局文件,分别是activity_main.xml和second.xml,代码如下

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.banniyang.intentdome.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="button1"/>
</LinearLayout>

second.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.banniyang.intentdome.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Second Hello World!" />
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="button2"/>
</LinearLayout>

  在activity_main.xml中添加一个TextView和Button,并且标记Button1的唯一ID为button1,

  在second.xml中添加一个TextView和Button,并且标记Button2的唯一ID为button2。

  2、然后在/app/src/main/java目录下新建一个活动second,使其继承AppCompatActivity,然后重写onCreate()方法,代码如下:

public class Second extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second); //layout资源文件下的布局文件
    }
}

  3、在AndroidMainfest.xml工程配置文件中注册活动second

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.banniyang.intentdome">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".Second"></activity>
    </application>

</manifest>

  4、MainActivity.java的具体代码如下

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button1 = (Button) findViewById(R.id.button1);

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 //实现活动之间的跳转,显式构建
                 Intent intent = new Intent(MainActivity.this, Second.class);
                 //启动intent
                 startActivity(intent);
            }
        });
    }
}

  上面Intent的构建采用的是显式的方式,下面用隐式的方法,即不明确指出要启动哪个活动,而是抽象的指定一系列的action和category等信息

  1、打开AndroidManifest.xml文件重新编写activity的内容

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.banniyang.intentdome">

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".Second">
        <intent-filter >
            <action android:name="com.example.intentdome.ACTION_START"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>
</application>

</manifest>

      2.重新编写MainActivity.java的按钮点击事件

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button1 = (Button) findViewById(R.id.button1);

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /*  //实现活动之间的跳转,显式构建
                 Intent intent = new Intent(MainActivity.this, Second.class);
                 //启动intent
                 startActivity(intent);  */
                Intent intent = new Intent("com.example.intentdome.ACTION_START");
                startActivity(intent);
            }
        });
    }
}

  运行可以得到同样的结果。

  使用隐式启动其他程序内部活动

  示例:通过自己本程序去调用系统的浏览器来打开一个博客的网页操作

  重新编写MainActivity.java的按钮点击事件

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button1 = (Button) findViewById(R.id.button1);

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
          //打开浏览器应用
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setData(Uri.parse("http://www.cnblogs.com/longzhongren/"));
                startActivity(intent);
            }
        });
    }
}

  Intent实现活动中数据的传递

     设置数据

   Intetn提供了一个putExtra()方法用于以键-值对的形式进行数据的存放,将传递的数据存放在Intent中,

启动一个活动到另一个活动时,只需要从Intent中获取数据即可

  1、重新编写MainActivity.java的按钮点击事件

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button1 = (Button) findViewById(R.id.button1);

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               Intent intent = new Intent(MainActivity.this,SecondActivity.class);
               intent.putExtra("data", "Hello SecondActivity");
               startActivity(intent);
            }
        });
    }
}

     获取数据

   可以通过getStringExtra()方法获取存放的数据

  2、重新编写Second.java的按钮点击事件

public class Second extends AppCompatActivity {

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

        Button button2 = (Button)findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               String tmp = getIntent().getStringExtra("data");
               Toast.makeText(Second.this, tmp, Toast.LENGTH_SHORT).show();

            }
        });
    }
}

getIntent()解释:Return the intent that started this activity.

技术分享

 

  携带数据返回上一个活动

  1、重新编写MainActivity.java的按钮点击事件

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button1 = (Button) findViewById(R.id.button1);

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               Intent intent = new Intent(MainActivity.this,SecondActivity.class);
               //第一个参数:Intent对象,第二个参数:请求的结果码
               startActivityForResult(intent, 1);
            }
        });
    }
}

  2、重新编写Second.java的按钮点击事件

public class Second extends AppCompatActivity {

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

        Button button2 = (Button)findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                  Intent intent = new Intent();
                  //设置要返回的值
                  intent.putExtra("data_return", "我已经返回上一层了");
                  //设置返回结果
                  setResult(RESULT_OK, intent);
                  //结束当前activity
                  finish();
            }
        });
    }
}

  由于设置了starActivityForReturn()方法来启动Second,在Second被销毁之后会调用一个活动的onActivityResult()方法,所以要

  3、在MainActivity.java中添加onActivityResult()方法

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
            case 1:
                if (resultCode == RESULT_OK) {
                    Toast.makeText(this, data.getStringExtra("data_return"), Toast.LENGTH_SHORT).show();
                }
                break;

            default:
                break;
        }
    }

 

Android: Intent实现活动之间的交互