在一个项目之中,会由多个 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:// | http://www.baidu.com |
2 | 拨打电话 | tel: | tel:13956027313 |
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 | Intent.EXTRA_EMAIL | 用于指定 email | |
5 | Intent.EXTRA_SUBJECT | 用于指定 email | |
6 | 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[] { "xdwangiflytek@gmail.com" }; // 邮件地址
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);
}
}