Android--Activity中使用Intent传值

简介:

Intent,又称为意图,是一种运行时绑定机制,它能在程序运行的过程中链接两个不同的组件(Activity、Service、BroadcastReceiver)。通过Intent,程序可以向Android表达某种请求或意愿,Android会根据意愿的内容选择适当的组件来请求。

    在这些组件之间的通讯中,主要是由Intent协助完成的。Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。

  通过Intent请求Activity,必须在AndroidManifest.xml文件中对被请求的Activity新增标签配置,否则会导致错误。
   
  Intent一般包含两个主要信息,action、data。
  • action:表示这个Intent此次操作的动作。
  • data:表示这次动作涉及的数据。

 

  通过一个例子来展示Activity中使用Intent导向新Activity并传递数据。此程序仅在两个页面之间相互跳转,但是每次跳转会创建新的Activity,所以在startActivity()之后需要调用finish()销毁当前Activity,如果不销毁,多次跳转后,程序的Activity栈中会存放多个Activity,点击设备的返回按钮,会发现会一直向后退。

  主要步骤:

  1. 新建Android项目,增加新布局文件other.xml,新增Activity类otherActivity.class,用于接受Intent并展示other.xml。
  2. 在MainActivity类中,声明一个Intent类,通过Intent的构造函数指明源和目标。
  3. 获得Intent后,使用Intent.putExtra()方法对其传入数据。
  4. 调用Activity.startActivity启动这个Intent。
  5. 在otherActivity类中,使用Activity.getIntent()获得当前Activity的Intent。
  6. 获得Intent后,使用Intent.getXxxExtra()方法获得其中保存的数据。
  7. 在AndroidManifest.xml配置otherActivity节点。

示例代码

步骤2--3:

复制代码
 1 public class MainActivity extends Activity {
 2     private TextView textView;
 3     private Button btn;
 4     @Override
 5     protected void onCreate(Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7         setContentView(R.layout.activity_main);
 8         
 9         textView=(TextView)findViewById(R.id.textView1);
10         btn=(Button)findViewById(R.id.button1);
11         btn.setOnClickListener(new View.OnClickListener() {            
12             @Override
13             public void onClick(View v) {
14                 // Intent构造函数:Intent来源;Intent目的。
15                 Intent intent =new Intent(MainActivity.this,otherActivity.class);
16                 intent.putExtra("data", "当前是页面2,信息来自页面1");
17                 startActivity(intent);//启动Activity
18          finish();
18 } 19 }); 20 } 21 }
复制代码

步骤4--5:

复制代码
 1 public class otherActivity extends Activity {
 2     private Button btn;
 3     private TextView textView;
 4     @Override
 5     protected void onCreate(Bundle savedInstanceState) {
 6         // TODO Auto-generated method stub
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.other);
 9         
10         textView=(TextView)findViewById(R.id.textView2);
11         btn=(Button)findViewById(R.id.button2);
12         
13         //通过Activity.getIntent()获取当前页面接收到的Intent。
14         Intent intent =getIntent();
15         //getXxxExtra方法获取Intent传递过来的数据
16         String msg=intent.getStringExtra("data");
17         textView.setText(msg);
18         
19         btn.setOnClickListener(new View.OnClickListener() {            
20             @Override
21             public void onClick(View v) {                
22                 Intent intent=new Intent(otherActivity.this,MainActivity.class);
23                 startActivity(intent);
24                 finish();
25             }
26         });        
27     }
28 }
复制代码

步骤7:

复制代码
 1     <application
 2         android:allowBackup="true"
 3         android:icon="@drawable/ic_launcher"
 4         android:label="@string/app_name"
 5         android:theme="@style/AppTheme" >
 6         <activity
 7             android:name="cn.bgxt.IntentForAc.MainActivity"
 8             android:label="@string/app_name" >
 9             <intent-filter>
10                 <action android:name="android.intent.action.MAIN" />
11                 <category android:name="android.intent.category.LAUNCHER" />
12             </intent-filter>
13         </activity>
14         <activity android:name=".otherActivity"/>
15     </application>
复制代码

 

从Activity中返回数据

  上面例子中只是介绍了Activity通过Intent传递数据,然而在实际应用中,不仅仅需要向Activity传递数据,而且要从Activity中返回数据,虽然返回数据和传递数据类似,但是还是有部分区别。

  主要区别如下:

  1. 传递数据需要使用Activity.startActivityForResult()方法启动Activity,需要传递请求码,而不是Activity.startActivity()。
  2. 返回数据的时候,调用Activity.setResult()方法设置返回Intent以及返回码。
  3. 需要重写源Activity的onActivityResult()方法以便于接受返回的Intent,在onActivityResult()中会判断请求码和响应码。

  通过一个例子说明从Activity返回数据。此程序有两个Activity,在MainActivity中输入加法运算的计算数,跳转到otherActivity中输入计算结果,并在点击返回后,把计算结果输出到MainActivity中。

示例代码

MainActivity: 

复制代码
 1 public class MainActivity extends Activity {
 2 
 3     private EditText one,two,result;
 4     private Button btn;
 5     
 6     @Override
 7     protected void onCreate(Bundle savedInstanceState) {
 8         super.onCreate(savedInstanceState);
 9         setContentView(R.layout.activity_main);
10         
11         one=(EditText)findViewById(R.id.one);
12         two=(EditText)findViewById(R.id.two);
13         result=(EditText)findViewById(R.id.result);
14         btn=(Button)findViewById(R.id.btnGo);
15         btn.setOnClickListener(new View.OnClickListener() {
16             
17             @Override
18             public void onClick(View v) {
19                 // TODO Auto-generated method stub
20                 int ione=Integer.parseInt(one.getText().toString());
21                 int itwo=Integer.parseInt(two.getText().toString());
22                 
23                 Intent intent=new Intent(MainActivity.this, otherActivity.class);
24                 intent.putExtra("one", ione);
25                 intent.putExtra("two", itwo);                
26                 
27                 //启动需要监听返回值的Activity,并设置请求码:requestCode
28                 startActivityForResult(intent, 1);
29             }
30         }); 
31         
32     }
33     
34     @Override
35     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
36         super.onActivityResult(requestCode, resultCode, data);
37         //当otherActivity中返回数据的时候,会响应此方法
38         //requestCode和resultCode必须与请求startActivityForResult()和返回setResult()的时候传入的值一致。
39         if(requestCode==1&&resultCode==2)
40         {
41             int three=data.getIntExtra("three", 0);
42             result.setText(String.valueOf(three));
43         }
44     }
45 
46     @Override
47     public boolean onCreateOptionsMenu(Menu menu) {
48         // Inflate the menu; this adds items to the action bar if it is present.
49         getMenuInflater().inflate(R.menu.main, menu);
50         return true;
51     }
52 }
复制代码

otherActivity:

复制代码
 1 public class otherActivity extends Activity {
 2     TextView tvShow;
 3     EditText etResult;
 4     @Override
 5     protected void onCreate(Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7         setContentView(R.layout.other);
 8         
 9         tvShow=(TextView)findViewById(R.id.tvShow);
10         etResult=(EditText)findViewById(R.id.etResult);
11         
12         Intent intent=getIntent();
13         int a=intent.getIntExtra("one", 0);
14         int b=intent.getIntExtra("two", 0);
15         tvShow.setText(a+" + "+b+" = "+" ? ");        
16         
17         Button btnResult=(Button)findViewById(R.id.btnReturn);
18         btnResult.setOnClickListener(new View.OnClickListener() {            
19             @Override
20             public void onClick(View v) {
21                 //新声明一个Intent用于存放放回的数据
22                 Intent i=new Intent();
23                 int result=Integer.parseInt(etResult.getText().toString());
24                 i.putExtra("three", result);
25                 setResult(2, i);//设置resultCode,onActivityResult()中能获取到
26                 finish();//使用完成后结束当前Activity的生命周期
27             }
28         });                
29     }
30 }
复制代码

 


本文转自承香墨影博客园博客,原文链接:http://www.cnblogs.com/plokmju/p/3140607.html,如需转载请自行联系原作者


相关文章
|
3月前
|
Android开发 开发者
Android基础知识:什么是Intent?有哪些类型的Intent?
Android基础知识:什么是Intent?有哪些类型的Intent?
50 0
|
6月前
|
存储 SQL 人工智能
Android Activity启动流程一:从Intent到Activity创建
Android Activity启动流程一:从Intent到Activity创建
|
9月前
|
Android开发
关于Android中intent传值问题
关于Android中intent传值问题
57 0
|
4月前
|
Android开发
Android Studio App开发入门之在活动之间传递消息(附源码 超详细必看)(包括显示和隐式Intent,向上一个和下一个Activity发送数据)
Android Studio App开发入门之在活动之间传递消息(附源码 超详细必看)(包括显示和隐式Intent,向上一个和下一个Activity发送数据)
43 0
|
8月前
|
Java API Android开发
Android 中Activity和Intent的详解
Android 中Activity和Intent的详解
75 0
|
8月前
|
Java Android开发
Android 中通过Intent传递类对象,通过实现Serializable和Parcelable接口两种方式传递对象
Android 中通过Intent传递类对象,通过实现Serializable和Parcelable接口两种方式传递对象
76 1
|
10月前
|
Java API 文件存储
Android:常用的隐式 Intent
本篇文章的内容其实是属于上一篇文章(Android 基础知识5:Intent 和 Intent 过滤器)的延伸,考虑到篇幅长度的原因,所以没有把本篇文章的内容写到上一篇文章中,另外单独写成一篇文章还有个好处就是方便读者查阅。这篇文章主要为大家列举了常用的隐式 Intent,大家如果在平时工作中有相关的需求可以直接复制代码使用。
68 0
Android:常用的隐式 Intent
|
10月前
|
XML 存储 前端开发
Android:Intent 和 Intent 过滤器
在前 4 篇文章中,我们介绍了 Android 四大组件的基础知识,四大组件是构成我们 App 的基础,也是 Android 系统设计的最佳体现。各个组件之间完全是解耦的,如果想访问其他组件或者启动其他组件可以使用 Intent 来操作。在四种组件类型中,有三种(Activity、Service 和 Broadcast)均可以通过异步消息 Intent 进行启动。Intent 会在运行时对各个组件进行互相绑定。所以我们可以把 Intent 当作是各个组件之间的信使(无论该组件是自己 App 的还是其他 App)。
51 0
Android:Intent 和 Intent 过滤器
|
API 开发工具 数据库
❤️【Android精进之路-06】真的有必要说说Intent,Intent就仙女的魔法棒❤️
上一篇文章我们详细介绍了Activity组件的创建以及传参。但是其中的关键人物Intent 却没有做过多的介绍。
92 0
|
安全 API Android开发
谈一谈 Android 嵌套 Intent 以及解决方案
谈一谈 Android 嵌套 Intent 以及解决方案
谈一谈 Android 嵌套 Intent 以及解决方案