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

如果对Intent不是特别了解,可以参见博文《详解Android中Intent的使用方法》,该文对本文要使用的action、category以及data都进行了详细介绍。如果想了解在开发中常见Intent的使用,可以参见《Android中Intent习惯用法》。

本文内容有点长,希望大家可以耐心读完。

本文在描述组件在manifest中注册的Intent Filter过滤器时,统一用intent-filter表示。

一、概述

我们知道,Intent是分两种的:显式Intent和隐式Intent。如果一个Intent明确指定了要启动的组件的完整类名,那么这个Intent就是显式Intent,否则就是隐式Intent。当我们用一个显式Intent去启动组件时,Android会根据Intent对象所提供的component name直接找到要启动的组件,当我们用一个隐式的Intent去启动组件时,Android系统就无法直接知道要启动的组件名称了,本文就是讲解Android系统如何根据隐式Intent查找匹配到要启动的组件。

当Android系统接收到一个隐式Intent要启动一个Activity(或其他组件)时,Android会根据以下三个信息比较Intent的信息与注册的组件的intent-filter的信息,从而为该Intent选择出最匹配的Activity(或其他组件):

  • intent中的action
  • intent中的category
  • intent中的data(包含Uri以及data的MIME类型)

也就是隐式intent对象要满足要启动的目标组件中注册的intent-filter中的<action />、<category />、<data />三个标签中的信息,即要分别通过action测试、category测试以及data测试。intent-filter信息是在Android的manife文件中描述的,顾名思义,intent-filter是intent过滤器,就是用来过滤intent的。

如果隐式intent对象同时通过了某个组件的中intent-filter的action测试、category测试以及data测试,那么该组件就可以被intent对象所启动。如果隐式intent对象没有通过系统中任何组件的intent-filter测试,那么就没有Android系统无法找到该intent对象要启动的组件。下面我们依次看一下如何才能通过这三个测试。

二、Action测试

为了指定能够接收并处理的Intent的类型,组件可以在intent-filter中声明其支持0个或多个action,例如:

<intent-filter>
 <action android:name="com.ispring.action.ACTION_TEST1" />
 <action android:name="com.ispring.action.ACTION_TEST2" />
 <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

intent对象可以通过setAction()方法设置唯一的一个action值。对于action测试,需要分两种情况:

intent对象设置了action
如果intent对象通过调用setAction()方法设置了action的值,那么只有当组件的intent-filter中包含了intent对象中的action值的时候,action测试才通过,否则无法通过。
举个例子,假设我们的Activity的intent-filter如下所示:

<intent-filter>
 <action android:name="com.ispring.action.ACTION_TEST1" />
 <action android:name="com.ispring.action.ACTION_TEST2" />
 <category android:name="android.intent.category.DEFAULT" />
 <data android:scheme="ispring" android:host="blog.csdn.net" />
</intent-filter>

下面的intent对象可以通过上面intent-filter里面的action测试:

Intent intent = new Intent();
intent.setAction("com.ispring.action.ACTION_TEST1");
Uri uri = Uri.parse("ispring://blog.csdn.net/sunqunsunqun");
intent.setData(uri);

该intent之所以能通过action测试是因为intent-filter中包含该intent的action值com.ispring.action.ACTION_TEST1。

下面的intent对象无法通过上面intent-filter里面的action测试:

Intent intent = new Intent();
intent.setAction("com.ispring.action.ACTION_TEST3");
Uri uri = Uri.parse("ispring://blog.csdn.net/sunqunsunqun");
intent.setData(uri);

该intent之所以无法通过action测试是因为intent-filter中不包含该intent的action值com.ispring.action.ACTION_TEST3。

intent对象没有设置action
如果intent对象没有调用setAction()方法设置action的值,那么如果intent-filter至少有一个任意的action的值,该intent对象就可以通过该intent-filter的action测试,反之,如果intent-filter中没有定义任何的action,那么该intent无法通过该intent-filter的action测试。
举个例子,假设我们的intent对象如下所示:

Intent intent = new Intent();
//不设置action值
//intent.setAction("com.ispring.action.ACTION_TEST1");
Uri uri = Uri.parse("ispring://blog.csdn.net/sunqunsunqun");
intent.setData(uri);

上面的intent对象可以通过如下的intent-filter:

<intent-filter>
 <action android:name="com.csdn.action.ACTION_XXX" />
 <category android:name="android.intent.category.DEFAULT" />
 <data android:scheme="ispring" android:host="blog.csdn.net" />
</intent-filter>

上面的intent对象无法通过如下的intent-filter:

<intent-filter>
 <category android:name="android.intent.category.DEFAULT" />
 <data android:scheme="ispring" android:host="blog.csdn.net" />
</intent-filter>

通过上面的几个示例,想必大家都已经理解了action测试的规则,至于上面的category和data标签的使用,会在下面详细介绍。

总结起来有两点结论:
1. 要想让intent对象通过action测试,那么intent-filter中声明的action不能为空且要包含intent对象中的action值(如果intent的action值不为空的话)。
2. 如果intent-filter没有声明任何action,那么所有的intent的对象(即无论intent如何配置)都无法通过intent-filter的action测试。

Category测试

为了指定能够接收并处理的Intent的类型,组件可以在intent-filter中声明其支持0个或多个category,例如:

<intent-filter>
 <category android:name="android.intent.category.DEFAULT" />
 <category android:name="android.intent.category.BROWSABLE" />
 ...
</intent-filter>

intent对象有addCategory()方法,也就是说一个intent对象也可以关联多个category。为了能让intent对象通过intent-filter的category测试,intent对象中的所有category都要在intent-filter中找到对应项。
具体来说,又分为如下两种情况:

  • intent对象至少有一个category

这种情况下,假设intent对象有N个category(N >=1),那么intent-filter中必须要包含这N个category,intent对象才能通过category测试,否则无法通过测试。如果用intent对象启动Activity,还有其他限制条件,会在后面详细说明。
举个例子,假设我们的intent-filter如下所示:

<intent-filter>
 <action android:name="com.ispring.action.ACTION_TEST1" />
 <category android:name="android.intent.category.DEFAULT" />
 <category android:name="com.ispring.category.TEST1" />
 <category android:name="com.ispring.category.TEST2" />
</intent-filter>

以下intent对象能够通过category测试

Intent intent = new Intent();
intent.setAction("com.ispring.action.ACTION_TEST1");
intent.addCategory("com.ispring.category.TEST1");
intent.addCategory("com.ispring.category.TEST2");

该intent对象之所以可以通过category测试是因为intent-filter包含了该intent对中所有的category值:com.ispring.category.TEST1”和com.ispring.category.TEST2。

以下intent对象无法通过category测试

Intent intent = new Intent();
intent.setAction("com.ispring.action.ACTION_TEST1");
intent.addCategory("com.ispring.category.TEST1");
intent.addCategory("com.ispring.category.TEST3");

该intent之所以无法通过上面的intent-filter的category测试是因为intent-filter只包含了该intent中值为com.ispring.category.TEST1的category,而并未包含值为com.ispring.category.TEST3的category,不满足完全包含intent中全部category的情况。

  • intent对象不包含任何category

如果intent对象没有调用过addCategory()方法,那么intent对象就不包含任何的category。这种情形下,如果该intent不是用来启动Activity的话,那么无论intent-filter中category中如何配置,intent对象总是能通过intent-filter的category测试,即便intent-filter中没有声明任何的category,intent都能通过category测试。此处强调了该intent不是用来启动Activity这种条件,会在下面详细解释。

此处需要特别说明的是,我们在上面所有的示例中,都给Activity的intent-filter添加了值为android.intent.category.DEFAULT的category,这是因为当我们把一个隐式的intent传递给startActivity()或startActivityForResult()方法时,Android会自动给该隐式intent添加值为android.intent.category.DEFAULT的category,所以为了能让intent-filter包含intent中全部的category,我们就需要在Activity的intent-filter中添加该category,在使用时需要特别注意。

根据上面我们的几个示例,我们总结如下:

1. 如果intent对象不包含任何category,并且该intent不是用来启动Activity的,那么该intent对象总是能通过所有任意的intent-filter的category测试;
2. 如果intent对象包含category(至少一个),那么只有当intent-filter中声明的category全部包含intent对象中的所有category的时候才通过category测试。
3. 如果允许Activity被隐式的Intent启动,那么我们必须在该Activity的intent-filter中声明值为android.intent.category.DEFAULT的category。

Data测试

为了指定可以接收的Intent的data,intent-filter需要声明0个多多个<data />标签,例如:

<intent-filter>
 <data android:mimeType="video/mpeg" android:scheme="http" ... />
 <data android:mimeType="audio/mpeg" android:scheme="http" ... />
 ...
</intent-filter>

每个<data />标签都可以指定一个URI结构以及data的MIME类型。一个完整的URI由scheme、host、port和path组成,其结构如下所示:

<scheme>://<host>:<port>/<path>

其中scheme既可以是Android中常见的协议,也可以是我们自定义的协议。Android中常见的协议包括content协议、http协议、file协议等,自定义协议可以使用自定义的字符串。

  • 如下是一个content协议的URI:

content://com.example.project:200/folder/subfolder/etc
在该URI中,scheme是content,host是com.example.project,port是200,path是folder/subfolder/etc。

  • 如下是一个自定义协议的URI:

ispring://blog.csdn.net/sunqunsunqun
在该URI中,scheme是ispring,host是blog.csdn.net,没有明确设定port,path是sunqunsunqun。

组成URI的这些属性在<data />标签中都是可选的 ,但存在如下的依赖关系:

  • 如果没有指定scheme,那么host参数会被忽略
  • 如果没有指定host,那么port参数会被忽略
  • 如果scheme和host都没有指定,path参数会被忽略

当我们将intent对象中的Uri参数与intent-filter中的<data />标签指定的URI格式进行对别时,我们我们只对比intent-filter的<data />标签指定的部分,例如:

如果intent-filter中只指定了scheme,那么所有带有该sheme的URI都能匹配到该intent-filter。
如果intent-filter中只指定了scheme和authority(authority包括host和port两部分)而没有指定path,那么所有具有相同scheme和authority的URI都能匹配到该intent-filter,而不用考虑path为何值。
如果intent-filter中同时指定了scheme、authority和path,那么只有具有相同scheme、authority和path的URI才能匹配到该intent-filter。
需要注意的是,intent-filter的<data />标签在指定path的值时,可以在里面使用通配符*,起到部分匹配的效果。

data测试需要同时将intent对象中的URI、MIME类型与intent-filter的<data />标签中指定的URI、MIME类型进行对比。
我们知道一个intent-filter下可以有多个<data />标签,intent对象无需通过所有的<data />标签测试,一般情况下,我们的intent对象只需通过了其中一个<data />标签的测试并满足某些特定情形下的一些条件,那么该intent对象就通过了该intent-filter的data测试。
进行对比的规则分以下几种情况:

  • intent对象不包含URI和MIME类型

这种情况下,只有当intent-filter也没有指定任何URI和MIME类型的时候才能通过data测试。
例如我们有如下intent对象:

Intent intent = new Intent();
intent.setAction("com.ispring.action.ACTION_TEST1");

上面的intent对象可以通过下面的intent-filter的data测试:

<intent-filter>
 <action android:name="com.ispring.action.ACTION_TEST1" />
 <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

上面的intent对象无法通过下面的intent-filter测试:

<intent-filter>
 <action android:name="com.ispring.action.ACTION_TEST1" />
 <category android:name="android.intent.category.DEFAULT" />
 <data android:scheme="ispring" />
</intent-filter>
  • intent对象包含URI但不包含MIME类型

这种情况下,只有当intent对象的URI匹配到了intent-filter中的URI格式,并且intent-filter没有指定MIME类型的时候才能通过data测试。需要注意的是,这里所说的intent-filter没有指定MIME类型的情形指的是intent-filter中所有的<data />标签都没有指定MIME类型,即整个intent-filter中完全没有android:mimeType这几个字,理解这点很重要,大家在下面的几个示例中可以体会到这点。
例如有如下intent对象:

Intent intent = new Intent();
intent.setAction("com.ispring.action.ACTION_TEST1");
Uri uri = Uri.parse("ispring://blog.csdn.net/sunqunsunqun");
intent.setData(uri);

上面的intent能通过如下的intent-filter的data测试:

<intent-filter>
 <action android:name="com.ispring.action.ACTION_TEST1" />
 <category android:name="android.intent.category.DEFAULT" />
 <data android:scheme="ispring" android:host="blog.csdn.net" />
</intent-filter>

上面的intent对象可以通过以下intent-filter的data测试:

<intent-filter>
 <action android:name="com.ispring.action.ACTION_TEST1" />
 <category android:name="android.intent.category.DEFAULT" />
 <data android:scheme="ispring" android:host="blog.csdn.net" />
 <data android:scheme="sunqun" android:host="8080" />
</intent-filter>

intent对象虽然不能通过scheme为sunqun的<data />标签测试,但是可以通过scheme为ispring的data标签测试,且intent对象和intent-filter中的两个<data />标签都没有指定MIME,所以上面的intent对象可以通过该intent-filter测试。

上面的intent对象无法通过以下intent-filter的<data />标签测试:

<intent-filter>
 <action android:name="com.ispring.action.ACTION_TEST1" />
 <category android:name="android.intent.category.DEFAULT" />
 <data android:mimeType="text/plain" android:scheme="ispring" android:host="blog.csdn.net" />
</intent-filter>

上面的intent对象之所以不能通过intent-filter中唯一的一个<data />标签测试是因为我们的intent对象没有指定MIME类型,但是上面的<data />标签通过android:mimeType="text/plain"设置了MIME类型。

上面的intent对象无法通过以下intent-filter的data测试:

<intent-filter>
 <action android:name="com.ispring.action.ACTION_TEST1" />
 <category android:name="android.intent.category.DEFAULT" />
 <data android:scheme="ispring" android:host="blog.csdn.net" />
 <data android:mimeType="text/plain" />
</intent-filter>

上面的intent对象之所以无法通过该intent-filter中的data测试,是因为intent对象没有设置MIME类型,但是intent-filter中第二个data标签通过android:mimeType="text/plain"设置了MIME类型。

intent对象包含MIME类型但不包含URI
这种情况下,只有当intent中的MIME类型与intent-filter中列出的MIME类型相同,并且intent-filter没有指定任何的URI格式的时候才能通过data测试。需要注意的是,这里所说的intent-filter没有指定任何的URI格式的情形指的是intent-filter中所有<data />标签都没有指定URI,即整个intent-filter中完全没有android:scheme、android:host、android:port以及android:path,理解这点很重要,大家在下面的几个示例中可以体会到这点。
例如有如下intent对象:

Intent intent = new Intent();
intent.setAction("com.ispring.action.ACTION_TEST1");
intent.setType("text/plain");

上面的intent对象可以通过以下intent-filter的data测试:

<intent-filter>
 <action android:name="com.ispring.action.ACTION_TEST1" />
 <category android:name="android.intent.category.DEFAULT" />
 <data android:mimeType="text/plain" />
</intent-filter>

上面的intent对象可以通过下面的intent-filter的data测试:

<intent-filter>
 <action android:name="com.ispring.action.ACTION_TEST1" />
 <category android:name="android.intent.category.DEFAULT" />
 <data android:mimeType="image/*" />
 <data android:mimeType="text/plain" />
</intent-filter>

上面的intent对象虽然没有通过MIME类型为image/*的第一个data标签测试,但能通过第二个data标签测试,并且intent对象和intent-filter都没有指定任何的URI格式。

上面的intent对象不能通过以下intent-filter中的data测试:

<intent-filter>
 <action android:name="com.ispring.action.ACTION_TEST1" />
 <category android:name="android.intent.category.DEFAULT" />
 <data android:mimeType="text/plain" android:scheme="ispring" />
</intent-filter>

上面的intent对象中没有设置URI信息,但是在该intent-filter中设置了URI中的scheme值,所以intent无法通过intent-filter的data测试。

上面的intent对象无法通过以下intent-filter中的data测试:

<intent-filter>
 <action android:name="com.ispring.action.ACTION_TEST1" />
 <category android:name="android.intent.category.DEFAULT" />
 <data android:mimeType="text/plain" />
 <data android:scheme="ispring" />
</intent-filter>

上面的intent对象没有指定URI信息,但是上面的intent-filter中第二个<data />标签设置了URI中的scheme信息,所以intent对象无法通过该intent-filter的data测试。

intent对象同时包含URI和MIME类型
这种情况下,要分别测试URI以及MIME类型测试是否通过,只有URI以及MIME测试都通过了,data测试才能通过。

对于MIME测试:如果intent的MIME类型能够匹配intent-filter中列出的某一个<data />标签中的MIME类型值,那么MIME类型测试就通过了。
对于URI测试:
又细分两种情况,满足下面的任何一种情况都可以通过URI测试。
如果intent的URI格式能够匹配intent-filter中列出的某一个<data />中的URI,那么URI测试就通过了。
如果intent的URI是content:协议或file:协议,并且整个intent-filter的所有<data />标签中都没有指定URI,那么该intent也能通过URI测试。换句话说,如果一个intent-filter只列出了MIME类型,没有列出任何URI相关的格式的话,那么这个intent-filter就默认是支持content:协议或file:协议的。
下面举几个例子大家自己体会一下。

假设有如下协议为自定义协议ispring:的intent对象:

Intent intent = new Intent();
intent.setAction("com.ispring.action.ACTION_TEST1");
Uri uri = Uri.parse("ispring://blog.csdn.net/sunqunsunqun");
String type = "text/plain";
intent.setDataAndType(uri, type);

上面的intent对象可以通过下面的intent-filter的data测试:

<intent-filter>
  <action android:name="com.ispring.action.ACTION_TEST1" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:scheme="ispring" android:host="blog.csdn.net" />
  <data android:mimeType="text/plain" />
</intent-filter>

上面的intent对象无法通过下面的intent-filter的data测试:

<intent-filter>
  <action android:name="com.ispring.action.ACTION_TEST1" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:scheme="ispring" android:host="blog.csdn.net" android:port="8080" />
  <data android:mimeType="text/plain" />
</intent-filter>

port不满足,URI测试不通过,导致data测试失败。

上面的intent对象无法通过下面的intent-filter的data测试:

<intent-filter>
  <action android:name="com.ispring.action.ACTION_TEST1" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:scheme="ispring" android:host="blog.csdn.net" />
  <data android:mimeType="image/*" />
</intent-filter>

android:mimeType不满足,MIME类型测试不通过,导致data测试失败。

假设有如下协议为content:的intent对象:

Intent intent = new Intent();
intent.setAction("com.ispring.action.ACTION_TEST1");
Uri uri = Uri.parse("content://com.ispring.test");
String type = "text/plain";
intent.setDataAndType(uri, type);

上面的intent对象无法通过下面的intent-filter的data测试:

<intent-filter>
  <action android:name="com.ispring.action.ACTION_TEST1" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:scheme="ispring" />
  <data android:mimeType="text/plain" />
</intent-filter>

URI中的scheme不匹配,导致URI测试不通过,导致data测试失败。

上面的intent对象可以通过下面的intent-filter的data测试:

<intent-filter>
  <action android:name="com.ispring.action.ACTION_TEST1" />
  <category android:name="android.intent.category.DEFAULT" />
  <data android:mimeType="text/plain" />
</intent-filter>

intent中使用的是content:协议,并且整个intent-filter中都没有定义URI格式,所以URI测试是可以通过的,并且MIME类型能找到匹配项,所以可以通过data测试。

综上,我们就完成了对Intent中action、category、data测试的详细解释,本文所有示例代码均在Android Studio 1.0正式版中验证过没有问题。很感谢大家能够耐心读完本博文,希望本文对大家正确使用Intent过滤器有所帮助。

(0)

相关推荐

  • Android 搜索结果匹配关键字且高亮显示功能

    1. 单关键字 匹配 如果只是单关键字的话,那么我们先计算出他的下标,它的长度,然后就可以标记下标到下标+长度的这一段为特殊颜色即可,代码如下: if (name != null && name.contains(keyWord)) { int index = name.indexOf(keyWord); int len = keyWord.length(); Spanned temp = Html.fromHtml(name.substring(0, index) + "<

  • Android6.0来电号码与电话薄联系人进行匹配

    本文将介绍系统接收到来电之后,如何在电话薄中进行匹配联系人的流程.分析将从另外一篇文章(基于Android6.0的RIL框架层模块分析)中提到的与本文内容相关的代码开始. //packages/service/***/Call.java public void handleCreateConnectionSuccess( CallIdMapper idMapper, ParcelableConnection connection) { setHandle(connection.getHandle

  • Android Java实现余弦匹配算法示例代码

     Java实现余弦匹配算法 最近在做一个通讯交友的项目,项目中有一个这样的需求,通过用户的兴趣爱好,为用户寻找推荐兴趣相近的好友.其实思路好简单,把用户的兴趣爱好和其他用户的兴趣爱好进行一个匹配,当他们的爱好相似度比较高的时候就给双方进行推荐.那么如何进行比较是一个问题,其实我们可以通过余弦匹配算法来对用户的兴趣爱好进行比较,根据计算出来的值来得到一个兴趣爱好相近好友列表,并进行排序. 因为我做的项目是Android端的,所以算法是通过Java实现的,废话不过多说了,下面是算法的实现: pack

  • Android中的Intent Filter匹配规则简介

    本文主要介绍了隐式Intent匹配目标组件的规则,若有叙述不清晰或是不准确的地方希望大家指出,谢谢大家:  ) 1. Intent简介 Intent用于在一个组件(Component,如Activity.Service.Broadcast Receiver)中打开另一个组件. Intent可分为隐式(implicitly)和显式(explicitly)两种: Explicitly Intent:在知道要打开哪个具体的Component时使用,通过指定调用者和被调用者即可打开目标Component

  • 从Android源码剖析Intent查询匹配的实现

    前言     这篇文章主要是介绍一下Android Intent,并且从Android源码的角度对Intent查询匹配过程进行分析. Intent介绍     Intent的中文是"意图"的意思,而意图是一个非常抽象的概念,那么在Android的编码设计中,如何实例化意图呢?因此Android系统明确指定一个Intent可由两方面属性来衡量. 主要属性:包括Action和Data.其中Action用于表示该Intent所表达的动作意图,Data用于表示该Action所操作的数据.   

  • Android实现动态自动匹配输入内容功能

    什么是动态自动匹配输入内容呢?举个例子,当我们在百度等搜索引擎的输入框中输入想要搜索的关键词,输入框下面会提示很多相关联的热门搜索项,效果图如下 那在安卓中如何实现这种效果呢?在这里给大家推荐两个Android的控件: AutoCompleteTextView MultiAutoCompleteTextView 一.AutoCompleteTextView 独特属性:android:completionThreshold="2"-–设置输入多少字符时自动匹配 首先,我们先在res文件夹

  • Android编程中号码匹配位数修改的方法

    本文实例讲述了Android编程中号码匹配位数修改的方法.分享给大家供大家参考,具体如下: Android2.1上默认的号码匹配位数是7位,也就是说从右向左算起,如果两个号码有7位是匹配的,那么就认为是相同的号码,如+86 1234567和01234567是相同的号码:所以判断两个号码是否匹配,简单的用"=="是不行的. 安卓在Sqlite层新增了函数phone_numbers_equal用于号码匹配的判断,这个函数是数据库级的,对应的SQL语句是PHONE_NUMBERS_EQUAL

  • Android实现自动匹配关键字并且标红功能

    本文实例为大家分享了Android匹配关键字标红的具体代码,供大家参考,具体内容如下 1. 单关键字匹配 若只需匹配 搜索内容  可以写的简单一些,代码如下: if (name != null && name.contains(mKeyWord)) { int index = name.indexOf(mKeyWord); int len = mKeyWord.length(); Spanned temp = Html.fromHtml(name.substring(0, index) +

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

    如果对Intent不是特别了解,可以参见博文<详解Android中Intent的使用方法>,该文对本文要使用的action.category以及data都进行了详细介绍.如果想了解在开发中常见Intent的使用,可以参见<Android中Intent习惯用法>. 本文内容有点长,希望大家可以耐心读完. 本文在描述组件在manifest中注册的Intent Filter过滤器时,统一用intent-filter表示. 一.概述 我们知道,Intent是分两种的:显式Intent和隐式

  • 详解Android中的ActivityThread和APP启动过程

    ActiviryThread ActivityThread的初始化 ActivityThread即Android的主线程,也就是UI线程,ActivityThread的main方法是一个APP的真正入口,MainLooper在它的main方法中被创建. //ActivityThread的main方法 public static void main(String[] args) { ... Looper.prepareMainLooper(); ActivityThread thread = ne

  • 详解Android中Service AIDL的使用

    目录 前言 Service基本用法--本地服务 远程服务 -- AIDL 服务端 客户端 前言 有些朋友可能是从事开发工作的时间不是特别的长,所以觉得Service相对与另外两个组件activity.broadcast receiver来说,使用可能并不是特别的多,所以对Service来说,理解不是特别的深入,只是有一个大概的概念,今天就和一块来走一下Service,希望能够帮助到大家对Service有更深入的理解. Service基本用法--本地服务 我们知道服务分为本地服务和远程服务,而本地

  • 详解Android中的Service

    Service简介: Service是被设计用来在后台执行一些需要长时间运行的操作. Android由于允许Service在后台运行,甚至在结束Activity后,因此相对来说,Service相比Activity拥有更高的优先级. 创建Service: 要创建一个最基本的Service,需要完成以下工作:1)创建一个Java类,并让其继承Service 2)重写onCreate()和onBind()方法 其中,onCreate()方法是当该Service被创建时执行的方法,onBind()是该S

  • 详解 Android中Libgdx使用ShapeRenderer自定义Actor解决无法接收到Touch事件的问题

    详解 Android中Libgdx使用ShapeRenderer自定义Actor解决无法接收到Touch事件的问题 今天在项目中实现了一个效果,主要是画一个圆.为了后续使用方便,将这个圆封装在一个自定义Actor(CircleActot)中,后续想显示一个圆的时候,只要创建一个CircleActor中即可. 部分代码如下所示: package com.ef.smallstar.unitmap.widget; import android.content.res.Resources; import

  • 详解Android中图片的三级缓存及实例

    详解Android中图片的三级缓存及实例 为什么要使用三级缓存 如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了 假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量.在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响 特别是,当我们想要重复浏览一些图片时,如果每一次浏览都需要通过网络获取,流量的浪费可想而知 所以提出三级缓存策略,通过网络.本地.内存三级缓存图片,来减少不必要的网络交互,避免浪费流量

  • 详解Android中Handler的内部实现原理

    本文主要是对Handler和消息循环的实现原理进行源码分析,如果不熟悉Handler可以参见博文<详解Android中Handler的使用方法>,里面对Android为何以引入Handler机制以及如何使用Handler做了讲解. 概括来说,Handler是Android中引入的一种让开发者参与处理线程中消息循环的机制.我们在使用Handler的时候与Message打交道最多,Message是Hanlder机制向开发人员暴露出来的相关类,可以通过Message类完成大部分操作Handler的功

  • 详解Android 中AsyncTask 的使用

    详解Android 中AsyncTask 的使用 1.首先我们来看看AsyncTask 的介绍:   Handler 和 AsyncTask 都是android 中用来实现异步任务处理的方式:其中: Handler 实例向 UI 线程发送消息,完成界面更新, 优点:对整个过程控制的比较精细:         缺点:代码相对臃肿,多个任务同时执行时,不易对线程进行精确的控制: AsyncTask :比Handler 更轻量级一些,适用于简单的异步处理: 优点:简单 | 快捷 | 过程可控:    

  • 详解Android中获取软键盘状态和软键盘高度

    详解Android中获取软键盘状态和软键盘高度 应用场景 在Android应用中有时会需要获取软键盘的状态(即软键盘是显示还是隐藏)和软键盘的高度.这里列举了一些可能的应用场景. 场景一 当软键盘显示时,按下返回键应当是收起软键盘,而不是回退到上一个界面,但部分机型在返回键处理上有bug,按下返回键后,虽然软键盘会自动收起,但不会消费返回事件,导致Activity还会收到这次返回事件,执行回退操作,这时就需要判断,如果软键盘刚刚由显示变为隐藏状态,就不执行回退操作. 场景二 当软键盘弹出后,会将

  • 详解Android中fragment和viewpager的那点事儿

    在之前的博文<Android 中使用 ViewPager实现屏幕页面切换和页面轮播效果>和<详解Android中Fragment的两种创建方式>以及<Android中fragment与activity之间的交互(两种实现方式)>中我们介绍了ViewPager以及Fragment各自的使用场景以及不同的实现方式. 那如果将他们两结合起来,会不会擦出点火花呢,答案是肯定的.之前在介绍ViewPager时,我们实现了多个ImageView的切换,并配合更新导航原点的状态.那我

随机推荐