`

intent and service

阅读更多
明天才开始讨论包需求,估计离进入开发阶段还要一段时间,今天继续复习android in action,结合之前的知识,把总结的东西记一记

1. 一个应用内部各组件之间的跳转,以及不同应用间组件的跳转(这里的组件包括activity、service、receiver、provider),是通过Intent和IntentFilter实现的。包括显式Intent和隐式Intent。

对于在Manifest文件中没有配置Intent-Filter的组件,只能在应用内部通过显式Intent来跳转,这种情况需要设置Intent的Component。

在Manifest中配置了Intent-Filter的组件,既可以通过显式Intent跳转,也可以通过隐式Intent跳转,并且可以跨应用跳转。这种情况下,需要设置Intent的Action、Category、Data

此外,可以通过给Intent设置Extra,来携带一些数据

Android in Action这本书里说,understanding intent, and you will understand android。现在来看,也是夸大了一点,android也没他说的这么简单

2. 至于在设置了Intent,并发送Intent请求,比如startActivity(Intent intent)之后,系统寻找匹配组件的过程是这样的。

首先,如果是显式Intent,那么比较简单
Intent intent = new Intent(this,XXXActivity.class);

这种情况下,android系统直接到该应用的Manifest文件中找指定的Activity,如果找到则跳转,如果没有找到,则抛出一个异常

如果是隐式Intent,情况要略微复杂一点,也不难
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setCategory(Intent.CATEGORY_DEFAULT);

这种情况下,系统会把所有应用内,配置了Intent-Filter的Activity都遍历一遍,包括安装的第三方应用,和系统自带的应用。根据Intent的参数,和Intent-Filter的设置逐一匹配。如果没有找到合适结果,则抛出异常。如果只有唯一结果,则直接跳转。如果有多个结果,则弹出对话框让用户进行选择

3. 至于Intent和IntentFilter的匹配规则,很多地方都能找到详细的文档,我这里就不罗嗦了。只是有一点特别提醒一下,由于隐式的Intent,如果没有设置Category,则跳转的时候系统会自动加上DEFAULT CATEGORY,相当于以下代码
intent.setCategory(Intent.CATEGORY_DEFAULT);

所以为了能够匹配成功,在intent-filter的配置里,也要加上CATEGORY_DEFAULT才可以,否则就匹配不到了

4. 看sample代码,学习到一个开机时自动启动某个service的方法,还是不错的。首先配置一个BroadcastReceiver,其intent-filter加上action:android.intent.action.BOOT_COMPLETED。这样的话,当系统开机之后,广播一个BOOT_COMPLETED消息的时候,这个Receiver就能收到

然后在此Receiver的onReceiver()方法里,就可以调用startService()方法了

5. 前面的博客已经介绍过Activity的生命周期了,与它不同的是,Receiver组件的生命周期是很短的,在执行过onReceiver()方法之后,该组件的实例和所在的进程,都被标记为可以被系统回收。所以在Receiver里,不能搞一些异步操作,也不能长久的存放变量,很可能说没就没了

6. 大家都知道adb shell命令是很好用的,可以用来查看文件,执行SQLite操作等。如果eclipse同时连接了多个AVD,或许还连接了真机,这个时候直接打adb shell就不好使了。

可以先打adb devices命令,就可以看到目前有哪些AVD和真机可以连接

然后打adb -s emulator-5554 shell,就可以连接到emulator-5554这台AVD上

7. 关于sqlite3命令,连接上SQLite后。有2个命令比较方便,一个是.tab,可以看到所有的表。第二个是.h on,可以在查询时看到列的名称

8. 再介绍一下Service组件的生命周期,比Activity也要简单一点。分两种情况

如果Service是通过startService()方法启动的,那么这是一个后台服务,它的生命周期就比较长,会经历onCreate()、onStart()、onDestory()方法。其实还有一些其他方法,比如onLowResource()等,不过不常用,主要的就是前面说的3个方法

如果Service是绑定到另一个组件上的,那其生命周期就不长于绑定的组件,而且onStart()方法不会被系统调用

9. 虽然可以通过startService(Intent)方法,来启动另一个应用中的Service,其实就是使其调用onStart()方法。但是如果需要调用另一个应用中的Service组件的某一个特定方法,这种粒度的需求,靠Intent就无法实现了。因为不同的应用都是跑在独立的沙盒中的,也处于不同的进程中。(前面已经介绍过,一个应用对应一个进程,以及一个Dalvik实例)

这种情况下,android提供了AIDL方式,来实现跨应用的服务调用。粗略看了一下,感觉比较复杂。既然目前没有这个场景,我也就不去深究了,知道有这么一种方式就可以了,以后需要的时候再来看。有兴趣的朋友,可以去看android in action这本书第4章的结尾部分,讲得非常清楚
分享到:
评论

相关推荐

    android intent and intent-filters

    在Android应用开发中,Intent是连接应用程序组件的重要机制,它是一种消息传递对象,用于启动其他组件(如Activity、Service、BroadcastReceiver)或者传递数据。Intent-filters则定义了组件能够响应的Intent类型,...

    android----intent

    2. android 4-Activity and Intent.pptx - 这个文件可能是关于Android的第4节,专门讨论Activity和Intent的关系。可能会深入解释Activity的生命周期与Intent如何影响其状态变化,比如如何通过Intent启动Activity以及...

    1.高焕堂讲解 Intent-based Programming

    这种编程方式强调通过 Intent 对象来表达应用的意图或目标,实现组件间的松散耦合,增强系统的可插拔性(Plug and Play)。 在 Android 系统中,四大核心组件——Activity、Service、IntentReceiver 和 ...

    aild cleinet and aidl service

    标题"aild cleinet and aidl service"暗示我们将探讨如何通过AIDL实现客户端(client)和服务(service)之间的通信。 描述中提到“很好的学习 aidl 跨进程访问”,这意味着我们会有两个APK文件,一个是AIDLClient...

    intent 调用相机

    在Android应用开发中,Intent是实现组件间通信的关键机制,它可以用来启动活动(Activity)、服务(Service)或者广播接收器(Broadcast Receiver)。当我们想要调用系统相机服务时,Intent的作用尤为显著。本教程将...

    Android系列教程之十二:Intents and Intent Filters(三).docx

    Intent Filters则是接收Intent的组件(如Activity、Service等)用来声明它们能处理的Intent类型。本教程将深入讲解Intent和Intent Filters,特别是如何利用它们进行数据检测。 在Intent Filter中,`<data>`标签用于...

    intent实现两个activity间的数据传输

    在Android应用开发中,Intent是连接应用程序组件的重要机制,它被用来启动新的Activity或Service,同时还能传递数据。本文将详细讲解如何运用Intent实现在两个Activity之间进行数据传输,包括Activity1向Activity2...

    intent传递ArrayList<T>

    在Android应用开发中,Intent是连接各个组件(如Activity、Service等)的重要桥梁,用于传递数据和启动意图。当我们需要在不同的组件之间传递一个ArrayList对象时,由于Intent默认只支持基本类型和Parcelable接口...

    【Intent传递】对象、数组 DEMO

    在Android应用开发中,Intent是连接各个组件(如Activity、Service等)的重要纽带,它用于在组件间传递数据。本DEMO重点展示了如何通过Intent来传递对象和数组,这是一个非常实用且常见的技能点。下面我们将深入探讨...

    Android入门开发实例--Toast、Notification、Intent应用

    结合压缩包中的`My_Toast_and_Notification`文件,我们可以创建一个简单的Android项目,实现`Toast`显示、`Notification`推送以及使用`Intent`启动新的Activity。在`MainActivity`中,你可以为不同的按钮绑定对应的...

    Xamarin.Android之Intent传递对象简单实例

    在Android应用开发中,Intent是一种强大的机制,用于在不同的组件之间进行通信,如活动(Activity)、服务(Service)以及广播接收器(BroadcastReceiver)。在Xamarin.Android中,我们可以利用C#的强大特性来处理...

    Android 官方SDK文档 Service

    关于这一点的更多信息可以在官方文档的“Processes and Threads”部分找到。 - **IntentService类**:这是一个标准实现的Service类,它自带一个工作线程,在这个线程中调度其工作。 #### 二、Service的分类 根据...

    android service 学习(下)

    public IBinder onBind(Intent intent) { return binder; } private final IMusicControlService.Stub binder = new IMusicControlService.Stub() { @Override public void stop() throws RemoteException { ...

    Android中Intent传递对象的3种方式详解

    在Android开发中,Intent是应用组件之间通信的重要桥梁,它能用来启动Activity、Service等,同时也承担着数据传递的角色。然而,Intent的putExtra()方法默认并不支持自定义对象的直接传输,这时我们需要采取特定的...

    Android Espresso Test Intents and Webview

    Intent是Android系统中用来启动Activity、Service或发送广播的一种机制。在测试中,我们可能需要模拟用户通过点击按钮触发的Intent行为。Espresso提供了一个名为`IntentsTestingRule`的规则类,允许我们在测试环境中...

    Android官方api文档完整版+androidstudio快捷键

    public final IBinder onBind(Intent intent)从类 Service 复制的描述 Return the communication channel to the service. May return null if clients can not bind to the service. The returned IBinder is ...

    Android 通过Intent使用Bundle传递对象详细介绍

    Intent通常用于启动新的Activity或者Service,而在Intent中传递数据时,Bundle是常用的工具。本文将详细讲解如何通过Intent使用Bundle在Android中传递对象。 首先,我们需要知道在Android中,如果想要通过Intent...

Global site tag (gtag.js) - Google Analytics