android学习笔记:Intent,Intent Filter

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");
    
发布了47 篇原创文章 · 获赞 8 · 访问量 18万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章