Android中两个Activity之间用Intent跳转
2017-04-12 19:19
639 查看
显式Intent和隐式Intent
Intent寻找目标组件的方式
-显示意图:指定一个目标组件通过其name( Component namefield), 由于组件名称通常不会被其它应用程序的开发者知道。所以,显示意图通常用在应用程序内部消息。
-隐式意图:不指定目标组件名称(component
name 是空的),通过Intent Filter来实现的,它一般用在没有明确指出目标组件名称的前提下,一般是用于在不同应用程序之间。
一、显式Intent(意图)
一般情况下,一个Android应用程序中都会存在多个页面,即是多个Activity类,并且在这些Activity之间进行切换通过Intent机制来实现的。在同一个应用程序中切换Activity时,我们通常都知道要启动的Activity具体是哪一个,因此常用显式的Intent来实现的。下面是一个运用显式Intent(意图)的例子实现的页面跳转并传值,同一应用程序中MainActivity启动SecondActivity,下面的代码中,主要是为“测试显式Intent”按钮添加了OnClickListener,使得按钮被点击时执行onClick()方法,onClick()方法中则利用了Intent机制,来启动SecondActivity。
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" 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=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="40sp" android:text="第一个页面" /> <Button android:id="@+id/btnIntent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="测试显式Intent"/> <Button android:id="@+id/btnHideIntent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="测试隐式Intent"/> </LinearLayout>activity_.second.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" 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=".SecondActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="40sp" android:text="第二个页面" /> <TextView android:id="@+id/txtMsg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="30sp" android:textColor="#DB0B0B"/> <Button android:id="@+id/btnBack" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="返回"/> </LinearLayout>
MainActivity.java
package com.example.intent; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { private Button btnIntent,btnHideIntent; public void init(){ btnHideIntent=(Button)findViewById(R.id.btnHideIntent); btnIntent=(Button)findViewById(R.id.btnIntent); //设置按钮事件-采用显示Intent btnIntent.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //显式的声明Intent Intent intent=new Intent(MainActivity.this,SecondActivity.class); intent.putExtra("msg", "通过显式Intent跳转过来的!"); //直接启动SecondActivity startActivity(intent); } }); //设置按钮事件---采用隐式Intent btnHideIntent.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //声明Intent对象 Intent intent=new Intent(); intent.putExtra("msg", "通过隐式Intent跳转过来的!"); //设置Intent的Action属性,值是一个字符串 //自动与AndroidManif.xml文件中的过滤器中的Action的值相匹配 intent.setAction("com.pxty.test"); startActivity(intent); } }); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
SecondActivity.java
package com.example.intent; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class SecondActivity extends Activity { private TextView txtMsg; private Bu 4000 tton btnBack; public void init(){ txtMsg=(TextView)findViewById(R.id.txtMsg); btnBack=(Button)findViewById(R.id.btnBack); //获取传过来的Intent对象 Intent intent=getIntent(); //获取附加信息 String msg=intent.getStringExtra("msg"); txtMsg.setText(msg); //添加返回按钮的监听器 btnBack.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(SecondActivity.this,MainActivity.class); startActivity(intent); } }); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); init(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.second, menu); return true; } }效果图如下:
二、隐式Intent(意图)
隐式Intent需要AndroidManifest.xml(清单配置文件,在bin下)中增加Activity的声明,并设置对应的IntentFilter和Action,才能被Android的应用程序框架所匹配。
两个activity和两个类的代码上面已经存在,下面介绍清单文件中添加Intent(意图)过滤器。在第二个页面的声明部分配置过滤器,并配置action和category的值。
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.intent" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="7" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.intent.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.example.intent.SecondActivity" android:label="@string/title_activity_second" > <!-- 在SecondActivity的声明里添加过滤器 -Action必须要设置与MainActivity中action的值一致 Category:android.intent.category.DEFAULT --> <intent-filter > <action android:name="com.pxty.test"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity> </application> </manifest>效果图如下:
可以看出,两种形式的Intent都成功的实现了两个Activity之间的跳转并且传递了附加值。
显式Intent(意图)由于在创建Intent对象就已经实例化了,并指定了具体的目标组件,所以不需要解析。而隐式的Intent(意图)由于在Intent对象创建初期并没有指定明确的目标组件,仅仅设置了action的值(实际上就是一个字符串),所以需要解析并通过这个action的值与过滤器的值相比较,当二者一致时就会实现跳转并传值。
相关文章推荐
- Android开发 两个Activity之间通过Intent跳转传值
- 使用Intent对象来实现两个(或多个)Activity之间的跳转,并实现在Activity之间传递参数。
- Android使用Intent实现Activity之间的跳转
- Android Intent用法一 实现activity之间跳转 并 传参
- Android--Activity之间的跳转(Intent)
- 用Intent 对象实现两个(多个)Activity之间的跳转和参数传递
- Android:通过Intent在两个Activity之间传递对象(Parcelable)
- Android--fragment与activity及两个fragment之间的跳转实现
- Android Intent实现Activity之间跳转并传值
- 【总结】在两个Activity之间进行跳转时出错原因分析(二)——在AndroidManifest.xml未声明导致
- Android Activity之间跳转出现短暂黑屏的处理方法和intent.setFlags方法中的参数值含义
- Android使用Intent实现Activity之间的跳转
- 用intent实现Android中Activity之间的跳转
- Android笔记(三) 使得Activity之间可以跳转---Intent
- 【Android】使用Intent实现Activity之间的跳转(创建一个Activity的过程)
- Android中两个Activity之间的跳转
- Android 两个Activity之间相互跳转传值 并且关闭之前的Activity
- 利用Intent实现两个Activity之间的跳转
- Android Intent实现Activity之间跳转并传值
- android81--两个Activity之间跳转时必然会执行的是哪几个方法