Intent

Intent简介Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent,它允许在应用程序与其它的应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。还可以通过intent.putExtra()等方法携带数据。 两种Intent区别显式Intent:通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,去调用Intent.setComponent()\Intent.setClassName()或Intent.setClass()方法 或者在new Intent(A.this,B.class)指明需要转向到的Activity,显式意图明确指定了要激活的组件是哪个组件,一般是在相同的应用程序内部实现的。隐式Intent:通过Intent Filter来实现的,它一般用在没有明确指出目标组件名称的前提下。Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。一般是用于在不同应用程序之间。 隐式Intent我们在编写需要被隐式调用的界面的清单文件时,会指定一个Intent Filter(意图过滤器),它是用来匹配隐式Intent的,当一个意图对象被一个意图过滤器进行匹配测试时,会有三个方面会被参考到: 动作(action)数据(data)类别(catagory) Intent FilterIntent Filter是用来注册Activity Service和Broadcast Receiver具有能在某种数据上执行一个动作的能力。使用Intent Filter,应用程序组件告诉 Android,它们能为其它程序的组件的动作请求提供服务,包括同一个程序的组件、本地的或第三方的应用程序。 为了注册一个应用程序组件为 Intent 处理者,在组件的 manifest 节点添加一个 intent-filter 标签。 在 Intent Filter 节点里使用下面的标签(关联属性),你能指定组件支持的动作、种类和数据: 动作测试元素中可以包括子元素,比如:12345<intent-filter ><action android:name="com.example.project.SHOW_CURRENT" /><action android:name="com.example.project.SHOW_RECENT" /><action android:name="com.example.project.SHOW_PENDING" /></intent-filter > 一条元素至少应该包含一个,否则任何Intent请求都不能和该匹配。如果Intent请求的Action和中个某一条匹配,那么该Intent就通过了这条的动作测试。如果Intent请求或中没有说明具体的Action类型,那么会出现下面两种情况。(1) 如果中没有包含任何Action类型,那么无论什么Intent请求都无法和这条匹配;(2) 反之,如果Intent请求中没有设定Action类型,那么只要中包含有Action类型,这个Intent请求就将顺利地通过的行为测试。 类别测试元素可以包含子元素,比如:1234<intent-filter . . . ><category android:name="android.Intent.Category.DEFAULT" /><category android:name="android.Intent.Category.BROWSABLE" /></intent-filter> 只有当Intent请求中所有的Category与组件中某一个IntentFilter的完全匹配时,才会让该 Intent请求通过测试,IntentFilter中多余的声明并不会导致匹配失败。一个没有指定任何类别测试的 IntentFilter仅仅只会匹配没有设置类别的Intent请求。 数据测试数据在中的描述如下:1234<intent-filter . . . ><data android:type="video/mpeg" android:scheme="http" . . . /><data android:type="audio/mpeg" android:scheme="http" . . . /></intent-filter > 元素指定了希望接受的Intent请求的数据URI和数据类型,URI被分成三部分来进行匹配:scheme、 authority和path。其中,用setData()设定的Inteat请求的URI数据类型和scheme必须与IntentFilter中所指定的一致。若IntentFilter中还指定了authority或path,它们也需要相匹配才会通过测试。     继续阅读
MXlwq's avatar
MXlwq 4月 12, 2016
 | 

Android开启自启动Service或Activity

    继续阅读
MXlwq's avatar
MXlwq 4月 10, 2016
 | 

PendingIntent与Intent

含义Intent表示意图,Pending表示即将发生的事情。 Intent是及时启动,Intent 随所在的activity 消失而消失。PendingIntent用于处理即将发生的事情。比如在通知Notification中用于跳转页面,但不是马上跳转。PendingIntent是一个可以在满足一定条件下执行的Intent,它相比于Intent的优势在于自己携带有Context对象,这样他就不必依赖于某个activity才可以存在。 PendingIntent可以看作是对Intent的包装,通常通过getActivity,getBroadcast,getService来得到PendingIntent的实例,当前activity并不能马上启动它所包含的Intent,而是在外部执行PendingIntent时,调用Intent的。正由于PendingIntent中保存有当前App的Context,使它赋予外部App一种能力,使得外部App可以如同当前App一样的执行pendingintent里的 Intent,就算在执行时当前App已经不存在了,也能通过存在PendingIntent里的Context照样执行Intent。另外还可以处理Intent执行后的操作。 PendingIntent常和AlarmManager 和NotificationManager一起使用,可以理解为延迟执行的Intent,PendingIntent是对Intent一个包装。 PendingIntent getBroadcast方法12345public static PendingIntent getBroadcast(Context context, int requestCode,Intent intent, @Flags int flags) { return getBroadcastAsUser(context, requestCode, intent, flags,new UserHandle(UserHandle.myUserId()));} 注意在AlarmManager中可以使用requestCode的不同(可以用闹钟的ID),让不同闹钟不会覆盖掉。AlarmManager是Android中的一种系统级别的提醒服务,它会为我们在特定的时刻广播一个指定的Intent。而使用Intent的时候,我们还需要它执行一个动作,如startActivity,startService,startBroadcast,才能使Intent有用。通常我们使用PendingIntent,它可以理解为对Intent的封装,包含了指定的动作。我们可以通过PendingIntent的静态方法得到一个PendingIntent对象,如下:1PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 使用PendingIntent的getBroadcast (Context context, int requestCode, Intent intent, int flags)方法可以得到一个发送广播动作的PendingIntent对象。其中getBroadcast的第4个参数可以为以下4个常量或其他支持使用Intent.fillIn()来控制它的变量:FLAG_CANCEL_CURRENT:如果描述的PendingIntent对象已经存在时,会先取消当前的PendingIntent对象再生成新的。FLAG_NO_CREATE:如果描述的PendingIntent对象不存在,它会返回null而不是去创建它。FLAG_ONE_SHOT:创建的PendingIntent对象只使用一次。FLAG_UPDATE_CURRENT:如果描述的PendingIntent对象存在,则保留它,并将新的PendingIntent对象的数据替换进去。 使用PendingIntent的getBroadcast (Context context, int requestCode, Intent intent, int flags)方法可以得到一个发送广播动作的PendingIntent对象。其中getBroadcast的第4个参数可以为以下4个常量或其他支持使用Intent.fillIn()来控制它的变量: FLAG_CANCEL_CURRENT如果描述的PendingIntent对象已经存在时,会先取消当前的PendingIntent对象再生成新的。FLAG_NO_CREATE如果描述的PendingIntent对象不存在,它会返回null而不是去创建它。FLAG_ONE_SHOT创建的PendingIntent对象只使用一次。FLAG_UPDATE_CURRENT如果描述的PendingIntent对象存在,则保留它,并将新的PendingIntent对象的数据替换进去。 接下来看AlarmManager,我们通过以下代码来取得AlarmManager对象。12AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); AlarmManager的常用方法set(int type,long startTime,PendingIntent pi)该方法用于设置一次性闹钟。第一个参数int type指定定时服务的类型,该参数接受如下值:ELAPSED_REALTIME: 在指定的延时过后,发送广播,但不唤醒设备(闹钟在睡眠状态下不可用)。如果在系统休眠时闹钟触发,它将不会被传递,直到下一次设备唤醒。ELAPSED_REALTIME_WAKEUP: 在指定的延时过后,发送广播,并唤醒设备(即使关机也会执行operation所对应的组件) 。延时是要把系统启动的时间SystemClock.elapsedRealtime()算进去的,具体用法看代码。RTC: 指定当系统调用System.currentTimeMillis()方法返回的值与triggerAtTime相等时启动operation所对应的设备(在指定的时刻,发送广播,但不唤醒设备)。如果在系统休眠时闹钟触发,它将不会被传递,直到下一次设备唤醒(闹钟在睡眠状态下不可用)。RTC_WAKEUP: 指定当系统调用System.currentTimeMillis()方法返回的值与triggerAtTime相等时启动operation所对应的设备(在指定的时刻,发送广播,并唤醒设备)。即使系统关机也会执行 operation所对应的组件。第二个参数表示闹钟执行时间。第三个参数PendingIntent pi表示闹钟响应动作:PendingIntent pi:是闹钟的执行动作,比如发送一个广播、给出提示等等。PendingIntent是Intent的封装类。需要注意的是,如果是通过启动服务来实现闹钟提示的话,PendingIntent对象的获取就应该采用Pending.getService(Context c,int i,Intentintent,int j)方法;如果是通过广播来实现闹钟提示的话,PendingIntent对象的获取就应该采用PendingIntent.getBroadcast(Context c,inti,Intent intent,int j)方法;如果是采用Activity的方式来实现闹钟提示的话,PendingIntent对象的获取就应该采用PendingIntent.getActivity(Context c,inti,Intent intent,int j)方法。如果这三种方法错用了的话,虽然不会报错,但是看不到闹钟提示效果。     继续阅读
MXlwq's avatar
MXlwq 4月 10, 2016
 | 

Android Fragment生命周期

Android在3.0版本引入了Fragment功能,它非常类似于Activity,可以...     继续阅读
MXlwq's avatar
MXlwq 4月 05, 2016
 | 

Android学习资源和链接

    继续阅读
MXlwq's avatar
MXlwq 4月 04, 2016
 | 

Android Activity启动模式

在Android中的Activity实例化操作时,Activity的启动模式决定了Act...     继续阅读
MXlwq's avatar
MXlwq 4月 04, 2016
 | 

Android Dialog汇总

Dialog在Android开发中,经常会需要在Android界面上弹出一些对话框。分类: 普通的对话框 多按钮对话框 列表对话框 选择对话框(单选和多选) 进度条对话框 读取对话框 上代码 MainActivity.class     继续阅读
MXlwq's avatar
MXlwq 4月 03, 2016
 | 

Android自定义ToggleButton

准备资源toggleButton是普通png格式的,我们可以使用工具将其改为9.png的,使用9patch工具时有个小技巧,那就是将show patches勾选上,方便我们画点。 res下新建一个选择器新建一个drawable目录,新建一个选择器:toggle_selector.xml:12345<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_checked="true" android:drawable="@drawable/toggle_button_on"></item> <item android:drawable="@drawable/toggle_button_off"></item></selector>     继续阅读
MXlwq's avatar
MXlwq 4月 03, 2016
 | 

Android TimePicker控件

在Android中使用TimePicker(时间选择器),可以进行时间的快速调整,此类定...     继续阅读
MXlwq's avatar
MXlwq 4月 01, 2016
 | 

px/dp/sp/

20160728修改 基本概念dp:Density-independent pixels,以160PPI屏幕为标准,则1dp=1px px是pixel的缩写 dp和px的换算公式dp*ppi/160 = px如1dp x 320ppi/160 = 2px。 sp:Scale-independent pixels,安卓的字体单位,以160PPI屏幕为标准,当字体大小为100%时,1sp=1px。 sp 与 px 的换算公式:sp*ppi/160 = px in表示英寸,是屏幕的物理尺寸。每英寸=2.54厘米。     继续阅读
MXlwq's avatar
MXlwq 3月 29, 2016
 |