action如何返回json提升ACTION

后使用快捷导航没有帐号?
查看: 191593|回复: 71
新人欢迎积分1 阅读权限50积分1329精华0UID帖子金钱3954 威望0
Lv.5, 积分 1329, 距离下一级还需 1171 积分
UID帖子威望0 多玩草5 草
此贴由多玩论坛【孤独的士官长】原创,转载者请注明出处。
为了坚持24小时H的原则,为了让睡觉的时候也可以享受H的快感。。现在我们大家来讨论如何做春梦。。
当然,本帖是本人的原创帖,但是也同时征集个大“春梦高手”来讨论这个话题。。。。
想做一个很好的梦,有一段黄金时间,大家要好好把握住。那就是自己还有理智而非常困的情况下,最长出现的情况就是因为某种原因突然惊醒(非正常睡醒),而恢复理智,但是马上又会进入睡眠的这段时间。因为这种巧合出现几率并不高,所以是非常宝贵的。。这种情况,自己在有理智的情况下,越困,越容易睡着,就越好。。下文将提到如何利用
如何在梦中和暗恋的人相会:
黄金时间时想着她就行,想着和她H,那做起梦来真的可能和她H呢。。
如何提高做春梦的几率:
有不少人想做,就是偏偏不做。。想提高做春梦的几率吗?
最基本的前提,你自己必须想H,想做春梦才行。。
经过本人研究,在睡觉的时候脸朝上,然后把其中一只手放在胸口压住,然后等待美梦出现就好了。。
当然,黄金时间这样做是最好的,而且在一只手压在胸口的同时,在脑子里想着和某人(可以是你暗恋或者喜欢的人)H事,或者和N人H也行,但是别太努力的想,稍微带点那种意思就行,要不然会彻底睡不着的。。
如何换梦:
觉得自己做的梦没意思,没趣味,大家可以试着去自杀。。
别怕,不疼的。我个人最爱用的方法就是急跑后装墙而“死”,死后就容易换梦。。
不过不是每次都有用的,有时想死都难[em58]
处理紧急情况:
不知道大家有没有这种经历,年幼时,我因为这个受了不少苦呢。。
在睡觉的时候,脑子里突然有一种奇怪的声音响起,就和一大堆蜜蜂在脑子旁飞的声音。
声音越尖,脑子就越疼。想叫,想喊就是发不出声音。。想动,就是动不了,身体麻麻的,特别痛苦。
用手压胸口,或者不习惯的人,脸对着天睡容易出现这种情况。。
其实这就好象《火影忍者》里中了幻术一样,只要在现实中有人叫你,或者有人碰一下你,就可以解除情况,但是99%是没人帮你的,怎么半呢?
其实处理方法很简单,只要让精神脱离这个状态,恢复正常的精神就可以脱离。
当时并不是绝对不能动的,但是动的幅度很小,想让自己有感觉,最快捷的方法:{我们只要拼命的咬自己舌头,就可以解除这种状态}
放心,一点都不疼的,因为你当时一点力气也没有。相反,如果你在心中不“用力的咬”嘴反而会因为麻痹动都不动一下
当你的舌头有了触感,而传达到大脑以后,你的身体就会慢慢恢复正常。这时你可以翻翻身活动一下,身体会舒服些。。
另外还有一种方法,也可以解除这种状况,但是难度特别高,我个人也不是很容易用出。那就是让精神在一瞬间变化,这个变化足可以让你惊吓,或者过度惊讶而从梦中惊醒。比如做噩梦时突然有魔鬼扑向你,让你突然醒过来。。或者想起某件超级重要的事让你从梦中醒过来,也可以解除这情况。。
如何让春梦更长,不容易醒。。
大家最好经常手X,把精精全部射出来,免得因为梦遗而醒过来。
虽然很困难,但是如果可能的话,最好控制好自己的兴奋度,不要过度兴奋。比如一只手指在摸MM的H地带,摸上了隐,而现实中正在睡觉的你,手指也会因为过度兴奋,而真的动起来。虽然幅度很小,但是足以让你从梦中醒来,而结束春梦。。
我们还可以勤换着地方摸来尽可能避免在同一个地方连续摸而过度兴奋醒过来。。
梦中的必杀计之一,凌波微步使用方法:
想H,而又找不到MM,心急么?想不想在梦里以飞的速度奔跑呢?我来教大家秘诀。
梦和现实中是不一样的,如果你把精神全集中在自己的加速上,反而会很慢,甚至连动都动不了。。毕竟梦和现实中是不一样的。。
如果想跑的快,就在心中想我们好象是在做汽车一样,身边的物体快速的往后跑(做在汽车里面看外面,任何不动的物体都是往后跑的。汽车跑的越快,物体后跑的速度就越快。。)如果精神够集中,你身旁的物体就会真的快速的往后跑,然而你也就会跟着飞速向前跑起来。。
梦中的必杀计之二,腾空术使用方法:
想飞吗?跟我学吧!
集中精神,在心中想着自己慢慢的飘起来,别太急,不要想着马上就能飘起来,慢慢的来。精神足够集中的话,就会打破梦里原本无法飞的规则,真的飘起来。然后同样的方法,就可以让自己在空中左右飘,或者向前飞。。
注意,梦里的飞也是有惯性的,控制好,别飞错地方,否则你可能会进入“异次元空间”而回不来,不过在“异次元空间”里可能会遇到更多的MM也说不定。。
梦中必杀计之三,瞬间移动使用方法:
在梦中,眼睛盯着可以看清形状的物体,或者干脆盯着某MM。学过美术的人应该都很轻松的理解什么叫“近大远小”。你看着的东西,一定不会很大。。
然后在脑子里想想到了你想瞬间移动的地方,看到那个东西是什么样子,什么大小。。
然后在脑子里把那个小的物品(东西或人)瞬间在视觉里换成大的,也就是近距离观察的样子。如果你够快,精神够集中。你会发现你真的到了那个物体的旁边,而实现了瞬间移动的作用。。
好了,说了这么多也累了,大家练练吧。
这帖子多读读,多在脑子里模拟模拟,因为在梦中可能把这帖子的事忘掉。如果让这帖子住进你的潜意识,自当受益非浅。
不过如果你是位MM,在这帖子的某些地方,也许和我们男生们不太一样,但是很多地方还是可以学习的。。
支持原创,或者其他高手想谈谈的话,请回帖支持我吧。。
新人欢迎积分1 阅读权限50积分1329精华0UID帖子金钱3954 威望0
Lv.5, 积分 1329, 距离下一级还需 1171 积分
UID帖子威望0 多玩草5 草
沙发& && && && && && && && && && && && && && && &
新人欢迎积分1 阅读权限40积分367精华0UID帖子金钱3365 威望0
Lv.4, 积分 367, 距离下一级还需 633 积分
UID帖子威望0 多玩草0 草
地板& && && && && && && && && &&&
新人欢迎积分1 阅读权限90积分20271精华0UID帖子金钱25709 威望0
论坛第一资深前排无心圆攻论部
Lv.9, 积分 20271, 距离下一级还需 14729 积分
UID帖子威望0 多玩草65 草
& &这么压?
FORZA JUVE!
新人欢迎积分0 阅读权限99积分41859精华0UID830456帖子金钱52360 威望3
曾經的水軍
Lv.10, 积分 41859, 距离下一级还需 13141 积分
UID830456帖子威望3 多玩草254 草
好高多姿啊··············
FORZA JUVE!
新人欢迎积分0 阅读权限99积分41859精华0UID830456帖子金钱52360 威望3
曾經的水軍
Lv.10, 积分 41859, 距离下一级还需 13141 积分
UID830456帖子威望3 多玩草254 草
上贴打错。本贴纠正。。好多字啊!!!!
新人欢迎积分0 阅读权限40积分589精华0UID帖子金钱2511 威望0
Lv.4, 积分 589, 距离下一级还需 411 积分
UID帖子威望0 多玩草10 草
神楼主!完全的碉堡了!
FORZA JUVE!
新人欢迎积分0 阅读权限99积分41859精华0UID830456帖子金钱52360 威望3
曾經的水軍
Lv.10, 积分 41859, 距离下一级还需 13141 积分
UID830456帖子威望3 多玩草254 草
七叶树 确实很长········
FORZA JUVE!
新人欢迎积分0 阅读权限99积分41859精华0UID830456帖子金钱52360 威望3
曾經的水軍
Lv.10, 积分 41859, 距离下一级还需 13141 积分
UID830456帖子威望3 多玩草254 草
我竟然又来了一次······
新人欢迎积分1 阅读权限50积分1329精华0UID帖子金钱3954 威望0
Lv.5, 积分 1329, 距离下一级还需 1171 积分
UID帖子威望0 多玩草5 草
黑擇朙丶 发表于
我竟然又来了一次······
黑泽明?为啥我想到了苍老师和江泽明
神一样的男人
新人欢迎积分0 阅读权限40积分369精华0UID帖子金钱1546 威望0
Lv.4, 积分 369, 距离下一级还需 631 积分
UID帖子威望0 多玩草0 草
深不见底................
新人欢迎积分1 阅读权限40积分855精华0UID帖子金钱1140 威望0
Lv.4, 积分 855, 距离下一级还需 145 积分
UID帖子威望0 多玩草159 草
你为什么要停止服药?
新人欢迎积分1 阅读权限50积分1355精华0UID帖子金钱6931 威望0
Lv.5, 积分 1355, 距离下一级还需 1145 积分
UID帖子威望0 多玩草100 草
这帖子碉堡了。。。。。。。。。。。
FORZA JUVE!
新人欢迎积分0 阅读权限99积分41859精华0UID830456帖子金钱52360 威望3
曾經的水軍
Lv.10, 积分 41859, 距离下一级还需 13141 积分
UID830456帖子威望3 多玩草254 草
好给力的神贴·········
   禁止发言
新人欢迎积分1 阅读权限80积分10006精华0UID帖子金钱6928 威望0
哔哩哔哩(B站)会员。
Lv.8, 积分 10006, 距离下一级还需 9994 积分
UID帖子威望0 多玩草231 草
膜拜中!& && &
马年新春勋章
手机APP马年迎春,马上有钱!
手机论坛勋章
APP发帖双倍积分,登陆即送勋章!
需要金钱:1100
Powered by
手机盒子客户端点击或扫描下载分类于 , ,
| jennifer725 |
邮件设计中Call-to-action的学问
在邮件内容中设计一个具有吸引力的Call-to-action(行为召唤),当收件人了解邮件的目的后点击跳转到相应的着陆页,产生流量或者订单,有效地完成转化。
邮件中如果不包含Call-to-action,也许会让订阅者感到很无助
以下案例中,对比邮件中不包含醒目的Call-to-action,点击率上升23.2
灵动创新call-to-actionA/B测试
而Call-to-action的设计如何才能抓住订阅者的眼球,并且让他们不可抗拒的采取行动,这里面蕴含了不少学问,让我们一起来看一看:
Call-to-action有主次之分
REI注册后提示填写订阅内容邮件
1:Main Call-to-action;2:Secondary Call-to-action;3:Tertiary Call-to-action
Main Call-to-action
结合邮件的主题和目的为订阅者提供一个采取行动的按钮,当然,这个按钮应该是您最希望订阅者点击的。
如果您的邮件主题和目的仅仅是号召收件人去网站注册会员或是对某一个产品购买产生订单,邮件中只需要一个Main Call-to-action,过多的行为召唤,也许会分散收件人的注意力。
■案例:ModCloth有趣的定制个性化内容邮件■
ModCloth有趣的定制个性化内容邮件
亮点一:设计风格独特有个性,给邮件接收者带来视觉冲击,Call-to-action明显明确。
亮点二:文案精彩,订阅者乐于提供自己的style,Modcloth为订阅者提供更相关的内容同时还可细分联系人列表。
■案例: Focus Pointe Global邀请参与问卷调查邮件■
Focus Pointe Global邀请参与问卷调查邮件
亮点一:设计风格简单大方,Call-to-aciton上使用明确的”Start Survey”号召语言。
亮点二:文案中阐明调查问卷主题、耗时、以及参与者可以获得的奖励,这对订阅者来说,是一种非常好的用户体验和激励措施。
Secondary and Tertiary Call-to-action
同Main Call-to-action相比,设计者往往会淡化其他Call-to-action的设计,其目的是突出Main Call-to-action,吸引收件人点击。
Secondary行为召唤和Tertiary行为召唤可有可无,当您的邮件营销目标不仅仅是号召收件人去网站注册会员或是对某一个产品产生购买,而是对消费者提供更多相关产品的选择空间时,这些行为召唤也相当重要!
■案例:BELLE&CLIVE营销邮件■
根据产品的类别分类介绍,并提供产品的折扣信息来吸引收件人点击图片跳转至产品信息页面。
BELLE&CLIVE营销邮件
■案例:HAUTELOOK营邮销件■
在Banner中设计了一款今日特价的时尚女鞋,同时还为收件人提供了更多相关商品信息。
HAUTELOOK营邮销件
什么样的Call-to-action形式更具有吸引力
Call-to-action的表现形式有三种:按钮、图片、链接。
按钮 Call-to-action,例如上文McAfee的营销邮件中使用了一个”START NOW”的按钮,醒目且具有号召性的语言,收件人可以很快的明确邮件的目的。
图片Call-to-action,例如YOOX的Banner是一张切图拼出来的大图片,实际Call-to-action是整张图片,这样也有好处,收件人点击图片中的任何位置,跳转的都是同一个的着陆页,有效的增加了转化。
链接Call-to-action,例如Evernote的Newsletter中,文字链接来引导收件人点击了解更多相关内容,其实当企业能够获得订阅者的信任并且建立良好的黏着度后,邮件即使使用一些文字做链接,依然可以维持邮件的打开和点击热度。
EvernoteNewsletter
以上为您介绍和分享了许多Call-to-action的学问和邮件设计案例,但采用哪种Call-to-action形式,企业还需要根据具体的营销活动和目标来设计,邮件的A/B测试可以帮助您知道订阅者更喜欢哪种表现形式,测试内容包括:
★ Call-to-action的表现形式
★ Call-to-action按钮的大小
★ Call-to-action放置的位置
★ Call-to-action被放置的频率(可测试在邮件中多个位置放置同一个按钮,进行数据比较)
灵动邮件营销博客版权声明,转载时请以超链接形式标明文章出处:《如何设计Call-to-action,才能增加点击率?》
13:52 | 分类于 , ,
| jennifer725
------------------------------------------------------------
企业网站:.cn
新浪微博:/unimail
腾讯微博:/uni-mail
最新发布文章
最新文章日期
2013年十一月
11121314151617
18192021222324
2526282930科学的工作方法有效提高工作效能_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
科学的工作方法有效提高工作效能
上传于||文档简介
&&j​d
大小:529.00KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢骑马与砍杀战团怎么提升领主关系_百度知道如何提升ACTION_SIM_STATE_CHANGED的接收速度? - 推酷
如何提升ACTION_SIM_STATE_CHANGED的接收速度?
在Android中,BroadcastReceiver分动态注册和静态注册. 静态注册的一个优势就是:当你的BroadcastReceiver可以接受系统中
某个broadcast时,系统会自动启动你的程序,从而让BroadcastReceiver完成相关处理; 而动态注册则只有在程序运行时且没有
unregisterReceiver才能接收到broadcast.
此时,假设我们要在系统开机后,要对SIM卡联系人进行读取操作,那么我们应该如何注册自己的BroadcastReceiver呢?
通过静态注册receiver来处理ACTION_SIM_STATE_CHANGED的broadcast,当icc state为LOADED时,读取SIM卡联系人.
这是一种比较常规的做法. 但是这个方案有一个比较严重的问题,那就是接收到broadcast的时机太晚了。结果就是,可能开机几
分钟过去了,SIM卡联系人却还没加载出来。
通过查看IccCardProxy中broadcastIccStateChangedIntent()函数的代码,我们发现,它发送的就是一个sticky broadcast
ActivityManagerNative.broadcastStickyIntent(intent, READ_PHONE_STATE, UserHandle.USER_ALL)
按照常理来推断,一个sticky的broadcast不应该需要耗时这么久的。
那问题究竟出在什么地方了呢?
在调查这个问题之前,我们先简单看一下,静态注册的receiver和动态注册的receiver是如何被管理的呢?
静态注册receiver:
简单讲,系统启动时,创建PackageManagerService对象,简称PMS,然后通过scanDirLI函数对各个路径进行扫描,保存receiver等等
main[] // PackageManagerService.java
PackageManagerService()
scanDirLI()
scanPackageLI(File scanFile, int parseFlags, int scanFlags, long currentTime, UserHandle user)
parsePackage() // PackageParser.java
// scanPackageLI(PackageParser...)调用scanPackageDirtyLI来进一步处理parsePackage()生成的PackageParser.Package对象pkg
// scanPackageDirtyLI将pkg中的receiver添加到PMS的mReceivers中(具体代码:mReceivers.addActivity(a, &receiver&)),
// 并将pkg添加到PMS的mPackages中(具体代码:mPackages.put(pkg.applicationInfo.packageName, pkg))
scanPackageLI(PackageParser.Package pkg, int parseFlags, int scanFlags, long currentTime, UserHandle user)& // PackageManagerService.java
parseBaseApk(File apkFile, AssetManager assets, int flags) // PackageParser.java
parseBaseApk(Resources res, XmlResourceParser parser, int flags, String[] outError)
parseBaseApplication() // // 将生成的receiver放到receivers中
} else if (tagName.equals(&receiver&)) {
Activity a = parseActivity(owner, res, parser, attrs, flags, outError, true, false);
if (a == null) {
mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED;
owner.receivers.add(a);
} else if (tagName.equals(&service&)) {
通过上面的简单分析,我们可以发现所有静态注册的receiver是通过PMS进行管理的.
动态注册的receiver:
相比静态注册,动态注册的流程要简单许多.
registerReceiver(BroadcastReceiver receiver, IntentFilter filter) // ContextImpl.java
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)
registerReceiverInternal()
registerReceiver() // AMS
在AMS的registerReceiver函数中,receiver和broadcast filter相关信息被放到了mRegisteredReceivers和mReceiverResolver中.
了解了静态注册和动态注册receiver在PMS和AMS中的大致流程后,再来看下IccCardProxy发送sticky broadcast时AMS的大概流程.
broadcastStickyIntent(intent, READ_PHONE_STATE, UserHandle.USER_ALL) // ActivityManagerNative.java
broadcastIntent() // ActivityManagerService.java 简称AMS
broadcastIntentLocked()
下面贴一下broadcastIntentLocked中比较重要的处理
private final int broadcastIntentLocked(ProcessRecord callerApp,
String callerPackage, Intent intent, String resolvedType,
IIntentReceiver resultTo, int resultCode, String resultData,
Bundle map, String requiredPermission, int appOp,
boolean ordered, boolean sticky, int callingPid, int callingUid,
int userId) {
intent = new Intent(intent);
// By default broadcasts do not go to stopped apps.
intent.addFlags(Intent.FLAG_EXCLUDE_STOPPED_PACKAGES);
userId = handleIncomingUser(callingPid, callingUid, userId,
true, ALLOW_NON_FULL, &broadcast&, callerPackage);
* Prevent non-system code (defined here to be non-persistent
* processes) from sending protected broadcasts.
int callingAppId = UserHandle.getAppId(callingUid);
// Figure out who all will receive this broadcast.
List receivers = // PMS中的结果
List&BroadcastFilter& registeredReceivers = // AMS中的结果
// Need to resolve the intent to interested receivers...
if ((intent.getFlags()&Intent.FLAG_RECEIVER_REGISTERED_ONLY)
// 向PMS查询符合条件的receiver
receivers = collectReceiverComponents(intent, resolvedType, callingUid, users);
if (intent.getComponent() == null) {
if (userId == UserHandle.USER_ALL && callingUid == Process.SHELL_UID) {
// 向AMS查询符合条件的receiver
registeredReceivers = mReceiverResolver.queryIntent(intent,
resolvedType, false, userId);
final boolean replacePending =
(intent.getFlags()&Intent.FLAG_RECEIVER_REPLACE_PENDING) != 0;
// 注意,这里用的是从AMS中查询出来的符合条件的receiver
int NR = registeredReceivers != null ? registeredReceivers.size() : 0;
if (!ordered && NR & 0) {
// If we are not serializing this broadcast, then send the
// registered receivers separately so they don't wait for the
// components to be launched.
final BroadcastQueue queue = broadcastQueueForIntent(intent);
BroadcastRecord r = new BroadcastRecord(queue, intent, callerApp,
callerPackage, callingPid, callingUid, resolvedType, requiredPermission,
appOp, registeredReceivers, resultTo, resultCode, resultData, map,
ordered, sticky, false, userId);
if (DEBUG_BROADCAST) Slog.v(
TAG, &Enqueueing parallel broadcast & + r);
final boolean replaced = replacePending && queue.replaceParallelBroadcastLocked(r);
if (!replaced) {
queue.enqueueParallelBroadcastLocked(r);
queue.scheduleBroadcastsLocked();
registeredReceivers =
if ((receivers != null && receivers.size() & 0)
|| resultTo != null) {
BroadcastQueue queue = broadcastQueueForIntent(intent);
BroadcastRecord r = new BroadcastRecord(queue, intent, callerApp,
callerPackage, callingPid, callingUid, resolvedType,
requiredPermission, appOp, receivers, resultTo, resultCode,
resultData, map, ordered, sticky, false, userId);
if (DEBUG_BROADCAST) Slog.v(
TAG, &Enqueueing ordered broadcast & + r
+ &: prev had & + queue.mOrderedBroadcasts.size());
if (DEBUG_BROADCAST) {
int seq = r.intent.getIntExtra(&seq&, -1);
Slog.i(TAG, &Enqueueing broadcast & + r.intent.getAction() + & seq=& + seq);
boolean replaced = replacePending && queue.replaceOrderedBroadcastLocked(r);
if (!replaced) {
// 注意,被放到ordered broadcast中了!
queue.enqueueOrderedBroadcastLocked(r);
queue.scheduleBroadcastsLocked();
return ActivityManager.BROADCAST_SUCCESS;
collectReceiverComponents()和mReceiverResolver.queryIntent()是broadcastIntentLocked()中两个重要的函数调用.分别初始化了broadcastIntentLocked()中的receivers和registeredReceivers变量.
collectReceiverComponents()基本是通过调用AppGlobals.getPackageManager().queryIntentReceivers()来查询符合条件的receiver,
也就是PMS的queryIntentReceivers()函数进行查询,进而通过PMS中mReceivers变量的queryIntent来执行查询操作.
可见,collectReceiverComponents()最终查询到的是静态注册的符合条件的receiver.
再来简单看下mReceiverResolver.queryIntent()方法的查询结果. 我们在执行AMS的registerReceiver()时,将broadcast以及broadcast filter相关的
信息放到了mReceiverResolver中,因此,这里查询到的是所有符合条件的动态注册的receiver.
最终,符合条件的静态注册的receiver被保存在broadcastIntentLocked函数中receivers变量中;符合条件的动态注册的receiver被保存在registeredReceivers变量中。
enqueueParallelBroadcastLocked
时,却只使用了registeredReceivers,即动态注册的receiver. 而静态注册的receiver却被
enqueueOrderedBroadcastLocked
放到了ordered broadcast队列中!
下面再来简单看下BroadcastQueue对broadcast的处理流程:
scheduleBroadcastsLocked()
&&& handleMessage() // BroadcastQueue$BroadcastHandler
&&&&&&& processNextBroadcast()
&&&&&&&&&&& deliverToRegisteredReceiverLocked() //
non-ordered
&&&&&&&&&&&&&&& performReceiveLocked()
&&&&&&&&&&&&&&&&&&& scheduleRegisteredReceiver() // ActivityThread$ApplicationThread
&&&&&&&&&&&&&&&&&&&&&&& performReceive() // LoadedApk$ReceiverDispatcher
&&&&&&&&&&&&&&&&&&&&&&& mActivityThread.post(args)
&&&&&&&&&&&&&&&&&&&&&&&&&&& run() // LoadedApk$Args
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& receiver.onReceive(mContext, intent) // 执行BroadcastReceiver的onReceive方法
&&&&&&&&&&& processCurBroadcastLocked() //
&&&&&&&&&&&&&&& scheduleReceiver() // ActivityThread$ApplicationThread
&&&&&&&&&&&&&&&&&&& handleMessage() // ActivityThread$H
&&&&&&&&&&&&&&&&&&&&&&& handleReceiver() // ActivityThread
&&&&&&&&&&&&&&&&&&&&&&&&&&& receiver.onReceive(context.getReceiverRestrictedContext(), data.intent) // 执行BroadcastReceiver的onReceive方法
由于ordered broadcast是一条一条来处理,也就不难发现为什么我们静态注册的接收ACTION_SIM_STATE_CHANGED的broadcast receiver很晚才能被启动了.
既然静态注册的receiver只能接受ordered broadcast后,如果想提升接收broadcast的速度,那我们只能使用动态注册receiver了。也就引出了我们的第二个方案.
通过自定义Application并在自定义Application中动态注册receiver来处理ACTION_SIM_STATE_CHANGED的broadcast,在AndroidManifest.xml中声明时为自定义
的application添加android:persistent=&true&属性. 这样就可以大幅提升接收ACTION_SIM_STATE_CHANGED的速度,但这是为什么呢?
在AMS的systemReady()中将通过PMS的getPersistentApplications()获得所有persistent属性为true的程序,并将他们启动起来. 即在进入launcher之前就被启动了.
而我们在自定义的Application的onCreate()中注册receiver, 来接收ACTION_SIM_STATE_CHANGED的broadcast,我们的receiver将被AMS管理,进而我们就可以更
快的接收到broadcast了(参考上文对AMS中broadcastIntentLocked()的分析). 但是这个方案也不是完美的,因为它声明了persistent=“true”,会占用RAM以及增加开机时间.
自定义Application的代码:
public class MyApp extends Application {
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
public void onCreate() {
super.onCreate();
IntentFilter intentFilter = new IntentFilter(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
intentFilter.addAction(Intent.ACTION_BOOT_COMPLETED);
registerReceiver(mReceiver, intentFilter);
在AndroidManifest中的声明:
&application
android:name=&MyApp&
android:label=&@string/app_name&
android:persistent=&true&&
&/application&
不止ACTION_SIM_STATE_CHANGED,其它的broadcast receiver也可以采用方案二的做法来更快速的接收broadcast,就看自己有没有这个需要了.
写的比较仓促,有纰漏之处,敬请批评指正!
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致}

我要回帖

更多关于 js如何请求action 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信