Intent的作用
Intent在android中可以用来请求一个动作,用于启动另外一个控件,Intent可以启动三种控件如下
启动一个activity,可以使用startActivity(),如果你想启动activity之后返回结果,那么启动的时候调用startActivityForResult(),然后当前的activity实现onActivityResult(),当被启动的activity结束时,可以回调该方法,并返回结果
启动一个service,service是一般用来在后台进行一些操作,通过startService()方法来启动service
启动boardcast(广播)通过调用sendBroadcast()
Intent的类型
- 显示类型,显示指定要启动的控件的类型,通常用来启动activity
Intent i = new Intent();
i.stClass(MainActivity.this,OtherActivity.class);
startActivity(i);
- 隐式类型 不直接指名要启动控件的名字,但是通过指定action与data来启动,通常用来启动其他app的activity,比如打电话的界面,相册,地图等。
先说一下Intent Filter吧,在说如何发送隐式intent,这样会好理解一些
Intent Filter
intent filter 是intent的过滤器,他可以对隐式的intent进行过滤,我的理解是当发送一个intent时,android系统会匹配各个应用中intent filter,查看intent filter 是否是当前intent要被启动的。
intent filter 中可以添加如下属性(manifest文件中设置)
action: 动作的名称,通常是系统定义好的值,如ACTION_SEND,或ACTION_VIEW,通过
data:intent附带的数据。通过指定他的值,可以使用一个或者多个属性,我们可以只定义MIME type或者是只指定URI prefix,也可以只定义一个URI scheme,或者是他们综合使用。
category:提供一个附加的方法来标识这个activity能够handle的intent。通常与用户的手势或者是启动位置有关。系统有支持几种不同的categories,但是大多数都很少用到。而且,所有的隐式intent都默认是 CATEGORY_DEFAULT 类型的。在intent filter中用指定它的值。
还有一点需要特别注意:**intent-filterfilter>中必须有category标签,不然应用就会奔溃,category属性一般指定为
< category android:name=”android.intent.category.LAUNCHER” />
验证是否有App去接收这个Intent
Caution: 如果触发了一个intent,而且没有任何一个app会去接收这个intent,则app会crash(奔溃掉)。
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isIntentSafe = activities.size() > 0;
下面是一个例子
<activity android:name="MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>
设置intent
- 设置component 发送intent可以添加控件的名字,用于显示启动控件
*设置action,如果启动的控件为自己定义的,一般我们用包名来作为action名字的前缀,来和我们系统众多的action区分开
static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
- 设置data,一般设置一些电脑号码,email地址等需要传递给要启动控制的数据
*设置catogory,一般不需要设置,默认大多数的隐式intent的intent-filter中的catogory为默认的属性
- 设置extra
这个用到的比较多,比方说我们想传递要给一个数据给另外一个activity时,就可以用到
putExtra()或者使用putExtras
下面是一些其他intent的例子
带有指定电话号码的intent:
Uri number = Uri.parse("tel:5551234"); Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
查看地图:
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"); Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
查看网页
Uri webpage = Uri.parse("http://www.android.com"); Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
至于另外一些需要extra数据的隐式 intent,我们可以使用 putExtra() 方法来添加那些数据。 默认的,系统会根据Uri数据类型来决定需要哪些合适的MIME type。如果我们没有在intent中包含一个Uri, 则通常需要使用 setType() 方法来指定intent附带的数据类型。设置MIME type 是为了指定应该接受这个intent的activity。例如:
发送一个带附件的email:
Intent emailIntent = new Intent(Intent.ACTION_SEND); emailIntent.setType(HTTP.PLAIN_TEXT_TYPE); emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"}); emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject"); emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text"); emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"));
创建一个日历事件
Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI); Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30); Calendar endTime = Calendar.getInstance().set(2012, 0, 19, 10, 30); calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis()); calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis()); calendarIntent.putExtra(Events.TITLE, "Ninja class"); calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");