这个小地鼠扫地机器人机怎么玩? 完全解答

关于鼹鼠_百度知道
动画片里的小鼹鼠挖的土丘,在现实生活中什么样啊.....给个图片,重谢
考虑到这个问题有难度,本人长时间会在意这个问题,不管过了多久,一定回复...
我有更好的答案
  [编辑本段]基本介绍  鼹鼠(yǎn shǔ)脊椎动物,哺乳纲,食虫目,鼹鼠科。头尖,吻长,四肢短小,身体矮胖,长10余厘米,外形似鼠。耳廓退化,眼也小,多为细密的皮毛掩盖。尾细而短。前肢5爪,强大,掌心外翻,适于地下掘土生活。主要以昆虫为食,也食蚯蚓、蛞蝓、两栖类、爬行类、小鸟等动物。由于在地下挖掘洞道,对农作物伤害极大,故为害兽。但这只是从人类的角度来看,从生物琏的角度来看,鼹鼠起到了重要的作用.毛棕褐色,细密柔软,并具有光泽,有一定的利用价值。如我国东北、华北所产的麝鼹(Scaptochirusmoschatus),俗称“地爬子”和南方所产的缺齿鼹(Mogeralatouchei),缺2个下犬齿,地下洞道呈网状,俗称“不见天”或“反巴掌”,都是典型代表动物。  [编辑本段]形态特征  哺乳纲食虫目鼹科动物。身体矮胖,外形像鼠,长10多厘米,四肢短,头尖,吻长,耳小或完全退化,腿也小,尾巴短。前肢有五爪,都特别强健,掌心向外侧翻转,是掘土的器官。捕食昆虫、蚯蚓等动物。由于它喜好挖洞,伤害农作物,对农业有害。鼹鼠的种类很多,如产于欧洲和亚洲的欧鼹;产于中国的内蒙古、东北等地的麝鼹,又叫“地爬子”。  [编辑本段]生活习性  鼹鼠的拉丁文学名就是“掘土”的意思。它的身体完全适应地下的生活方式,前脚大而向外翻,并配备有力的爪子,像两只铲子;他的头紧接肩膀,看起来像没有脖子,整个骨架矮而扁,跟掘土机很相似。它的尾小而有力,耳朵没有外廓,身上生有密短柔滑的黑褐色绒毛,毛尖不固定朝某个方向。这些特点都非常适合它在狭长的隧道自由地奔来奔去。隧道四通八达,里面潮湿,很容易孳生蚯蚓、蜗牛等虫类,便于它经常在地下“餐厅”进餐。鼹鼠成年后,眼睛深陷在皮肤下面,视力完全退化,再加上经常不见天日,很不习惯阳光照射,一旦长时间接触阳光,中枢神经就会混乱,各器官失调,以致于死亡。遇到危险时以尖叫震慑敌人,然后伺机逃脱。其声似蝉鸣有死鸟鸣。  [编辑本段]相关种类  星鼻鼹鼠  它的鼻子周围有22条肉质的附器环绕成一圈,当它在自家环境间穿梭时,这鼻子常因快速颤动而让人看不清楚。再加上生着巨爪的前肢。你遇到的就是一个令人兴奋难抑的生物学之谜。这种生物是怎么演化出来的?那个星星是什么?它如何作用,又是用来做什么的?对于这不寻常的哺乳动物,这些都是我想要解开的谜题。 这就是——星鼻鼹星鼻鼹不仅有一张好玩的脸,它还有着相当特化的脑,也许有助于解答哺乳动物神经系统的构成与演化这些长久以来的问题。先知道以下事实,读者可能会安心些:星鼻鼹是小型动物,只能让磅秤的指针倾斜为50公克,大约是小鼠的两倍。它们生活在湿地的浅层地道中,遍及美国东北与加拿大东部,猎食的环境涵盖地下及水下。如同鼹鼠科其它30种左右的成员,星鼻鼹属于哺乳动物的食虫目,这类生物新陈代谢极快,随时饥肠辘辘,所以这胃口奇大的小小星鼻鼹必须要能找到足够的猎物,以度过寒冷的北国冬天。和其它鼹鼠一样,它在土壤中寻觅蚯蚓;不过它还会在湿地栖境里营养丰富的泥巴与烂叶中,取食多种小型无脊椎动物和昆虫幼虫,也会潜游到池塘与溪流的浑浊水底,把猎物给揪出来。寻找猎物正是“星鼻”上场的时候。星鼻并不是负责嗅闻的嗅觉系统的一部分,也不是用来捕捉食物的第三只手,而是一个无比敏感的触觉器官。  星鼻鼹鼠2  星鼻鼹鼠2  裸鼹鼠  裸鼹鼠产于非洲肯尼亚、埃塞俄比亚等地,体小,重不过五六十克。它们在地下掘成复杂的隧道,中央宽阔处是它们的居室。每群裸鼹鼠有一只相当肥硕的王后和几只雄鼠,其余无论雌雄均为工鼠。  [编辑本段]药用价值  【药 名】:鼹鼠  【来 源】:为鼹鼠科动物麝鼹或缺齿鼹的全体或肉。  【功 效】:解毒蚀疮,散结解毒,泻肺平喘,驱蛔杀虫。  【主 治】:治恶疮疔肿,胃癌,肺热咳喘,小儿蛔虫病。  【性味归经】:咸,寒,无毒。①《别录》:“味咸,无毒。”②《食性本草》:“寒。”入心、肺经。  【用法用量】:内服:烧存性研未,3~5分;或煮食。外用:烧存性研末调涂。  【别 名】:隐鼠(陶弘景)  【动植物资源分布】:①麝鼹分布河北、山东、山西、陕西、甘肃、内蒙古等地。②缺齿鼹分布东北地区。  【药材的采收与储藏】:春、夏、秋季挖掘洞道捕捉,或用竹弓、鼠夹等工具捕捉。  【拉丁名】:原动物麝鼹Scaptochirus moschatus Milne-Edwards或缺齿鼹Mogera robusta Nehring  【考 证】:出自《名医别录》①《别录》:“鼹鼠在土中行,五月取,令干,燔之。”②陶弘景:“鼹鼠,形如鼠,大而无尾,黑色,长鼻甚强,恒穿耕地中行,讨掘即得。”  [编辑本段]其他解释  “鼹鼠”一词在捷克文里拼作&krtek&,在英文中是&mole&。由于鼹鼠善于打洞,现在这个词在媒体报道中已经成了“间谍”的代名词,所以如果你听到说某某国家情报局安全部抓到一只&鼹鼠&可不要真以为他们是抓到了一只打洞的小老鼠。  CULT电影代表作 超现实主义cult片大师杨德洛维斯基作品  ◎ 片 名:鼹鼠 El Topo (1970) IMDb:0067866  ◎ 类 别:西部  ◎ 导 演:亚历桑德罗·佐杜洛夫斯基 Alejandro Jodorowsky  ◎ 编 剧:亚历桑德罗·佐杜洛夫斯基 Alejandro Jodorowsky  ◎ 主 演:亚历桑德罗·佐杜洛夫斯基 Alejandro Jodorowsky .....El Topo  Brontis Jodorowsky .....Son of El Topo, as a boy  José Legarreta .....Dying Man  Mara Lorenzio .....Mara  David Silva .....The Colonel  ◎ 其他中文片名:遁地鼠  ◎ 其他外语片名:The Gopher/The Mole  ◎ IMDB评分:[color=red]7.4/10 (2,877 votes)[/color]  ◎ 时 长:120 min  ◎ 地 区:墨西哥  ◎ 语 言:西班牙语  ◎ 分 级:法国:-16 芬兰:K-18 澳大利亚:MA 荷兰:18 英国:18/英国:X(original rating)(cut) 香港:III  ◎ 简 介:  著名超现实主义cult片大师级导演杨德洛维斯基(Alejandro Jodorowsky)作品  这是一部非常暴力的cult影片,融合了大量宗教寓意。故事讲一个名为“鼹鼠”的枪手,妻子被杀,迫使他走上复仇之路。这过程中,他救了另外一名遭到土匪恐吓的女子,而她又带着他搜寻当地四大枪手。临走前,“鼹鼠”把儿子留在寺院里。一次激斗中,他受了伤,女子把她抛弃。一群洞穴人找到了昏迷不醒的“鼹鼠”,并把他带回家。很多年后“鼹鼠”醒来,在恢复正常后,帮助洞穴人挖掘一条逃亡的地道。后来他们来到一个邪教当道的小镇,而镇民们慑于警察局长的淫威。一场血战随之发生...  ◎ 关于影片:  本片风格怪异,堪称布努艾尔、毕金帕、塞尔吉奥·里昂尼和戈达尔的混合体,包括许多圣经的隐喻,但对于这种手法的效果各家有很大的争议,有人认为令人难忘,也有一派表示影片缺乏真正超现实手法的魅力,而且内容和风格不太统一。[/color]  [quote][align=center][color=blue]影片评论[/color][/align]  [color=darkred] 如果要谈到Cult片界的至尊级,大概只有1970年的墨西哥电影El Topo (港译:遁地鼠,或鼹鼠、鼬鼠)可以荣膺这个名誉。06年电影节中播映的特辑Midnight Movies: From the Margin to the Mainstream,纪录了七十年代的美国影迷对这部电影的疯狂崇拜。当年,El Topo作为一套外语片,加上内容怪诞而且相当血腥,于正场上映票房惨淡,纽约发行商便想到把它放在正场之后的午夜场放映,地方是日后的Cult片圣地「Elgin Cinema」。结果倒吸引了一批赶时髦的年轻人捧场。经影迷们口耳相传, El Topo渐渐在小圈子里引起话题。在午夜前来看这套墨西哥怪片的人络绎不绝,不少人更把它翻看三四五六遍,使影片映期长达数载。El Topo遂成了第一出具有正统意义的Cult Movie。  一位全身黑衣、全帽、长发长须的枪客,带着他赤裸的小儿子来到沙漠。黑衣枪客令儿子把母亲的照片埋在沙堆里。此举象征着儿子已经长大成人,往后的日子便要跟着父亲闯荡江湖。这位黑衣枪客就是——「遁地鼠」(El Topo / The Mole)。独白……  THE MOLE IS AN ANIMAL THAT DIGS TUNNELS  UNDERGROUND SEARCHING FOR THE SUN.  SOMETIMES HIS JOURNEY LEADS HIM TO THE SURFACE.  WHEN HE LOOKS AT THE SUN, HE IS BLINDED.  El T影片本身已经有着Cult片最明显的原素(又或者说Cult片的原素由它来定义),正是它的主角遁地鼠。由导演Alejandro Jodorowsky(尤杜洛斯基)本人亲自饰演的这位主角有着一个杀死人的造型:全身穿黑衫、黑喇叭裤、黑牛仔帽、黑披风、黑手套、长发长须还要吹着牧童笛。无数Cult电影的核心人物,亦有这种令人过目难忘造型。例如Ed Wood电影里的Tor Johnson,Russ Meyer的大胸脯肉弹,洛奇恐怖晚会的大宅主人,甚至是Troma的Toxie仔。El Topo的造型其实来自当年一众意大利粉牛仔片 (spaghetti western)的独行侠造型,不过加入了一点现代原素(如那条喇叭裤)以及墨西哥的民族色彩。这个遁地鼠牛仔,与历史真实的牛仔,或是经典西部片中的牛仔(例如尊荣)完全不象样,而是更夸张、更冷酷更有型、更具有异国风情。我们所看到日本武士片的独行剑客,或港产武侠片的侠客,都是这种「侠」形像进化的结果。你即管可以将El Topo与西部片的主角造型作个对比。  Cult片当然不需要依照现实,然而,技巧亦不需要高。说实话,笔者初次看El Topo,第一印象是此片的导演是不懂拍电影的。不是说他写的剧本差,而是连最基本的合理剪接也欠奉。接合不上的镜头比比皆是,对节奏的掌握度几乎等于零。笔者立刻想到几套近似的电影,那就是铃木清顺拍于八十年代后期的作品,如阳炎座、新杀手烙印等。两者的拍摄风格同样迷离得令人难以捉摸。看不惯的大概会绝早离场,大骂此片为烂片一出。  但El Topo之所以成为Cult,其实正正是它的奇幻、迷离。导演Alejandro Jodorowsky与铃木清顺有着相似的创作逻辑:将自己全然沉醉于超现实(Surrealism)的世界之中。虚幻、荒谬、自说自话、自圆其说,一切无需解释,用本身独有的逻辑来拍摄、设计情节及推演故事。跳接、不连戏、情节突变等,都成为超现实电影的特征。超现实风格主要源自绘画艺术,其代表作是达利(Salvador Dali)的「钟」。还有达利与布纽尔的实验短片安达鲁之犬 (Un chien andalou, 1929)。为何达利的钟弯曲得像布?为何女人要被剖眼球?达利不会解释。正如,为何El Topo里的遁地鼠身中十多枪仍可以杀敌?为何遁地鼠死后墓地成蜜蜂巢? Jodorowsky不会解释。  El T与铃木清顺的作品,除了其超现实主义同出一辙外,他们亦喜欢将「类型片」推向极致。El Topo的类型是西部牛仔,铃木的日活年代是黑帮杀手。类型有很多通例,或曰陈腔滥调,例如逃出帮会的会被人追杀,牛仔事必要行侠仗义等等……铃木与El Topo同样把这些可笑的陈腔滥调当作金科玉律,或以它作为天马行空的基础。如是这, El Topo片中所有的荒诞设定,导演都懒作解释。例如观众可能会问:片中为何要死那么多人?遁地鼠的儿子为何不穿衣服?军阀为何要性虐待修士?哪里走出那一个女同性恋者?又为何她要勾引遁地鼠的女人?遁地鼠为何有金枪不倒之身?  但当中有些情节却荒谬得似是有根有据,甚至可以引经据典的。例如遁地鼠要挑战沙漠四大高手,被戏迷解作是耶稣挑战旧约四大先知的考验。亦例如结局中,遁地鼠杀尽刽子手后自焚而死,被解释为耶稣为世人钉十字架,自焚更被视为影射当年越南僧侣为反对越战在美国大使馆前自焚而死的画面。又例如遁地鼠死后,墓地变成蜜蜂巢,其实是比喻遁地鼠死后化为圣人。  El Topo的异国情调、超现实、荒谬感与象征意义令当年午夜场影迷如痴如醉。John Lennon都说El Topo是自己最爱的电影。此点毫不惊奇,因为John Lennon当年有份主演的电影How I Won the War (Richard Lester, 1967),都非常具有超现实的荒谬感(不过那出是喜剧而已)。John Lennon的Apple公司更买下了El Topo的世界发行权。其原声大碟,亦由Apple发行。可能John Lennon对Alejandro Jodorowsky亲自处理,充满墨西哥妖异风格的配乐,亦感到莫大的兴趣吧。  俄裔智利藉的Alejandro Jodorowsky(尤杜洛斯基),其名作还有圣山(The Holy Mountain, 1973)与圣血 (Santa sangre, 1989)。Jodorowsky本身还是一名小丑、傀儡戏与哑剧的表演者,也是法国漫画界的编剧,又写过小说,如《La Sagesse des Contes》(中译本:傻瓜的幸福与智慧)。Jodorowsky的最新Project,是由其好友Marilyn Manson主演的El Topo下集Abelcain。导演继续是遁地鼠,Marilyn Manson则演他的儿子Abelcain,闻说故事设定在核战之后……[/color][/quote]是否可以解决您的问题?
谢谢啊,不好意思没看到最后一句,我想要一张图片,现实中它挖的那个土丘..
采纳率:65%
为您推荐:
其他类似问题
鼹鼠的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。《饥荒》蜘蛛人的玩法技巧完全解析
  《饥荒》本作操作简单,并且拥有黑暗和超自然的卡通美术风格。游戏中不会有任何明显的操作提示,玩家可以在该作中体验到自己探索的乐趣。小编为大家带来“距离一八六七”分享的《饥荒》蜘蛛人玩法技巧全解析,一起来看吧。
  首先韦伯是最容易玩的人物之一,甚至是第一。没人用的原因在于san值太低,但DLC的san值回复食物比浆果丛还密集,san值低直接被无视。
  开局自带3个怪物肉和一个蜘蛛巢。前几天吃浆果和萝卜度日,生了火堆就烤熟身上的怪物肉,生怪物肉保质期6天,熟怪物肉保质期20天,所以打到怪物肉就烤熟。吃生熟怪物肉都不减san+18.8饱食。韦伯最常吃的就是熟怪物肉了。
  必要找到的地形:
  1.荒漠:荒漠里有丰富的仙人掌,无防具采集仙人掌减6血,带着猪帽或者木甲减2血,两样都穿着减1血,烤熟吃+1血+12.5饱 食+15san,仙人掌3天成熟,冬季也生长,只沿着路走就可找到很多。新手一般san值维持不住,荒漠完全解决了这个问题,剩余太多还能当煮锅填充。很 长时间去一次就行,冰箱里必备一些。全人物补san神器。蘑菇不用mod地图上看不到冬季也不生长采集还有时间限制,如果你就爱吃蘑菇,那可以在绿蘑菇旁 边种松树(橡树林、沼泽适用),红蓝蘑菇可以种树枝簇干草簇橡树(沼泽适用)地图就有标记了,想完全找出来就月圆那天快天明时看地图,然后截下图,以后再 去标记。
  2.沼泽:沼泽里的芦苇是韦伯最需要的物资之一,韦伯发展的快慢和你有多少芦苇成正比。白天采集芦苇,傍晚鱼人开始出没,咱去每家串个门把鱼人 都引出来,第二天白天就可去收获丰富物资了。捡的时候注意看有没有触手,有触手就捡1-2个跑开一下再去捡。韦伯不缺吃的,只是捡几个狼牙棒防身。
  3.橡林:DLC中看到橡林就是找到猪窝了,不过我们不用探猪村,只需在猪村绿地边界上找小飞虫雕像,找到后用矿工锄敲掉拿到铃铛书即可。月圆第一天杀掉后第二天还会飞来一个。以后让铃铛踩树,再也不怕没猪人帮砍树了。小飞虫的便便是很好的灭火器材料。
  4.矿区:韦伯对石头消耗很少,因为基本没必要造农场。找矿区就是为了看有没有蜘蛛群,有的话在旁边生个石头火堆,到了傍晚就开始刷物资。
  在哪安家就随意了,看个人喜好,下面说说韦伯的基地建设。
  韦伯前中期可不移植草、浆果,因为韦伯有小弟,不自己打架,也不需要晾肉架(韦伯跟猪人兔人敌对刷大肉比较麻烦干脆不刷),农场基本没必要,所 以用草少,怪物肉就能吃饱要什么浆果。韦伯建造蜂箱也不是很必要,因为蜂蜜一般用来做蜜汁肉什么的加血,而韦伯最佳加血食谱:东北水饺=(熟怪物肉换鸟 蛋,2鸟蛋1生熟怪物肉1蔬菜)+40血+37.5饱食+5san20天保质期。所以韦伯最好尽早造出鸟笼,那样只需要蔬菜(蘑菇也是蔬菜)一样东西就可 以加血了,是不是很方便很省脑细胞。饿了就啃怪物肉,战斗就拿点速冻水饺出来。不着急补血直接吃腺体也行反正有的是。
  韦伯不战斗时带最好着高礼帽拿着小花伞。
  韦伯如何刷蜘蛛资源:
  找到一个蜘蛛巢密集的区域,也可以在家附近的蜘蛛巢旁边种植背包的里蜘蛛巢。
  武器栏不要装备武器。傍晚蜘蛛出动后喂一块肉,然后离要打的目标蜘蛛远一点,按着CTRL点目标蜘蛛就会强制攻击,人物开始向那个目标蜘蛛冲过 去,你上下左右随意控制下就会终止攻击,而你的小弟不会终止,最好让它们的战场离蜘蛛巢越近越好,接下来就是蜘蛛混战,你就在一边按着空格捡东西就行,这 时不要用左键点,打到蜘蛛就不好了。等打完仗把捡的蜘蛛肉尽早烤掉加长保质期。
  感觉场面太小,那就拿起手中的蜘蛛丝,对着蜘蛛巢点左键,5个蜘蛛丝就能让蜘蛛巢升一级。
  蜘蛛会打狗箱,白天想刷蜘蛛可以让狗箱引出来,然后喂肉后让小弟打蜘蛛巢,不过还是傍晚让它们混战比较好。
  蜘蛛人可以刷狗窝得狗牙,白天跑到兔子村种几个2级蜘蛛巢,刷兔子村得遍地胡萝卜,所以前期不用农场。
  中期想移植资源,拿洞穴里的灯泡花喂疯猪最合适了一次就是百十个便便。洞穴里全是韦伯的亲戚,比上面还安全。
  13:11:59
  13:52:22
  06:11:42
  14:59:38
  14:55:38
  14:31:40
  15:29:12
Copyright &
SINA Corporation, All Rights ReservedAndroid Service完全解析,关于服务你所需知道的一切(上)
转载请注明出处:相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了。Service作为Android四大组件之一,在每一个应用程序中都扮演着非常重要的角色。它主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务。必要的时候我们甚至可以在程序退出的情况下,让Service在后台继续保持运行状态。不过,虽然Service几乎被每一个Android程序员所熟知,但并不是每个人都已经将Service的各个知识点都掌握得非常透彻。那么今天我就将带着大家对Service进行一次全面、深入的探究,希望每个人在读完本篇文章后都能对Service有更深一层的理解。Service的基本用法关于Service最基本的用法自然就是如何启动一个Service了,启动Service的方法和启动Activity很类似,都需要借助Intent来实现,下面我们就通过一个具体的例子来看一下。新建一个Android项目,项目名就叫ServiceTest,这里我选择使用4.0的API。然后新建一个MyService继承自Service,并重写父类的onCreate()、onStartCommand()和onDestroy()方法,如下所示:public class MyService extends Service {
public static final String TAG = "MyService";
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate() executed");
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand() executed");
return super.onStartCommand(intent, flags, startId);
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy() executed");
public IBinder onBind(Intent intent) {
}可以看到,我们只是在onCreate()、onStartCommand()和onDestroy()方法中分别打印了一句话,并没有进行其它任何的操作。然后打开或新建activity_main.xml作为程序的主布局文件,代码如下所示:&LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" &
android:id="@+id/start_service"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start Service" /&
android:id="@+id/stop_service"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Stop Service" /&
&/LinearLayout&我们在布局文件中加入了两个按钮,一个用于启动Service,一个用于停止Service。然后打开或新建MainActivity作为程序的主Activity,在里面加入启动Service和停止Service的逻辑,代码如下所示:public class MainActivity extends Activity implements OnClickListener {
private Button startS
private Button stopS
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService = (Button) findViewById(R.id.start_service);
stopService = (Button) findViewById(R.id.stop_service);
startService.setOnClickListener(this);
stopService.setOnClickListener(this);
public void onClick(View v) {
switch (v.getId()) {
case R.id.start_service:
Intent startIntent = new Intent(this, MyService.class);
startService(startIntent);
case R.id.stop_service:
Intent stopIntent = new Intent(this, MyService.class);
stopService(stopIntent);
}可以看到,在Start Service按钮的点击事件里,我们构建出了一个Intent对象,并调用startService()方法来启动MyService。然后在Stop Serivce按钮的点击事件里,我们同样构建出了一个Intent对象,并调用stopService()方法来停止MyService。代码的逻辑非常简单,相信不需要我再多做解释了吧。另外需要注意,项目中的每一个Service都必须在AndroidManifest.xml中注册才行,所以还需要编辑AndroidManifest.xml文件,代码如下所示:&?xml version="1.0" encoding="utf-8"?&
&manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.servicetest"
android:versionCode="1"
android:versionName="1.0" &
android:minSdkVersion="14"
android:targetSdkVersion="17" /&
&application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" &
&service android:name="com.example.servicetest.MyService" &
&/service&
&/application&
&/manifest&这样的话,一个简单的带有Service功能的程序就写好了,现在我们将程序运行起来,并点击一下Start Service按钮,可以看到LogCat的打印日志如下:也就是说,当启动一个Service的时候,会调用该Service中的onCreate()和onStartCommand()方法。那么如果我再点击一次Start Service按钮呢?这个时候的打印日志如下:可以看到,这次只有onStartCommand()方法执行了,onCreate()方法并没有执行,为什么会这样呢?这是由于onCreate()方法只会在Service第一次被创建的时候调用,如果当前Service已经被创建过了,不管怎样调用startService()方法,onCreate()方法都不会再执行。因此你可以再多点击几次Start Service按钮试一次,每次都只会有onStartCommand()方法中的打印日志。我们还可以到手机的应用程序管理界面来检查一下MyService是不是正在运行,如下图所示:恩,MyService确实是正在运行的,即使它的内部并没有执行任何的逻辑。回到ServiceTest程序,然后点击一下Stop Service按钮就可以将MyService停止掉了。Service和Activity通信上面我们学习了Service的基本用法,启动Service之后,就可以在onCreate()或onStartCommand()方法里去执行一些具体的逻辑了。不过这样的话Service和Activity的关系并不大,只是Activity通知了Service一下:“你可以启动了。”然后Service就去忙自己的事情了。那么有没有什么办法能让它们俩的关联更多一些呢?比如说在Activity中可以指定让Service去执行什么任务。当然可以,只需要让Activity和Service建立关联就好了。观察MyService中的代码,你会发现一直有一个onBind()方法我们都没有使用到,这个方法其实就是用于和Activity建立关联的,修改MyService中的代码,如下所示:public class MyService extends Service {
public static final String TAG = "MyService";
private MyBinder mBinder = new MyBinder();
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate() executed");
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand() executed");
return super.onStartCommand(intent, flags, startId);
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy() executed");
public IBinder onBind(Intent intent) {
class MyBinder extends Binder {
public void startDownload() {
Log.d("TAG", "startDownload() executed");
// 执行具体的下载任务
}这里我们新增了一个MyBinder类继承自Binder类,然后在MyBinder中添加了一个startDownload()方法用于在后台执行下载任务,当然这里并不是真正地去下载某个东西,只是做个测试,所以startDownload()方法只是打印了一行日志。然后修改activity_main.xml中的代码,在布局文件中添加用于绑定Service和取消绑定Service的按钮:&LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" &
android:id="@+id/start_service"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start Service" /&
android:id="@+id/stop_service"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Stop Service" /&
android:id="@+id/bind_service"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Bind Service" /&
android:id="@+id/unbind_service"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Unbind Service"
&/LinearLayout&接下来再修改MainActivity中的代码,让MainActivity和MyService之间建立关联,代码如下所示:public class MainActivity extends Activity implements OnClickListener {
private Button startS
private Button stopS
private Button bindS
private Button unbindS
private MyService.MyBinder myB
private ServiceConnection connection = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MyService.MyBinder)
myBinder.startDownload();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService = (Button) findViewById(R.id.start_service);
stopService = (Button) findViewById(R.id.stop_service);
bindService = (Button) findViewById(R.id.bind_service);
unbindService = (Button) findViewById(R.id.unbind_service);
startService.setOnClickListener(this);
stopService.setOnClickListener(this);
bindService.setOnClickListener(this);
unbindService.setOnClickListener(this);
public void onClick(View v) {
switch (v.getId()) {
case R.id.start_service:
Intent startIntent = new Intent(this, MyService.class);
startService(startIntent);
case R.id.stop_service:
Intent stopIntent = new Intent(this, MyService.class);
stopService(stopIntent);
case R.id.bind_service:
Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE);
case R.id.unbind_service:
unbindService(connection);
}可以看到,这里我们首先创建了一个ServiceConnection的匿名类,在里面重写了onServiceConnected()方法和onServiceDisconnected()方法,这两个方法分别会在Activity与Service建立关联和解除关联的时候调用。在onServiceConnected()方法中,我们又通过向下转型得到了MyBinder的实例,有了这个实例,Activity和Service之间的关系就变得非常紧密了。现在我们可以在Activity中根据具体的场景来调用MyBinder中的任何public方法,即实现了Activity指挥Service干什么Service就去干什么的功能。当然,现在Activity和Service其实还没关联起来了呢,这个功能是在Bind Service按钮的点击事件里完成的。可以看到,这里我们仍然是构建出了一个Intent对象,然后调用bindService()方法将Activity和Service进行绑定。bindService()方法接收三个参数,第一个参数就是刚刚构建出的Intent对象,第二个参数是前面创建出的ServiceConnection的实例,第三个参数是一个标志位,这里传入BIND_AUTO_CREATE表示在Activity和Service建立关联后自动创建Service,这会使得MyService中的onCreate()方法得到执行,但onStartCommand()方法不会执行。然后如何我们想解除Activity和Service之间的关联怎么办呢?调用一下unbindService()方法就可以了,这也是Unbind Service按钮的点击事件里实现的逻辑。现在让我们重新运行一下程序吧,在MainActivity中点击一下Bind Service按钮,LogCat里的打印日志如下图所示:另外需要注意,任何一个Service在整个应用程序范围内都是通用的,即MyService不仅可以和MainActivity建立关联,还可以和任何一个Activity建立关联,而且在建立关联时它们都可以获取到相同的MyBinder实例。如何销毁Service在Service的基本用法这一部分,我们介绍了销毁Service最简单的一种情况,点击Start Service按钮启动Service,再点击Stop Service按钮停止Service,这样MyService就被销毁了,可以看到打印日志如下所示:那么如果我们是点击的Bind Service按钮呢?由于在绑定Service的时候指定的标志位是BIND_AUTO_CREATE,说明点击Bind Service按钮的时候Service也会被创建,这时应该怎么销毁Service呢?其实也很简单,点击一下Unbind Service按钮,将Activity和Service的关联解除就可以了。先点击一下Bind Service按钮,再点击一下Unbind Service按钮,打印日志如下所示:以上这两种销毁的方式都很好理解。那么如果我们既点击了Start Service按钮,又点击了Bind Service按钮会怎么样呢?这个时候你会发现,不管你是单独点击Stop Service按钮还是Unbind Service按钮,Service都不会被销毁,必要将两个按钮都点击一下,Service才会被销毁。也就是说,点击Stop Service按钮只会让Service停止,点击Unbind Service按钮只会让Service和Activity解除关联,一个Service必须要在既没有和任何Activity关联又处理停止状态的时候才会被销毁。为了证实一下,我们在Stop Service和Unbind Service按钮的点击事件里面加入一行打印日志:public void onClick(View v) {
switch (v.getId()) {
case R.id.start_service:
Intent startIntent = new Intent(this, MyService.class);
startService(startIntent);
case R.id.stop_service:
Log.d("MyService", "click Stop Service button");
Intent stopIntent = new Intent(this, MyService.class);
stopService(stopIntent);
case R.id.bind_service:
Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE);
case R.id.unbind_service:
Log.d("MyService", "click Unbind Service button");
unbindService(connection);
}然后重新运行程序,先点击一下Start Service按钮,再点击一下Bind Service按钮,这样就将Service启动起来,并和Activity建立了关联。然后点击Stop Service按钮后Service并不会销毁,再点击一下Unbind Service按钮,Service就会销毁了,打印日志如下所示:我们应该始终记得在Service的onDestroy()方法里去清理掉那些不再使用的资源,防止在Service被销毁后还会有一些不再使用的对象仍占用着内存。Service和Thread的关系不少Android初学者都可能会有这样的疑惑,Service和Thread到底有什么关系呢?什么时候应该用Service,什么时候又应该用Thread?答案可能会有点让你吃惊,因为Service和Thread之间没有任何关系!之所以有不少人会把它们联系起来,主要就是因为Service的后台概念。Thread我们大家都知道,是用于开启一个子线程,在这里去执行一些耗时操作就不会阻塞主线程的运行。而Service我们最初理解的时候,总会觉得它是用来处理一些后台任务的,一些比较耗时的操作也可以放在这里运行,这就会让人产生混淆了。但是,如果我告诉你Service其实是运行在主线程里的,你还会觉得它和Thread有什么关系吗?让我们看一下这个残酷的事实吧。在MainActivity的onCreate()方法里加入一行打印当前线程id的语句:Log.d("MyService", "MainActivity thread id is " + Thread.currentThread().getId());然后在MyService的onCreate()方法里也加入一行打印当前线程id的语句:Log.d("MyService", "MyService thread id is " + Thread.currentThread().getId());现在重新运行一下程序,并点击Start Service按钮,会看到如下打印日志:可以看到,它们的线程id完全是一样的,由此证实了Service确实是运行在主线程里的,也就是说如果你在Service里编写了非常耗时的代码,程序必定会出现ANR的。你可能会惊呼,这不是坑爹么!?那我要Service又有何用呢?其实大家不要把后台和子线程联系在一起就行了,这是两个完全不同的概念。Android的后台就是指,它的运行是完全不依赖UI的。即使Activity被销毁,或者程序被关闭,只要进程还在,Service就可以继续运行。比如说一些应用程序,始终需要与服务器之间始终保持着心跳连接,就可以使用Service来实现。你可能又会问,前面不是刚刚验证过Service是运行在主线程里的么?在这里一直执行着心跳连接,难道就不会阻塞主线程的运行吗?当然会,但是我们可以在Service中再创建一个子线程,然后在这里去处理耗时逻辑就没问题了。额,既然在Service里也要创建一个子线程,那为什么不直接在Activity里创建呢?这是因为Activity很难对Thread进行控制,当Activity被销毁之后,就没有任何其它的办法可以再重新获取到之前创建的子线程的实例。而且在一个Activity中创建的子线程,另一个Activity无法对其进行操作。但是Service就不同了,所有的Activity都可以与Service进行关联,然后可以很方便地操作其中的方法,即使Activity被销毁了,之后只要重新与Service建立关联,就又能够获取到原有的Service中Binder的实例。因此,使用Service来处理后台任务,Activity就可以放心地finish,完全不需要担心无法对后台任务进行控制的情况。一个比较标准的Service就可以写成:@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
public void run() {
// 开始执行后台任务
}).start();
return super.onStartCommand(intent, flags, startId);
class MyBinder extends Binder {
public void startDownload() {
new Thread(new Runnable() {
public void run() {
// 执行具体的下载任务
}).start();
}创建前台ServiceService几乎都是在后台运行的,一直以来它都是默默地做着辛苦的工作。但是Service的系统优先级还是比较低的,当系统出现内存不足情况时,就有可能会回收掉正在后台运行的Service。如果你希望Service可以一直保持运行状态,而不会由于系统内存不足的原因导致被回收,就可以考虑使用前台Service。前台Service和普通Service最大的区别就在于,它会一直有一个正在运行的图标在系统的状态栏显示,下拉状态栏后可以看到更加详细的信息,非常类似于通知的效果。当然有时候你也可能不仅仅是为了防止Service被回收才使用前台Service,有些项目由于特殊的需求会要求必须使用前台Service,比如说墨迹天气,它的Service在后台更新天气数据的同时,还会在系统状态栏一直显示当前天气的信息,如下图所示:那么我们就来看一下如何才能创建一个前台Service吧,其实并不复杂,修改MyService中的代码,如下所示:public class MyService extends Service {
public static final String TAG = "MyService";
private MyBinder mBinder = new MyBinder();
public void onCreate() {
super.onCreate();
Notification notification = new Notification(R.drawable.ic_launcher,
"有通知到来", System.currentTimeMillis());
Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
notificationIntent, 0);
notification.setLatestEventInfo(this, "这是通知的标题", "这是通知的内容",
pendingIntent);
startForeground(1, notification);
Log.d(TAG, "onCreate() executed");
}这里只是修改了MyService中onCreate()方法的代码。可以看到,我们首先创建了一个Notification对象,然后调用了它的setLatestEventInfo()方法来为通知初始化布局和数据,并在这里设置了点击通知后就打开MainActivity。然后调用startForeground()方法就可以让MyService变成一个前台Service,并会将通知的图片显示出来。现在重新运行一下程序,并点击Start Service或Bind Service按钮,MyService就会以前台Service的模式启动了,并且在系统状态栏会弹出一个通栏图标,下拉状态栏后可以看到通知的详细内容,如下图所示。好了,由于篇幅的原因,本篇文章就先写到这里。目前我们已经把关于Service的很多重要知识点都梳理完了,下一篇文章会承接这篇文章,介绍Android Service中剩下的一个非常重要且复杂的知识点 —— 远程Service的使用,感兴趣的朋友请继续阅读
。关注我的技术公众号,每天都有优质技术文章推送。关注我的娱乐公众号,工作、学习累了的时候放松一下自己。
微信扫一扫下方二维码即可关注:
没有更多推荐了,
不良信息举报
举报内容:
Android Service完全解析,关于服务你所需知道的一切(上)
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 嵌入式裸机开发打地鼠 的文章

 

随机推荐