本文将讲解一下隐式Intent:
1. 创建闹钟
使用ACTION_SET_ALARM操作,还可以带一些extra指定时间和消息等闹铃详细信息。
extra:
- EXTRA_HOUR 闹铃的小时
- EXTRA_MINUTES 闹铃的分钟
- EXTRA_MESSAGE 用于标识闹铃的自定义消息
- EXTRA_DAYS 对于一次性闹钟,无需指定此extra
- EXTRA_RINGTONE 用于指定闹铃使用大量铃声,若使用默认,则无需指定
- EXTRA_VIBRATE 布尔值,用于指定该闹铃触发时是否震动
- EXTRA_SKIP_UI 布尔值,用于指定响应闹铃的应用在设置或在设置中是否跳过UI,若true,则跳过
public void createAlarm(String message, int hour, int minutes) { Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM) .putExtra(AlarmClock.EXTRA_MESSAGE, message) .putExtra(AlarmClock.EXTRA_HOUR, hour) .putExtra(AlarmClock.EXTRA_MINUTES, minutes); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }notice: 为了调用ACTION_SET_ALARM,还有在清单Manifest中设置SET_ALARM权限
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
示例Intent Filter
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_ALARM" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
2. 创建定时器
使用ACTION_SET_TIMER操作,还可以带一些extra指定持续时间等定时器详细信息。
extra:
- EXTRA_LENGTH 以秒为单位的定时器定时长度
- EXTRA_MESSAGE 用于标识定时器的自定义消息
- EXTRA_SKIP_UI 布尔值,用于指定响应定时器的应用在设置定时器时是否跳过UI
示例Intent:
public void startTimer(String message, int seconds) { Intent intent = new Intent(AlarmClock.ACTION_SET_TIMER) .putExtra(AlarmClock.EXTRA_MESSAGE, message) .putExtra(AlarmClock.EXTRA_LENGTH, seconds) .putExtra(AlarmClock.EXTRA_SKIP_UI, true); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
notice: 为了调用ACTION_SET_TIMER,还有在清单Manifest中设置SET_ALARM权限
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
示例Intent Filter
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_ALARM" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
3. 显示所有闹铃
notice:使用此Intent,api必须大于等于android4.4(api19)
示例过滤器Intent Filter:
<activity ...> <intent-filter> <action android:name="android.intent.action.SHOW_ALARMS" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
4. 日历(添加日历事件)
使用ACTION_INSERT操作指定具有Event.CONTENT_URI的数据URI向用户的日历添加新事件
数据URI : Event.CONTENT_URI
MIME类型 : "vnd.android.cursor.dir/event"
Extra
- EXTRA_EVENT_ALL_DAY 布尔值,指定此事件是否为全天事件
- EXTRA_EVENT_BEGIN_TIME 事件的开始时间(从新纪年开始计算的毫秒数)
- EXTRA_EVENT_END_TIME 事件的结束时间(从新纪年开始计算的毫秒数)
- TITLE 事件标题
- DESCRIPITION 事件说明
- EVENT_LOCATION 事件地点
- EXTRA_EMAIL 以逗号分隔的受邀这电子邮件地址列表
示例Intent:
public void addEvent(String title, String location, Calendar begin, Calendar end) { Intent intent = new Intent(Intent.ACTION_INSERT) .setData(Events.CONTENT_URI) .putExtra(Events.TITLE, title) .putExtra(Events.EVENT_LOCATION, location) .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }示例Intent Filter:
<activity ...> <intent-filter> <action android:name="android.intent.action.INSERT" /> <data android:mimeType="vnd.android.cursor.dir/event" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
5. 相机 (拍照或视频以及回调)
使用ACTION_IMAGE_CAPTURE或ACTION_VIDEO_CAPTURE操作,此外,还可以在EXTRA_OUTPUT extra中指定照片或视频保存的URI位置
Extra:
- EXTRA_OUTPUT 相机应用应将照片或视频文件保存到URI位置(Uri对象形式)
然后重写onActivityResult()回调,可以通过EXTRA_OUTPUT值指定的URI访问照片或视频
notice: 当你使用ACTION_IMAGE_CAPTURE拍照时,相机可能还会在结果Intent中返回缩小尺寸的缩略图,以Bitmap形式保存在名为“data”的extra字段中
示例Intent:
static final int REQUEST_IMAGE_CAPTURE = 1; static final Uri mLocationForPhotos; public void capturePhoto(String targetFilename) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(mLocationForPhotos, targetFilename)); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelable("data"); // Do other work with full size photo saved in mLocationForPhotos ... } }示例Intent Filter
<activity ...> <intent-filter> <action android:name="android.media.action.IMAGE_CAPTURE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>处理此Intent时,Activity应检查传入Intent中有无EXTRA_OUTPUT extra,然后将拍摄的图片和视频保存在该extra指定的位置,并调用带Intent的setResult()。
6. 调用图库
使用ACTION_GET_CONTENT操作并指定所需MIME类型选择文档或照片等文件并向你应用返回文件引用。
回调到onActivityResult()方法的结果Intent包括数据具有指向该文件的URI,该Uri可以是任何类型,如http:URI,file:URI或content:URI,
不过,如果将可选择的文件限定为(content:URI)访问文件,以及通过 openFileDescriptor()以文件流形式提供的文件,此时应该为Intent
添加CATEGORY_OPENABLE。
在android4.3(api18)及更高版本中,还可以添加EXTRA_ALLOW_MULTIPLE并将其设置为true允许选择多个文件,然后在getClipData()返回
的ClipData对象中访问每一个选定的文件。
MIME类型 : 与应选择的文件类型对应的MIME类型
Extra:
- EXTRA_ALLOW_MULTIPLE 布尔值,声明是否可以一次选择多个文件
- EXTRA_LOCAL_ONLY 布尔值,声明是否返回的文件必须直接存在于设备上,而不是需要从远程服务下载。
获取照片示例Intent:
static final int REQUEST_IMAGE_GET = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_GET); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_GET && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelable("data"); Uri fullPhotoUri = data.getData(); // Do work with photo saved at fullPhotoUri ... } }返回照片示例Intent Filter:
<activity ...> <intent-filter> <action android:name="android.intent.action.GET_CONTENT" /> <data android:type="image/*" /> <category android:name="android.intent.category.DEFAULT" /> <!-- The OPENABLE category declares that the returned file is accessible from a content provider that supportsOpenableColumns
andContentResolver.openFileDescriptor()
--> <category android:name="android.intent.category.OPENABLE" /> </intent-filter> </activity>