一、什么是Intent?
Intent的中文意思是目的。在Android中也是“目的”的意思。就是我们要去哪里,从这个activity要前往另一个Activity就需要用到Intent。
第一种:直接启动一个Activity
//定义一个IntentIntent intent = new Intent(IntentDemo.this, AnotherActivity2.class);//启动ActivitystartActivity(intent);
以上示例代码的作用是从IntentDemo这个activity切换到AnotherActivity2。这是Intent其中一种构造方法,指定两个Activity。为什么需要指定两个活动呢?因为在Android中有一个活动栈,这样的构造方式才能确保正确的将前一个活动压入栈中,才能在触发返回键的时候活动能够正确出栈。
注意:所有的Activity都必须先在AndroidManifest.xml里面配置声明。以下为本文用到的程序配置文件
第二种:启动另一个Activity并返回结果
作用:当从第二个Activity回跳到前一个Activity的时候,就不再需要使用startActivity,也就是说不用两次使用startActivity方法startActivityForResult(Intent intent, Int requestCode)intent 传给要跳转的Activity的数据和动作requestCode >=0就好,随便用于在onActivityResult()区别哪个子模块回传的数据,如果还有C.java ,D甚至E子模块的话,每个区分开不同的requestCode就好。
public class MainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //给按钮添加绑定的事件 Button myButton = (Button)findViewById(R.id.myButton); myButton.setText("我的第一个Button"); myButton.setOnClickListener(new OnClick()); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { System.out.println(requestCode); System.out.println(resultCode); } public class OnClick implements OnClickListener{ @Override public void onClick(View v) { //生成一个Intent对象 Intent intent = new Intent(); intent.putExtra("testIntent", "testExtra"); intent.setClass(MainActivity.this,SecondActivity.class); //直接启动一个Activity// startActivity(intent); //启动一个有返回值的Activity startActivityForResult(intent, 2); } }}
setResut(int resultCode, Intent intent)
resultCode如果跳转的Activity子模块可能有几种不同的结果返回,可以用这个参数予以识别区分。这里还有个特殊的RESULT_OK值,没有特殊情况用它就好了,sdk有说明的。intent 继续不解释,传回给A的onActivityResult()
onActivityResult(int requestCode, int resultCode, Intent intent)
这里三个都不用解释了,与上文对应的东西。如果不对requestCode和resultCode 加以识别区分的话,只要有其他activity setResult到了A onActivityResult()会无差别处理public class SecondActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); this.setContentView(R.layout.other); Button btn = (Button)findViewById(R.id.otherButton); btn.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View v) { Intent intent = getIntent(); setResult(3, intent); finish(); } }); }}
二、Intent的构造函数
公共构造函数:
1、Intent() 空构造函数
2、Intent(Intent o) 拷贝构造函数
3、Intent(String action) 指定action类型的构造函数
4、Intent(String action, Uri uri) 指定Action类型和Uri的构造函数,URI主要是结合程序之间的数据共享ContentProvider
5、Intent(Context packageContext, Class<?> cls) 传入组件的构造函数,也就是上文提到的
6、Intent(String action, Uri uri, Context packageContext, Class<?> cls) 前两种结合体
Intent有六种构造函数,3、4、5是最常用的,并不是其他没用!
Intent(String action, Uri uri) 的action就是对应在AndroidMainfest.xml中的action节点的name属性值。在Intent类中定义了很多的Action和Category常量。
示例代码二:
Intent intent = new Intent(Intent.ACTION_EDIT, null);startActivity(intent);
示例代码二是用了第四种构造函数,只是uri参数为null。执行此代码的时候,系统就会在程序主配置文件AndroidMainfest.xml中寻找
<action android:name="android.intent.action.EDIT" />对应的Activity,如果对应为多个activity具有<action android:name="android.intent.action.EDIT" />此时就会弹出一个dailog选择Activity,如下图:
如果是用示例代码一那种方式进行发送则不会有这种情况。
三、利用Intent在Activity之间传递数据
在Main中执行如下代码:
Bundle bundle = new Bundle(); bundle.putStringArray("NAMEARR", nameArr); Intent intent = new Intent(Main.this, CountList.class); intent.putExtras(bundle); startActivity(intent);
在CountList中,代码如下:
Bundle bundle = this.getIntent().getExtras();String[] arrName = bundle.getStringArray("NAMEARR");
以上代码就实现了Activity之间的数据传递!
如何使用自定义的Action属性?
1、定义一个自定义的Action名称——常量
public static final String MY_ACTION = "hb.com.MY_ACTION";
2、使用一个按钮然后给其绑定事件,让它跳转到另一个Activity
myActionBtn.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View v) { System.out.println("myActionBtn");// Intent intent = getIntent();// 这里一定要new一个Intent对象,如果用上面的则打开的是当前的Activity Intent intent = new Intent(); intent.setAction(MY_ACTION); startActivity(intent); }});
3、在AndroidManifest.xml配置文件中添加Activity的名称
备注:hb.com.MY_ACTION这个值与intent.setAction(MY_ACTION);值是一样的
activity标签在application标签内部category这个属性在Intent Filter中必须出现,否则不能测试通过
Intent中的四个重要属性——Action、Data、Category、Extras
Action:Action属性的值为一个字符串,它代表了系统中已经定义了一系列常用的动作。通过setAction()方法或在清单文件AndroidManifest.xml中设置。默认为:DEFAULT。
Data:Data通常是URI格式定义的操作数据,是指定动作的URI和MIME类型。例如:tel:// 。通过setData()方法设置。不同的Action有不同的Data数据指定。
Category:Category属性用于指定当前动作(Action)被执行的环境。通过addCategory()方法或在清单文件AndroidManifest.xml中设置。默认为:CATEGORY_DEFAULT。
Extras:Extras属性主要用于传递目标组件所需要的额外的数据。通过putExtras()方法设置。
四个属性各自的常用值如下:
Action: ACTION_MAIN:Android Application的入口,每个Android应用必须且只能包含一个此类型的Action声明。 ACTION_VIEW:系统根据不同的Data类型,通过已注册的对应Application显示数据。 ACTION_EDIT:系统根据不同的Data类型,通过已注册的对应Application编辑示数据。 ACTION_DIAL:打开系统默认的拨号程序,如果Data中设置了电话号码,则自动在拨号程序中输入此号码。 ACTION_CALL:直接呼叫Data中所带的号码。 ACTION_ANSWER:接听来电。 ACTION_SEND:由用户指定发送方式进行数据发送操作。 ACTION_SENDTO:系统根据不同的Data类型,通过已注册的对应Application进行数据发送操作。 ACTION_BOOT_COMPLETED:Android系统在启动完毕后发出带有此Action的广播(Broadcast)。 ACTION_TIME_CHANGED:Android系统的时间发生改变后发出带有此Action的广播(Broadcast)。 ACTION_PACKAGE_ADDED:Android系统安装了新的Application之后发出带有此Action的广播(Broadcast)。 ACTION_PACKAGE_CHANGED:Android系统中已存在的Application发生改变之后(如应用更新操作)发出带有此Action的广播(Broadcast)。 ACTION_PACKAGE_REMOVED:卸载了Android系统已存在的Application之后发出带有此Action的广播(Broadcast)。 Category: CATEGORY_DEFAULT:Android系统中默认的执行方式,按照普通Activity的执行方式执行。 CATEGORY_HOME:设置该组件为Home Activity。 CATEGORY_PREFERENCE:设置该组件为Preference。 CATEGORY_LAUNCHER:设置该组件为在当前应用程序启动器中优先级最高的Activity,通常为入口ACTION_MAIN配合使用。 CATEGORY_BROWSABLE:设置该组件可以使用浏览器启动。 CATEGORY_GADGET:设置该组件可以内嵌到另外的Activity中。 Extras: EXTRA_BCC:存放邮件密送人地址的字符串数组。 EXTRA_CC:存放邮件抄送人地址的字符串数组。 EXTRA_EMAIL:存放邮件地址的字符串数组。 EXTRA_SUBJECT:存放邮件主题字符串。 EXTRA_TEXT:存放邮件内容。 EXTRA_KEY_EVENT:以KeyEvent对象方式存放触发Intent的按键。 EXTRA_PHONE_NUMBER:存放调用ACTION_CALL时的电话号码。 Data: tel://:号码数据格式,后跟电话号码。 mailto://:邮件数据格式,后跟邮件收件人地址。 smsto://:短息数据格式,后跟短信接收号码。 content://:内容数据格式,后跟需要读取的内容。 file://:文件数据格式,后跟文件路径。 market://search?q=pname:pkgname:市场数据格式,在Google Market里搜索包名为pkgname的应用。
1.从google搜索内容
Intent intent = new Intent(); intent.setAction(Intent.ACTION_WEB_SEARCH); intent.putExtra(SearchManager.QUERY,"searchString") startActivity(intent); 2.浏览网页 Uri uri = Uri.parse("http://www.google.com"); Intent it = new Intent(Intent.ACTION_VIEW,uri); startActivity(it); 3.显示地图 Uri uri = Uri.parse("geo:38.899533,-77.036476"); Intent it = new Intent(Intent.Action_VIEW,uri); startActivity(it); 4.路径规划 Uri uri = Uri.parse("http://maps.google.com/maps?f=dsaddr=startLat%20startLng&daddr=endLat%20endLng&hl=en"); Intent it = new Intent(Intent.ACTION_VIEW,URI); startActivity(it); 5.拨打电话 Uri uri = Uri.parse("tel:xxxxxx"); Intent it = new Intent(Intent.ACTION_DIAL, uri); startActivity(it); 6.调用发短信的程序 Intent it = new Intent(Intent.ACTION_VIEW); it.putExtra("sms_body", "The SMS text"); it.setType("vnd.android-dir/mms-sms"); startActivity(it); 7.发送短信 Uri uri = Uri.parse("smsto:0800000123"); Intent it = new Intent(Intent.ACTION_SENDTO, uri); it.putExtra("sms_body", "The SMS text"); startActivity(it); String body="this is sms demo"; Intent mmsintent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("smsto", number, null)); mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY, body); mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE, true); mmsintent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT, true); startActivity(mmsintent); 8.发送彩信 Uri uri = Uri.parse("content://media/external/images/media/23"); Intent it = new Intent(Intent.ACTION_SEND); it.putExtra("sms_body", "some text"); it.putExtra(Intent.EXTRA_STREAM, uri); it.setType("image/png"); startActivity(it); StringBuilder sb = new StringBuilder(); sb.append("file://"); sb.append(fd.getAbsoluteFile()); Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mmsto", number, null)); // Below extra datas are all optional. intent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_SUBJECT, subject); intent.putExtra(Messaging.KEY_ACTION_SENDTO_MESSAGE_BODY, body); intent.putExtra(Messaging.KEY_ACTION_SENDTO_CONTENT_URI, sb.toString()); intent.putExtra(Messaging.KEY_ACTION_SENDTO_COMPOSE_MODE, composeMode); intent.putExtra(Messaging.KEY_ACTION_SENDTO_EXIT_ON_SENT, exitOnSent); startActivity(intent); 9.发送Email Uri uri = Uri.parse("mailto:xxx@abc.com"); Intent it = new Intent(Intent.ACTION_SENDTO, uri); startActivity(it); Intent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com"); it.putExtra(Intent.EXTRA_TEXT, "The email body text"); it.setType("text/plain"); startActivity(Intent.createChooser(it, "Choose Email Client")); Intent it=new Intent(Intent.ACTION_SEND); String[] tos={"me@abc.com"}; String[] ccs={"you@abc.com"}; it.putExtra(Intent.EXTRA_EMAIL, tos); it.putExtra(Intent.EXTRA_CC, ccs); it.putExtra(Intent.EXTRA_TEXT, "The email body text"); it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); it.setType("message/rfc822"); startActivity(Intent.createChooser(it, "Choose Email Client")); Intent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3"); sendIntent.setType("audio/mp3"); startActivity(Intent.createChooser(it, "Choose Email Client")); 10.播放多媒体 Intent it = new Intent(Intent.ACTION_VIEW); Uri uri = Uri.parse("file:///sdcard/song.mp3"); it.setDataAndType(uri, "audio/mp3"); startActivity(it); Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); 11.uninstall apk Uri uri = Uri.fromParts("package", strPackageName, null); Intent it = new Intent(Intent.ACTION_DELETE, uri); startActivity(it); 12.install apk Uri installUri = Uri.fromParts("package", "xxx", null); returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri); 13. 打开照相机 <1>Intent i = new Intent(Intent.ACTION_CAMERA_BUTTON, null); this.sendBroadcast(i); < 2>long dateTaken = System.currentTimeMillis(); String name = createName(dateTaken) + ".jpg"; fileName = folder + name; ContentValues values = new ContentValues(); values.put(Images.Media.TITLE, fileName); values.put("_data", fileName); values.put(Images.Media.PICASA_ID, fileName); values.put(Images.Media.DISPLAY_NAME, fileName); values.put(Images.Media.DESCRIPTION, fileName); values.put(Images.ImageColumns.BUCKET_DISPLAY_NAME, fileName); Uri photoUri = getContentResolver().insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); Intent inttPhoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); inttPhoto.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); startActivityForResult(inttPhoto, 10); 14.从gallery选取图片 Intent i = new Intent(); i.setType("image/*"); i.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(i, 11); 15. 打开录音机 Intent mi = new Intent(Media.RECORD_SOUND_ACTION); startActivity(mi); 16.显示应用详细列表 Uri uri = Uri.parse("market://details?id=app_id"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); //where app_id is the application ID, find the ID //by clicking on your application on Market home //page, and notice the ID from the address bar 刚才找app id未果,结果发现用package name也可以 Uri uri = Uri.parse("market://details?id=<packagename>"); 这个简单多了 17.寻找应用 Uri uri = Uri.parse("market://search?q=pname:pkg_name"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); //where pkg_name is the full package path for an application 18.打开联系人列表 <1> Intent i = new Intent(); i.setAction(Intent.ACTION_GET_CONTENT); i.setType("vnd.android.cursor.item/phone"); startActivityForResult(i, REQUEST_TEXT); < 2> Uri uri = Uri.parse("content://contacts/people"); Intent it = new Intent(Intent.ACTION_PICK, uri); startActivityForResult(it, REQUEST_TEXT); 19.打开另一程序 Intent i = new Intent(); ComponentName cn = new ComponentName("com.yellowbook.android2", "com.yellowbook.android2.AndroidSearch"); i.setComponent(cn); i.setAction("android.intent.action.MAIN"); startActivityForResult(i, RESULT_OK); //调用浏览器Uri uri = Uri.parse(""); Intent it = new Intent(Intent.ACTION_VIEW,uri); startActivity(it); //显示某个坐标在地图上Uri uri = Uri.parse("geo:38.899533,-77.036476"); Intent it = new Intent(Intent.Action_VIEW,uri); startActivity(it); //显示路径Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en"); Intent it = new Intent(Intent.ACTION_VIEW,URI); startActivity(it); //拨打电话Uri uri = Uri.parse("tel:10086"); Intent it = new Intent(Intent.ACTION_DIAL, uri); startActivity(it);Uri uri = Uri.parse("tel.10086"); Intent it =new Intent(Intent.ACTION_CALL,uri);需要添加 <uses-permission id="android.permission.CALL_PHONE" /> 这个权限到androidmanifest.xml //发送短信或彩信Intent it = new Intent(Intent.ACTION_VIEW); it.putExtra("sms_body", "The SMS text"); it.setType("vnd.android-dir/mms-sms"); startActivity(it); //发送短信Uri uri = Uri.parse("smsto:10086"); Intent it = new Intent(Intent.ACTION_SENDTO, uri); it.putExtra("sms_body", "cwj"); startActivity(it); //发送彩信Uri uri = Uri.parse("content://media/external/images/media/23"); Intent it = new Intent(Intent.ACTION_SEND); it.putExtra("sms_body", "some text"); it.putExtra(Intent.EXTRA_STREAM, uri); it.setType("image/png"); startActivity(it); //发送邮件 Uri uri = Uri.parse("mailto:android123@163.com"); Intent it = new Intent(Intent.ACTION_SENDTO, uri); startActivity(it);Intent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_EMAIL, ); it.putExtra(Intent.EXTRA_TEXT, "The email body text"); it.setType("text/plain"); startActivity(Intent.createChooser(it, "Choose Email Client"));Intent it=new Intent(Intent.ACTION_SEND); String[] tos={"me@abc.com"}; String[] ccs={"you@abc.com"}; it.putExtra(Intent.EXTRA_EMAIL, tos); it.putExtra(Intent.EXTRA_CC, ccs); it.putExtra(Intent.EXTRA_TEXT, "The email body text"); it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); it.setType("message/rfc822"); startActivity(Intent.createChooser(it, "Choose Email Client")); //播放媒体文件Intent it = new Intent(Intent.ACTION_VIEW); Uri uri = Uri.parse("[url=]file:///sdcard/cwj.mp3[/url]"); it.setDataAndType(uri, "audio/mp3"); startActivity(it);Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); //卸载APKUri uri = Uri.fromParts("package", strPackageName, null); Intent it = new Intent(Intent.ACTION_DELETE, uri); startActivity(it); //卸载apk 2 Uri uninstallUri = Uri.fromParts("package", "xxx", null); returnIt = new Intent(Intent.ACTION_DELETE, uninstallUri); //安装APK Uri installUri = Uri.fromParts("package", "xxx", null); returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri); //播放音乐Uri playUri = Uri.parse("[url=]/sdcard/download/sth.mp3[/url]"); returnIt = new Intent(Intent.ACTION_VIEW, playUri); //发送附近Intent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); it.putExtra(Intent.EXTRA_STREAM, "[url=]file:///sdcard/cwj.mp3[/url]"); sendIntent.setType("audio/mp3"); startActivity(Intent.createChooser(it, "Choose Email Client")); //market上某个应用信,pkg_name就是应用的packageNameUri uri = Uri.parse("market://search?q=pname:pkg_name"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); //market上某个应用信息,app_id可以通过www网站看下Uri uri = Uri.parse("market://details?id=app_id"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); //调用搜索Intent intent = new Intent(); intent.setAction(Intent.ACTION_WEB_SEARCH); intent.putExtra(SearchManager.QUERY,"android123") startActivity(intent);原文:http://bbs.51cto.com/thread-944255-1.html