android intent

Intent的中文意思是“意图,目的”的意思,可以理解为不同组件之间通信的“媒介”或者“信使”。
Intent在寻找目标组件的时候有两种方法:第一,通过组件名称直接指定;第二,通过Intent Filter过滤指定
Intent 启动不同组件的方法
   组件名称                 方法名称
   Activity                 startActivity()
                            startActivityForResult()
   Service                  startService()
                            bindService()
   Broadcasts               sendBroadcast()
                            sendOrderedBroadcast()
                            sendStickyBroadcast()

组件间传递数据

  1)Bundle
    intent.putExtras(bundle)
    bundle.putXxx(String key, Xxx data)
    bundle.putSerializable(String key, Serializable data)
    intent=getInten()
    bundle=intent.getExtras()
    xxx=bundle.getXxx()
  2) sub-Activity
    startActivityForResult(Intent intent,int requestCode)
    onActivityResult(int requestCode,int resultCode,Intent intent)

显式Intent定义:对于明确指出了目标组件名称的Intent,我们称之为显式Intent。显式Intent直接用组件的名称定义目标组件,这种方式很直接。但是由于开发人员往往并不清楚别的应用程序的组件名称,因此,显式Intent更多用于在应用程序内部传递消息。比如在某应用程序内,一个Activity启动一个Service。
隐式Intent定义:对于没有明确指出目标组件名称的Intent,则称之为隐式Intent。它不会用组件名称定义需要激活的目标组件,它更广泛地用于在不同应用程序之间传递消息.由于没有明确的目标组件名称,所以必须由Android系统帮助应用程序寻找与Intent请求意图最匹配的组件。

先演示个显示启动的,这个程序用了2个Activity,一个java文件,两个布局文件。

第一步:修改布局文件main.xml,具体代码如下

View Code
 1 <?xml version="1.0" encoding="utf-8"?>
2 <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 >
6 <TextView
7 android:layout_width="fill_parent"
8 android:layout_height="wrap_content"
9 android:text="请输入您的注册信息"
10 android:textSize="20sp"
11 />
12 <TableRow>
13 <TextView
14 android:layout_width="fill_parent"
15 android:layout_height="wrap_content"
16 android:text="用户名 :"
17 android:textSize="16sp"
18 />
19 <!-- 定义一个EditText,用于收集用户的帐号 -->
20 <EditText
21 android:id="@+id/name"
22 android:layout_width="fill_parent"
23 android:layout_height="wrap_content"
24 android:hint="请填写想注册的帐号"
25 android:selectAllOnFocus="false"
26 />
27 </TableRow>
28 <TableRow>
29 <TextView
30 android:layout_width="fill_parent"
31 android:layout_height="wrap_content"
32 android:text="密码 :"
33 android:textSize="16sp"
34 />
35 <!-- 用于收集用户的密码 -->
36 <EditText
37 android:id="@+id/passwd"
38 android:layout_width="fill_parent"
39 android:layout_height="wrap_content"
40 android:password="true"
41 android:selectAllOnFocus="true"
42 />
43 </TableRow>
44 <TableRow>
45 <TextView
46 android:layout_width="fill_parent"
47 android:layout_height="wrap_content"
48 android:text="性别 :"
49 android:textSize="16sp"
50 />
51 <!-- 定义一组单选框,用于收集用户注册的性别 -->
52 <RadioGroup
53 android:layout_width="fill_parent"
54 android:layout_height="wrap_content"
55 android:orientation="horizontal"
56 >
57 <RadioButton
58 android:id="@+id/male"
59 android:layout_width="wrap_content"
60 android:layout_height="wrap_content"
61 android:text="男"
62 android:textSize="16sp"
63 />
64 <RadioButton
65 android:id="@+id/female"
66 android:layout_width="wrap_content"
67 android:layout_height="wrap_content"
68 android:text="女"
69 android:textSize="16sp"
70 />
71 </RadioGroup>
72 </TableRow>
73 <Button
74 android:id="@+id/bn"
75 android:layout_width="wrap_content"
76 android:layout_height="wrap_content"
77 android:text="注册"
78 android:textSize="16sp"
79 />
80 </TableLayout>

第二步:添加一个result的布局文件,代码如下:

View Code
 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical"
6 >
7 <!-- 定义三个TextView,用于显示用户输入的数据 -->
8 <TextView
9 android:id="@+id/name"
10 android:layout_width="fill_parent"
11 android:layout_height="wrap_content"
12 android:textSize="18sp"
13 />
14 <TextView
15 android:id="@+id/passwd"
16 android:layout_width="fill_parent"
17 android:layout_height="wrap_content"
18 android:textSize="18sp"
19 />
20 <TextView
21 android:id="@+id/gender"
22 android:layout_width="fill_parent"
23 android:layout_height="wrap_content"
24 android:textSize="18sp"
25 />
26 </LinearLayout>

第二步:分别编写三个Acitvity,其中一个是Person类是继承了Serializable接口,可以做序列化用

第一个主程序,主要是将数据传送到另一个Activity

View Code
 1 package cn.shaoyangjiang.com;
2
3 import cn.edu.zwu.tel.R;
4 import android.app.Activity;
5 import android.content.Intent;
6 import android.os.Bundle;
7 import android.view.View;
8 import android.view.View.OnClickListener;
9 import android.widget.Button;
10 import android.widget.EditText;
11 import android.widget.RadioButton;
12
13 public class IntentBundleTest01Activity extends Activity
14 {
15
16 public void onCreate(Bundle savedInstanceState)
17 {
18 super.onCreate(savedInstanceState);
19 setContentView(R.layout.main);
20 Button bn = (Button)findViewById(R.id.bn);
21 bn.setOnClickListener(new OnClickListener()
22 {
23
24 public void onClick(View v)
25 {
26 EditText name = (EditText)findViewById(R.id.name);
27 EditText passwd = (EditText)findViewById(R.id.passwd);
28 RadioButton male = (RadioButton)findViewById(R.id.male);
29 String gender = male.isChecked() ? "男 " : "女";
30 Person p = new Person(name.getText().toString()
31 , passwd.getText().toString() , gender);
32 //创建一个Bundle对象
33 Bundle data = new Bundle();
34 data.putSerializable("person", p);
35 //创建一个Intent
36 Intent intent = new Intent(IntentBundleTest01Activity.this
37 , ResultActivity.class);
38 intent.putExtras(data);
39 //启动intent对应的Activity
40 startActivity(intent);
41
42 }
43 });
44 }
45 }

第二个是ResultActivity.java文件,这个主要是用来接受数据,并且把数据显示出来

View Code
 1 package cn.shaoyangjiang.com;
2
3 import cn.edu.zwu.tel.R;
4 import android.app.Activity;
5 import android.content.Intent;
6 import android.os.Bundle;
7 import android.widget.TextView;
8
9 public class ResultActivity extends Activity
10 {
11 @Override
12 public void onCreate(Bundle savedInstanceState)
13 {
14 super.onCreate(savedInstanceState);
15 setContentView(R.layout.result);
16 TextView name = (TextView)findViewById(R.id.name);
17 TextView passwd = (TextView)findViewById(R.id.passwd);
18 TextView gender = (TextView)findViewById(R.id.gender);
19 //获取启动该Result的Intent
20 Intent intent = getIntent();
21 //获取该intent所携带的数据
22 Bundle data = intent.getExtras();
23 //从Bundle数据包中取出数据
24 Person p = (Person)data.getSerializable("person");
25 name.setText("您的用户名为:" + p.getName());
26 passwd.setText("您的密码为:" + p.getPass());
27 gender.setText("您的性别为:" + p.getGender());
28 }
29 }

第三个是 Person.java这个类,主要是做序列化用

View Code
 1 package cn.shaoyangjiang.com;
2
3 import java.io.Serializable;
4
5 public class Person implements Serializable
6 {
7
8 private static final long serialVersionUID = 1L;
9
10 private Integer id;
11 private String name;
12 private String pass;
13 private String gender;
14 //构造方法
15 public Person()
16 {
17 }
18 //方法的覆盖
19 public Person(String name, String pass, String gender)
20 {
21 this.name = name;
22 this.pass = pass;
23 this.gender = gender;
24 }
25 public Integer getId()
26 {
27 return id;
28 }
29 public void setId(Integer id)
30 {
31 this.id = id;
32 }
33 public String getName()
34 {
35 return name;
36 }
37 public void setName(String name)
38 {
39 this.name = name;
40 }
41 public String getPass()
42 {
43 return pass;
44 }
45 public void setPass(String pass)
46 {
47 this.pass = pass;
48 }
49 public String getGender()
50 {
51 return gender;
52 }
53 public void setGender(String gender)
54 {
55 this.gender = gender;
56 }
57
58 }

还要注意的是这2个Activity要在androidmainfest.xml文件里注册

效果图:

演示第二个程序:在子Activity中返回数据到主Acitvity

这里用到了三个Activity和三个布局文件,都相对比较简单。主要知道下面这种方法

 sub-Activity
   startActivityForResult(Intent intent,int requestCode)
   onActivityResult(int requestCode,int resultCode,Intent intent)

首先第一步,修改main.xml布局文件,用来显示主界面,还有subActivity1.xml和subActivity2.xml布局

View Code
 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:orientation="vertical"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent"
6 >
7 <TextView
8 android:id="@+id/textShow"
9 android:layout_width="fill_parent"
10 android:layout_height="wrap_content"
11 android:text=""
12 />
13 <Button
14 android:id="@+id/btn1"
15 android:layout_width="wrap_content"
16 android:layout_height="wrap_content"
17 android:text="启动Activity1"
18 />
19 <Button
20 android:id="@+id/btn2"
21 android:layout_width="wrap_content"
22 android:layout_height="wrap_content"
23 android:text="启动Activity2"
24 />
25 </LinearLayout>

subActivity1.xml

View Code
 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:orientation="vertical"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent"
6 >
7 <TextView
8 android:id="@+id/textShow"
9 android:layout_width="fill_parent"
10 android:layout_height="wrap_content"
11 android:text="SubActivity 1"
12 />
13 <EditText
14 android:id="@+id/edit"
15 android:layout_width="fill_parent"
16 android:layout_height="wrap_content"
17 android:text=""
18 />
19 <Button
20 android:id="@+id/btn_ok"
21 android:layout_width="100dip"
22 android:layout_height="wrap_content"
23 android:text="接受"
24 />
25 <Button
26 android:id="@+id/btn_cancel"
27 android:layout_width="100dip"
28 android:layout_height="wrap_content"
29 android:text="撤销"
30 />
31 />
32 </LinearLayout>

subActivity2.xml

View Code
 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:orientation="vertical"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent"
6 >
7 <TextView
8 android:id="@+id/textShow"
9 android:layout_width="fill_parent"
10 android:layout_height="wrap_content"
11 android:text="SubActivity 2"
12 />
13 <Button
14 android:id="@+id/btn_return"
15 android:layout_width="100dip"
16 android:layout_height="wrap_content"
17 android:text="关闭"
18 />
19 </LinearLayout>

第二步:编写主文件IntentTest02Activity.java文件

View Code
 1 package cn.shaoyangjiang.com;
2
3 import cn.edu.zwu.tel.R;
4 import android.app.Activity;
5 import android.content.Intent;
6 import android.net.Uri;
7 import android.os.Bundle;
8 import android.view.View;
9 import android.view.View.OnClickListener;
10 import android.widget.Button;
11 import android.widget.TextView;
12
13 public class IntentTest02Activity extends Activity {
14 private static final int SUBACTIVITY1 = 1;
15 private static final int SUBACTIVITY2 = 2;
16
17 TextView textView;
18
19 /** Called when the activity is first created. */
20 @Override
21 public void onCreate(Bundle savedInstanceState) {
22 super.onCreate(savedInstanceState);
23 setContentView(R.layout.main);
24
25 textView = (TextView)findViewById(R.id.textShow);
26 final Button btn1 = (Button)findViewById(R.id.btn1);
27 final Button btn2 = (Button)findViewById(R.id.btn2);
28
29 btn1.setOnClickListener(new OnClickListener(){
30 public void onClick(View view){
31 Intent intent = new Intent(IntentTest02Activity.this, SubActivity1.class);
32 startActivityForResult(intent, SUBACTIVITY1);
33 }
34 });
35
36 btn2.setOnClickListener(new OnClickListener(){
37 public void onClick(View view){
38 Intent intent = new Intent(IntentTest02Activity.this, SubActivity2.class);
39 startActivityForResult(intent, SUBACTIVITY2);
40 }
41 });
42 }
43
44 @Override
45 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
46 super.onActivityResult(requestCode, resultCode, data);
47
48 switch(requestCode){
49 case SUBACTIVITY1:
50 if (resultCode == RESULT_OK){
51 Uri uriData = data.getData();
52 textView.setText(uriData.toString());
53 }
54 break;
55 case SUBACTIVITY2:
56 break;
57 }
58 }
59 }

编写SubActivity1.java文件

View Code
 1 package cn.shaoyangjiang.com;
2
3 import cn.edu.zwu.tel.R;
4 import android.app.Activity;
5 import android.content.Intent;
6 import android.net.Uri;
7 import android.os.Bundle;
8 import android.view.View;
9 import android.view.View.OnClickListener;
10 import android.widget.Button;
11 import android.widget.EditText;
12
13 public class SubActivity1 extends Activity {
14
15 @Override
16 public void onCreate(Bundle savedInstanceState) {
17 super.onCreate(savedInstanceState);
18 setContentView(R.layout.subactivity1);
19
20 final EditText editText = (EditText)findViewById(R.id.edit);
21 Button btnOK = (Button)findViewById(R.id.btn_ok);
22 Button btnCancel = (Button)findViewById(R.id.btn_cancel);
23
24 btnOK.setOnClickListener(new OnClickListener(){
25 public void onClick(View view){
26 String uriString = editText.getText().toString();
27 Uri data = Uri.parse(uriString);
28
29 Intent result = new Intent(null, data);
30
31 setResult(RESULT_OK, result);
32 finish();
33 }
34 });
35
36 btnCancel.setOnClickListener(new OnClickListener(){
37 public void onClick(View view){
38 setResult(RESULT_CANCELED, null);
39 finish();
40 }
41 });
42 }
43 }

SubActivity2.java文件

View Code
 1 package cn.shaoyangjiang.com;
2
3 import cn.edu.zwu.tel.R;
4 import android.app.Activity;
5 import android.os.Bundle;
6 import android.view.View;
7 import android.view.View.OnClickListener;
8 import android.widget.Button;
9
10 public class SubActivity2 extends Activity {
11 /** Called when the activity is first created. */
12 @Override
13 public void onCreate(Bundle savedInstanceState) {
14 super.onCreate(savedInstanceState);
15 setContentView(R.layout.subactivity2);
16
17 Button btnReturn = (Button)findViewById(R.id.btn_return);
18
19 btnReturn.setOnClickListener(new OnClickListener(){
20 public void onClick(View view){
21 setResult(RESULT_CANCELED, null);
22 finish();
23 }
24 });
25 }
26 }

这些代码思路都很清晰,比较简单,也比较有用

效果图:










 

原文地址:https://www.cnblogs.com/shaoyangjiang/p/2373939.html