Implicit Intent--含蓄的intent

通过intent调用打电话,打开地图、打开浏览器,创建邮件,创建事件的操作

截图:

代码

package com.example.hellointent;

import java.util.Calendar;
import java.util.List;

import org.apache.http.protocol.HTTP;

import android.net.Uri;
import android.os.Bundle;
import android.provider.CalendarContract;
import android.provider.CalendarContract.Events;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.text.TextUtils;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {

	private static int sIndex = 0;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	//打电话
	public void onTel(View view) {
		Uri number = Uri.parse("tel:5551234");
		Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
		String title = sIndex % 2 == 0 ? null : "打电话";
		startActivity(callIntent, title);

	}
	//打电话
	public void onMap(View view) {
		// Map point based on address
		Uri location = Uri.parse("geo:40.004754,116.430867?z=14");
		// Or map point based on latitude/longitude
		// Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param
		// is zoom level
		Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
		String title = sIndex % 2 == 0 ? null : "获取地图";
		startActivity(mapIntent, title);

	}
   //打开浏览器
	public void onWeb(View view) {
		Uri webpage = Uri.parse("http://www.android.com");
		Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
		String title = sIndex % 2 == 0 ? null : "打开网页";
		startActivity(webIntent, title);

	}
	//创建邮件
	public void onEmail(View view) {
		Intent emailIntent = new Intent(Intent.ACTION_SEND);
		// The intent does not have a URI, so declare the "text/plain" MIME type
		emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
		emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" }); // recipients
		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"));
		// You can also attach multiple items by passing an ArrayList of Uris
		String title = sIndex % 2 == 0 ? null : "--发送邮件--";
		startActivity(emailIntent, title);
	}
	//创建事件的操作
	@SuppressLint("NewApi")
	public void onCreatCalender(View view) {
		Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);
		Calendar beginTime = Calendar.getInstance();
		beginTime.set(2014, 5, 1, 9, 30);
		Calendar endTime = Calendar.getInstance();
		endTime.set(2014, 5, 1, 18, 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");
		String title = sIndex % 2 == 0 ? null : "窗將活动";
		startActivity(calendarIntent, title);
	}

	private void startActivity(Intent intent, String title) {
		// If you invoke an intent and there is no app available on the device
		// that can handle the intent, your app will crash.
		PackageManager packageManager = getPackageManager();
		List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
		if (activities.size() > 0) {
			if (TextUtils.isEmpty(title)) {
				startActivity(intent);
			} else {
				// To show the chooser, create an Intent using createChooser()
				// and pass it to startActivity(). For example:
				//为选择器创建标题
				Intent chooser = Intent.createChooser(intent, title);
				startActivity(chooser);
			}
		} else {
			Toast.makeText(this, "没有找到符合要求的界面", Toast.LENGTH_SHORT).show();
		}
		sIndex++;
	}

}

laout文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="onTel"
        android:text="打电话" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="onMap"
        android:text="地图" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="onWeb"
        android:text="浏览器" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="onEmail"
        android:text="创建邮件" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="onCreatCalender"
        android:text="创建事件" />

</LinearLayout>

注意

1.PackageManager packageManager = getPackageManager();

List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);

activities.size() > 0

用于判断是否有符合要求的界面如果没有直接调用startActivity(intent) 会导致程序crash

2.

如果activities.size() 大于1就会出现选择器

//为选择器创建标题

Intent chooser = Intent.createChooser(intent, title);

startActivity(chooser);

通过下面的图片就能看到加上

有标题的选择器:

默认标题的选择器

Implicit Intent--含蓄的intent

时间: 2024-10-06 21:50:24

Implicit Intent--含蓄的intent的相关文章

intent filter 应该叫 intent picker 或 intent receiver 更合乎语义

安卓的开发者指南上说: The system will deliver an implicit intent to your app component only if the intent can pass through one of your intent filters. filter 的一般含义意指过滤掉不需要的事物, 只留下需要的.它的主要功能应该是"滤除", 而不是"保留".应该用在有大量的备选对象的情景之下,用于去除多数不合乎需求的对象, 仅留下需要

Intent系列讲解---Intent简介以及相关属性

一.Intent简介 Intent中文是"意图,意向",它是Android中四大组件通讯的纽带,Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用.Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互.因此,可以将Intent理解为不同组件之间通信的"媒介"专门提供组件互相调用的相关信息

android 手机拍照返回 Intent==null 以及intent.getData==null

手机拍照第一种情况:private void takePicture(){ Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);SimpleDateFormat timeStampFormat = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");String filename = timeStampFormat.format(new Date());ContentValues v

Android中Intent对象与Intent Filter过滤匹配过程详解

如果对Intent不是特别了解,可以参见博文<Android中Intent概述及使用>,该文对本文要使用的action.category以及data都进行了详细介绍. 本文内容有点长,希望大家可以耐心读完. 本文在描述组件在manifest中注册的Intent Filter过滤器时,统一用intent-filter表示. 概述 我们知道,Intent是分两种的:显式Intent和隐式Intent.如果一个Intent明确指定了要启动的组件的完整类名,那么这个Intent就是显式Intent,否

使用Intent启动图片裁剪时遇到的问题:Intent#setData()与Intent#setType()赋值问题

在做使用Intent启动图片裁剪时遇到一个问题: 分开调用Intent#setData();Intent#setType();这两个方法时,程序无法正确运行,但使用Intent#setDataAndType();程序正常运行. 原因分析: 查看Intent#setData(),Intent#setType()源码: public Intent setData(Uri data) { mData = data; mType = null; return this; } public Intent

intent.getExtras()和intent.getStringExtra()

intent.getExtras()返回一个Bundle对象. 看下面代码: Intent intent=new Intent(this,SecondActivity.class); Bundle bundle=new Bundle(); bundle.putString("test", "123"); intent.putExtras(bundle); startActivity(intent); String params=this.getIntent().ge

Intent Flag介绍 intent.addFlags()

intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); FLAG_ACTIVITY_BROUGHT_TO_FRONT  这个标志一般不是由程序代码设置的,如在launchMode中设置singleTask模式时系统帮你设定. FLAG_ACTIVITY_CLEAR_TOP 如果设置,并且这个Activity已经在当前的Task中运行,因此,不再是重新启动一个这个Activity的实例,而是在这个Activity上 方的所有Activity都将关闭,

有关implicit Intent的使用

1 Intent intent = new Intent(Intent.ACTION_VIEW); 2 intent.setData(Uri.parse("geo:20.000,50.000")); 3 startActivity(intent); 这样会打开地图应用显示经纬点

Pro Android学习笔记(十一):了解Intent(中)

Intent的构成 Intent可以带有action,data(由URI表达),extra data(key/value map,键值对),指定的类名(成为component name).一个intent至少携带上述的一个内容. Action.Action名,在上一笔记中已经给出两种例子,一种是系统自带的,如Intent.ACTION_DAIL,一种是开发者通过AndroidManifest.xml进行注册的,在创建intent时给出:Intent intent=new Intent(Strin