首页 > 代码库 > 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实现活动之间的交互