在一个项目之中,会由多个 Activity 程序所组成,那么此时,这么多个 Activity 程序之间就需要进行通讯,而这之间的通讯就依靠 Intent 完成。
Activity 程序支持的 Intent 操作方法:
No. |
方法 |
描述 |
1 |
Public void startActivity(Intent intent) |
启动一个 Activity ,并通过 Intent 传送数据 |
2 |
Public void startActivityForResult(Intent intent, int requestCode) |
启动并接受另一个 Activity 程序回传数据,当 requestCode 大于 0 才可以触发 onActivityResult() |
3 |
Public Intent getIntent() |
返回启动当前 Activity 程序的 Intent |
4 |
Protected void onActivityResult(int requestCode, int resultCode,Intent data) |
当需要接受 Intent 回传数据的时候覆写此方法对回传操作进行处理 |
5 |
Public void finish() |
调用此方法会返回之前的 Activity 程序,并自动调用 onActivityResult() 方法 |
一、 Intent 带返回值
Intent02_Send_Activity.java
package com.iflytek.demo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class Intent02_Send_Activity extends Activity { private Button mybut = null; private TextView msg = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.send_main); this.mybut = (Button) super.findViewById(R.id.mybut); this.msg = (TextView) super.findViewById(R.id.msg); this.mybut.setOnClickListener(new OnClickListenerImpl()); } private class OnClickListenerImpl implements OnClickListener { @Override public void onClick(View v) { Intent intent = new Intent(Intent02_Send_Activity.this, Receive.class); intent.putExtra("myinfo", "你好"); // 带返回值的跳转,如果1大于0,则可以接受 Intent02_Send_Activity.this.startActivityForResult(intent, 1); // 不带返回值的跳转 Intent_Send01Activity.this.startActivity(it); // 跳转 } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { switch (resultCode) { case RESULT_OK: Intent02_Send_Activity.this.msg.setText("返回的内容是:" + intent.getStringExtra("retmsg")); break; case RESULT_CANCELED: Intent02_Send_Activity.this.msg.setText("操作取消。"); break; default: break; } } }
Receive.java
package com.iflytek.demo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class Receive extends Activity { private TextView show = null; private Button retbut = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.receive_main); this.show = (TextView) super.findViewById(R.id.show); this.retbut = (Button) super.findViewById(R.id.retbut); Intent intent = super.getIntent(); // 取得当前的Intent String info = intent.getStringExtra("myinfo"); this.show.setText(info); this.retbut.setOnClickListener(new OnClickListenerImpl()); } private class OnClickListenerImpl implements OnClickListener { @Override public void onClick(View v) { Receive.this.getIntent().putExtra("retmsg", "祖国:中国"); Receive.this.setResult(RESULT_OK, Receive.this.getIntent()); Receive.this.finish(); } } }
前面我们说了 Intent 的基本操作,设置跳转时的数据都是附加数据( Extrs ) , 那么除了这些附加数据之外,也可以传递更多的内容,并且调用本机的一些已经为用户提供好的 Intent 操作。
Intent 数据传递实际上分为以下六种数据:操作( Action )、数据( Data )、数据类型( Type )、操作类别( Category )、附件信息( Extras )、组件( Component )、标志( Flags );
1 、操作( Action ):设置该 Intent 会触发的操作类型,可以通过 setAction() 方法进行设置
No. |
Action 名称 |
AndroidManifest.xml 配置名称 |
描述 |
1 |
ACTION_MAIN |
android.intent.action. MAIN |
作为一个程序的入口,不需要接受数据 |
2 |
ACTION_VIEW |
android.intent.action. VIEW |
用于数据的显示 |
3 |
ACTION_DIAL |
android.intent.action. DIAL |
调用电话拨号程序 |
4 |
ACTION_EDIT |
android.intent.action. EDIT |
用于编辑给定的数据 |
5 |
ACTION_PICK |
android.intent.action. PICK |
从特定的一组数据之中进行数据的选择操作 |
6 |
ACTION_RUN |
android.intent.action. RUN |
运行数据 |
7 |
ACTION_SEND |
android.intent.action. SEND |
调用发送短信程序 |
8 |
ACTION_GET_CONTENT |
android.intent.action. GET_CONTENT |
根据指定的 Type 来选择打开操作内容的 Intent |
9 |
ACTION_CHOOSER |
android.intent.action. CHOOSER |
创建文件操作选择器 |
相当于通过 Action 指定要操作的类型
2 、数据( Data )
描述 Intent 所操作数据的 URI 及类型,可以通过 setData() 进行设置,不同的操作对应着不同的 Data
No. |
操作类型 |
Data(Uri) 格式 |
范例 |
1 |
浏览网页 |
http:// 网页地址 |
|
2 |
拨打电话 |
tel: 电话号码 |
|
3 |
发送短信 |
smsto: 短信接收人号码 |
smsto:13956027313 |
4 |
查找 SD 卡文件 |
file:///sdcard / 文件 or 目录 |
file:///sdcard /pic.jpg |
5 |
显示地图 |
geo: 坐标 , 坐标 |
geo:32,-75 |
这些数据是和跳转的程序接受标准有关。
3 、数据的类型( Type ):指定要传送数据的 MIME 类型,可以直接通过 setType() 方法进行设置。
No. |
作用 |
MIME 类型 |
1 |
发送短信 |
vnd.android-dir/mms-sms |
2 |
设置图片 |
Image/png |
3 |
普通文本 |
Text/plain |
4 |
设置音乐 |
Audio/mp3 |
4 、操作的类别( Category ):对执行操作的类别进行描述,可以通过 addCategory() 方法设置多个类别
No. |
Category 名称 |
AndroidManifest.xml 配置名称 |
描述 |
1 |
CATEGORY_LAUNCHER |
android.intent.category. LAUNCHER |
表示此程序显示在应用程序列表中 |
2 |
CATEGORY_HOME |
android.intent.category. HOME |
显示主桌面,即开机时的第一个界面 |
3 |
CATEGORY_PREFERENCE |
android.intent.category. PREFERENCE |
运行后将出现一个选择面板 |
4 |
CATEGORY_BROWSABLE |
android.intent.category. BROWSABLE |
显示一张图片、 email 信息 |
5 |
CATEGORY_DEFAULT |
android.intent.category. DEFAULT |
设置一个操作的默认执行 |
6 |
CATEGORY_OPENABLE |
android.intent.category. OPENABLE |
当 Action 设置为 GET_CONTENT 时用于打开指定的 Uri |
5 、附件信息( Extras ):传递的是一组键值对,可以使用 pubExtra() 方法进行设置,主要的功能是传递数据( Uri )所需要的一些额外的操作信息
No. |
操作数据 |
附加信息 |
作用 |
1 |
短信操作 |
sms_body |
表示要发送短信的内容 |
2 |
彩信操作 |
Intent.EXTRA_STREAM |
设置发送彩信的内容 |
3 |
指定接收人 |
Intent.EXTRA_BCC |
指定接受 Email 或信息的接收人 |
4 |
Email 接收人 |
Intent.EXTRA_EMAIL |
用于指定 email 的接收人,接受一个数组 |
5 |
Email 标题 |
Intent.EXTRA_SUBJECT |
用于指定 email 邮件的标题 |
6 |
Email 内容 |
Intent.EXTRA_TEXT |
用于指定 email 邮件的内容 |
6 、组件( Component ):指明了将要处理的 Activity 程序,所有的组件信息都被封装在一个 ComponentName 对象之中,这些组件必须在 AndroidManifest.xml 文件的“ <application> ”中注册。
7 、标识( Flags ):用于指示 android 系统如何加载并运行一个操作,可以通过 addFlags() 方法进行增加。
下面我们来看看 Intent 内置功能的范例。
二、打开网页
package com.iflytek.demo; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class Intent03Activity extends Activity { /** Called when the activity is first created. */ private Button mybut = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.main); this.mybut = (Button) super.findViewById(R.id.mybut); // 取得组件 this.mybut.setOnClickListener(new OnClickListenerImpl()); } private class OnClickListenerImpl implements OnClickListener { @Override public void onClick(View v) { Uri uri = Uri.parse("http://xdwangiflytek.iteye.com/"); // 设置操作的路径 Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); // 设置要操作的Action intent.setData(uri); // 要设置的数据 Intent03Activity.this.startActivity(intent); // 执行跳转 } } }
三、拨打电话(进入打电话界面,值填充完成)
package com.iflytek.demo; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class Intent04Activity extends Activity { /** Called when the activity is first created. */ private Button mybut = null; private EditText tel = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.main); this.mybut = (Button) super.findViewById(R.id.mybut); // 取得组件 this.tel = (EditText) super.findViewById(R.id.tel); // 取得组件 this.mybut.setOnClickListener(new OnClickListenerImpl()); } private class OnClickListenerImpl implements OnClickListener { @Override public void onClick(View v) { String telStr = Intent04Activity.this.tel.getText().toString(); // 取得输入信息 Uri uri = Uri.parse("tel:" + telStr); // 设置操作的路径 Intent intent = new Intent(); intent.setAction(Intent.ACTION_DIAL); // 设置要操作的Action intent.setData(uri); // 要设置的数据 Intent04Activity.this.startActivity(intent); // 执行跳转 } } }
四、直接拨打电话呼出
package com.iflytek.demo; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class Intent05Activity extends Activity { /** Called when the activity is first created. */ private Button mybut = null; private EditText tel = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.main); this.mybut = (Button) super.findViewById(R.id.mybut); // 取得组件 this.tel = (EditText) super.findViewById(R.id.tel); // 取得组件 this.mybut.setOnClickListener(new OnClickListenerImpl()); } private class OnClickListenerImpl implements OnClickListener { @Override public void onClick(View v) { String telStr = Intent05Activity.this.tel.getText().toString(); // 取得输入信息 Uri uri = Uri.parse("tel:" + telStr); // 设置操作的路径 Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); // 设置要操作的Action intent.setData(uri); // 要设置的数据 Intent05Activity.this.startActivity(intent); // 执行跳转 } } }
添加权限:
<uses-permission android:name="android.permission.CALL_PHONE" />
五、发送短信息(进入发短信界面,值填充完成)
package com.iflytek.demo; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; public class Intent06Activity extends Activity { /** Called when the activity is first created. */ private Button mybut = null; private EditText tel = null; private EditText content = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.main); this.mybut = (Button) super.findViewById(R.id.mybut); // 取得组件 this.tel = (EditText) super.findViewById(R.id.tel); // 取得组件 this.content = (EditText) super.findViewById(R.id.content); // 取得组件 this.mybut.setOnClickListener(new OnClickListenerImpl()); } private class OnClickListenerImpl implements OnClickListener { @Override public void onClick(View v) { String telStr = Intent06Activity.this.tel.getText().toString(); // 取得输入信息 String note = Intent06Activity.this.content.getText().toString(); // 取得内容 Uri uri = Uri.parse("smsto:" + telStr); // 设置操作的路径 Intent intent = new Intent(); intent.setAction(Intent.ACTION_SENDTO); // 设置要操作的Action intent.putExtra("sms_body", note); // 设置短信内容 intent.setType("vnd.android-dir/mms-sms"); // 短信的MIME类型 intent.setData(uri); // 要设置的数据 Intent06Activity.this.startActivity(intent); // 执行跳转 } } }
六、发送彩信
package com.iflytek.demo; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class Intent07Activity extends Activity { /** Called when the activity is first created. */ private Button mybut = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.main); this.mybut = (Button) super.findViewById(R.id.mybut); // 取得组件 this.mybut.setOnClickListener(new OnClickListenerImpl()); } private class OnClickListenerImpl implements OnClickListener { @Override public void onClick(View v) { Uri uri = Uri.parse("file:///sdcard/mypic.jpg"); // 设置操作的路径 Intent intent = new Intent(); intent.setAction(Intent.ACTION_SEND); // 设置要操作的Action intent.putExtra("address", "13956027313"); // 设置短信内容 intent.putExtra("sms_body", "安徽合肥"); // 设置短信内容 intent.putExtra(Intent.EXTRA_STREAM, uri); // 设置短信内容 intent.setType("image/png"); // 短信的MIME类型 Intent07Activity.this.startActivity(intent); // 执行跳转 } } }
七、发送邮件
package com.iflytek.demo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class Intent08Activity extends Activity { /** Called when the activity is first created. */ private Button mybut = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.main); this.mybut = (Button) super.findViewById(R.id.mybut); // 取得组件 this.mybut.setOnClickListener(new OnClickListenerImpl()); } private class OnClickListenerImpl implements OnClickListener { @Override public void onClick(View v) { Intent emailIntent = new Intent(Intent.ACTION_SEND); emailIntent.setType("plain/text"); // 设置类型 String address[] = new String[] { "[email protected]" }; // 邮件地址 String subject = "xdwang"; String content = "xdwangiflytek.iteye.com"; emailIntent.putExtra(Intent.EXTRA_EMAIL, address); emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject); emailIntent.putExtra(Intent.EXTRA_TEXT, content); Intent08Activity.this.startActivity(emailIntent); // 执行跳转 } } }
八、显示通讯录
package com.iflytek.demo; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; public class Intent09Activity extends Activity { /** Called when the activity is first created. */ private static final int PICK_CONTACT_SUBACTIVITY = 1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.main); Uri uri = Uri.parse("content://contacts/people"); Intent intent = new Intent(Intent.ACTION_PICK, uri); super.startActivityForResult(intent, PICK_CONTACT_SUBACTIVITY); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case PICK_CONTACT_SUBACTIVITY: } } }
九、调用ContentProvider
package com.iflytek.demo; import android.app.Activity; import android.content.ContentUris; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract; import android.widget.Toast; public class Intent10Activity extends Activity { /** Called when the activity is first created. */ private static final int PICK_CONTACT_SUBACTIVITY = 1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.main); Uri uri = Uri.parse("content://contacts/people"); Intent intent = new Intent(Intent.ACTION_PICK, uri); super.startActivityForResult(intent, PICK_CONTACT_SUBACTIVITY); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case PICK_CONTACT_SUBACTIVITY: Uri ret = data.getData(); // 接收返回的数据 String phoneSelection = ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=?"; // 设置查询条件 String[] phoneSelectionArgs = { String.valueOf(ContentUris .parseId(ret)) }; // 返回的ID Cursor c = super.managedQuery( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, phoneSelection, phoneSelectionArgs, null); StringBuffer buf = new StringBuffer(); buf.append("电话号码是:"); for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { buf.append( c.getString(c .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))) .append("、"); } Toast.makeText(this, buf, Toast.LENGTH_LONG).show(); } } }
添加读取权限
<uses-permission android:name="android.permission.READ_CONTACTS" />
十、创建选择器(打开图库)
Intent11Activity.java
package com.iflytek.demo; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageButton; public class Intent11Activity extends Activity { private ImageButton mybut = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.main); this.mybut = (ImageButton) super.findViewById(R.id.mybut); this.mybut.setOnClickListener(new OnClickListenerImpl()); } private class OnClickListenerImpl implements OnClickListener { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setAction(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); Intent11Activity.this.startActivity(Intent.createChooser(intent, "选择图片浏览工具")); } } }
ImageViewActivity.java
package com.iflytek.demo; import android.app.Activity; import android.os.Bundle; import android.widget.ImageView; public class ImageViewActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setTitle("查看图片"); ImageView img = new ImageView(this); img.setImageResource(R.drawable.ic_launcher); super.setContentView(img); } }