本文将讲解一下隐式Intent:
1. 创建闹钟
extra:
- EXTRA_HOUR 闹铃的小时
- EXTRA_MINUTES 闹铃的分钟
- EXTRA_MESSAGE 用于标识闹铃的自定义消息
- EXTRA_DAYS 对于一次性闹钟,无需指定此extra
- EXTRA_RINGTONE 用于指定闹铃使用大量铃声,若使用默认,则无需指定
- EXTRA_VIBRATE 布尔值,用于指定该闹铃触发时是否震动
- EXTRA_SKIP_UI 布尔值,用于指定响应闹铃的应用在设置或在设置中是否跳过UI,若true,则跳过
notice:android2.3(API9)及更高版本上只提供了小时,分钟和消息extra,其他的extra是在更新版本的平台上新增的
示例Intent:
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:
OpenableColumns
ContentResolver.openFileDescriptor()