1.Android½ø³Ì»ù±¾ÖªÊ¶£º
ÎÒÃÇÏÈÀ´Á˽âÏÂAndroidÖеĽø³Ì»ù±¾ÖªÊ¶¡£
µ±Ò»¸ö³ÌÐòµÚÒ»´ÎÆô¶¯µÄʱºò£¬Android»áÆô¶¯Ò»¸öLINUX½ø³ÌºÍÒ»¸öÖ÷Ï̡߳£Ä¬ÈϵÄÇé¿öÏ£¬ËùÓиóÌÐòµÄ×é¼þ¶¼½«Ôڸýø³ÌºÍÏß³ÌÖÐÔËÐС£
ͬʱ£¬Android»áΪÿ¸öÓ¦ÓóÌÐò·ÖÅäÒ»¸öµ¥¶ÀµÄLINUXÓû§¡£Android»á¾¡Á¿±£ÁôÒ»¸öÕýÔÚÔËÐнø³Ì£¬Ö»ÔÚÄÚ´æ×ÊÔ´³öÏÖ²»×ã
ʱ£¬Android»á³¢ÊÔֹͣһЩ½ø³Ì´Ó¶øÊÍ·Å×ã¹»µÄ×ÊÔ´¸øÆäËûеĽø³ÌʹÓ㬠ҲÄܱ£Ö¤Óû§ÕýÔÚ·ÃÎʵĵ±Ç°½ø³ÌÓÐ×ã¹»µÄ×ÊÔ´È¥¼°Ê±µØÏìÓ¦Óû§µÄʼþ¡£
Android»á¸ù¾Ý½ø³ÌÖÐÔËÐеÄ×é¼þÀà±ðÒÔ¼°×é¼þµÄ״̬À´Åжϸýø³ÌµÄÖØÒªÐÔ£¬Android»áÊ×ÏÈÍ£Ö¹ÄÇЩ²»ÖØÒªµÄ½ø³Ì¡£°´ÕÕÖØÒªÐԴӸߵ½µÍÒ»¹²ÓÐÎå¸ö¼¶±ð£º
ǰ̨½ø³Ì
ǰ̨½ø³ÌÊÇÓû§µ±Ç°ÕýÔÚʹÓõĽø³Ì¡£Ö»ÓÐһЩǰ̨½ø³Ì¿ÉÒÔÔÚÈκÎʱºò¶¼´æÔÚ¡£ËûÃÇÊÇ×îºóÒ»¸ö±»½áÊøµÄ£¬µ±ÄÚ´æµÍµ½¸ù±¾Á¬ËûÃǶ¼²»ÄÜÔËÐеÄʱºò¡£Ò»°ãÀ´Ëµ£¬
ÔÚÕâÖÖÇé¿öÏ£¬É豸»á½øÐÐÄÚ´æµ÷¶È£¬ÖÐֹһЩǰ̨½ø³ÌÀ´±£³Ö¶ÔÓû§½»»¥µÄÏìÓ¦¡£
¿É¼û½ø³Ì
¿É¼û½ø³Ì²»°üº¬Ç°Ì¨µÄ×é¼þµ«ÊÇ»áÔÚÆÁÄ»ÉÏÏÔʾһ¸ö¿É¼ûµÄ½ø³ÌÊǵÄÖØÒª³Ì¶ÈºÜ¸ß£¬³ý·Çǰ̨½ø³ÌÐèÒª»ñÈ¡ËüµÄ×ÊÔ´£¬²»È»²»»á±»ÖÐÖ¹¡£
·þÎñ½ø³Ì
ÔËÐÐ×ÅÒ»¸öͨ¹ýstartService() ·½·¨Æô¶¯µÄservice£¬Õâ¸öservice²»ÊôÓÚÉÏÃæÌáµ½µÄ2ÖÖ¸ü¸ßÖØÒªÐԵġ£serviceËùÔڵĽø³ÌËäÈ»¶ÔÓû§²»ÊÇÖ±½Ó¿É¼ûµÄ£¬µ«ÊÇËûÃÇÖ´ÐÐÁËÓÃ
»§·Ç³£¹Ø×¢µÄÈÎÎñ£¨±ÈÈç²¥·Åmp3£¬´ÓÍøÂçÏÂÔØÊý¾Ý£©¡£Ö»ÒªÇ°Ì¨½ø³ÌºÍ¿É¼û½ø³ÌÓÐ×ã¹»µÄÄڴ棬ϵͳ²»»á»ØÊÕËûÃÇ¡£
ºǫ́½ø³Ì
ÔËÐÐ×ÅÒ»¸ö¶ÔÓû§²»¿É¼ûµÄactivity£¨µ÷Óùý onStop() ·½·¨).ÕâЩ½ø³Ì¶ÔÓû§ÌåÑéûÓÐÖ±½ÓµÄÓ°Ï죬¿ÉÒÔÔÚ·þÎñ½ø³Ì¡¢¿É¼û½ø³Ì¡¢Ç°Ì¨½ø
³ÌÐèÒªÄÚ´æµÄʱºò»ØÊÕ¡£Í¨³££¬ÏµÍ³ÖлáÓкܶ಻¿É¼û½ø³ÌÔÚÔËÐУ¬ËûÃDZ»±£´æÔÚLRU (least recently
used) ÁбíÖУ¬ÒÔ±ãÄÚ´æ²»×ãµÄʱºò±»µÚһʱ¼ä»ØÊÕ¡£Èç¹ûÒ»¸öactivityÕý È·µÄÖ´ÐÐÁËËüµÄÉúÃüÖÜÆÚ£¬¹Ø±ÕÕâ¸ö½ø³Ì¶ÔÓÚÓû§ÌåÑéûÓÐÌ«´óµÄÓ°Ïì¡£
¿Õ½ø³Ì
δÔËÐÐÈκγÌÐò×é¼þ¡£ÔËÐÐÕâЩ½ø³ÌµÄΨһÔÒòÊÇ×÷Ϊһ¸ö»º´æ£¬Ëõ¶ÌÏ´γÌÐòÐèÒªÖØÐÂʹÓÃµÄÆô¶¯Ê±¼ä¡£ÏµÍ³¾³£ÖÐÖ¹ÕâЩ½ø³Ì£¬ÕâÑù¿ÉÒÔµ÷½Ú³ÌÐò»º´æºÍϵͳ»º´æµÄƽºâ¡£
Android ¶Ô½ø³ÌµÄÖØÒªÐÔÆÀ¼¶µÄʱºò£¬Ñ¡È¡Ëü×î¸ßµÄ¼¶±ð¡£ÁíÍ⣬µ±±»ÁíÍâµÄÒ»¸ö½ø³ÌÒÀÀµµÄʱºò£¬Ä³¸ö½ø³ÌµÄ¼¶±ð¿ÉÄÜ»áÔö¸ß¡£Ò»¸öΪÆäËû½ø³Ì·þÎñµÄ½ø³ÌÓÀÔ¶²»»á±È±»·þ
ÎñµÄ½ø³ÌÖØÒª¼¶µÍ¡£ÒòΪ·þÎñ½ø³Ì±Èºǫ́activity½ø³ÌÖØÒª¼¶¸ß£¬Òò´ËÒ»¸öÒª½øÐкÄʱ¹¤×÷µÄactivity×îºÃÆô¶¯Ò»¸öserviceÀ´×öÕâ¸ö¹¤
×÷£¬¶ø²»ÊÇ¿ªÆôÒ»¸ö×Ó½ø³Ì¨D¨DÌØ±ðÊÇÕâ¸ö²Ù×÷ÐèÒªµÄʱ¼ä±Èactivity´æÔÚµÄʱ¼ä»¹Òª³¤µÄʱºò¡£ÀýÈ磬ÔÚºǫ́²¥·ÅÒôÀÖ£¬ÏòÍøÉÏÉÏ´«ÉãÏñÍ·Åĵ½µÄͼƬ£¬
ʹÓÃservice¿ÉÒÔʹ½ø³Ì×îÉÙ»ñÈ¡µ½¡°·þÎñ½ø³Ì¡±¼¶±ðµÄÖØÒª¼¶£¬¶ø²»Óÿ¼ÂÇactivityĿǰÊÇʲô״̬¡£broadcast
receivers×ö·ÑʱµÄ¹¤×÷µÄʱºò£¬Ò²Ó¦¸ÃÆôÓÃÒ»¸ö·þÎñ¶ø²»ÊÇ¿ªÒ»¸öÏ̡߳£
2. µ¥Ïß³ÌÄ£ÐÍ
µ±Ò»¸ö³ÌÐòµÚÒ»´ÎÆô¶¯Ê±£¬Android»áͬʱÆô¶¯Ò»¸ö¶ÔÓ¦µÄÖ÷Ị̈߳¨Main
Thread£©£¬Ö÷Ïß³ÌÖ÷Òª¸ºÔð´¦ÀíÓëUIÏà¹ØµÄʼþ£¬ÈçÓû§µÄ°´¼üʼþ£¬Óû§½Ó´¥ÆÁÄ»µÄʼþÒÔ¼°ÆÁÄ»»æÍ¼Ê¼þ£¬²¢°ÑÏà¹ØµÄʼþ·Ö·¢µ½¶ÔÓ¦µÄ×é¼þ½øÐд¦
Àí¡£ËùÒÔÖ÷Ïß³Ìͨ³£ÓÖ±»½Ð×öUIÏ̡߳£
ÔÚ¿ª·¢AndroidÓ¦ÓÃʱ±ØÐë×ñÊØµ¥Ïß³ÌÄ£Ð͵ÄÔÔò£º Android UI²Ù×÷²¢²»ÊÇḬ̈߳²È«µÄ²¢ÇÒÕâЩ²Ù×÷±ØÐëÔÚUIÏß³ÌÖÐÖ´ÐС£
2.1 ×ÓÏ̸߳üÐÂUI AndroidµÄUIÊǵ¥Ïß³Ì(Single-threaded)µÄ¡£
ΪÁ˱ÜÃâÍÏסGUI£¬Ò»Ð©½Ï·ÑʱµÄ¶ÔÏóÓ¦¸Ã½»¸ø¶ÀÁ¢µÄÏß³ÌÈ¥Ö´ÐС£Èç¹ûÄ»ºóµÄÏß³ÌÀ´Ö´ÐÐUI¶ÔÏó£¬Android¾Í»á·¢³ö´íÎóѶϢ
CalledFromWrongThreadException¡£ÒÔºóÓöµ½ÕâÑùµÄÒì³£Å׳öʱ¾ÍÒªÖªµÀÔõô»ØÊÂÁË£¡
2.2 Message Queue
ÔÚµ¥Ïß³ÌÄ£ÐÍÏ£¬ÎªÁ˽â¾öÀàËÆµÄÎÊÌ⣬AndroidÉè¼ÆÁËÒ»¸öMessage
Queue(ÏûÏ¢¶ÓÁÐ)£¬ Ï̼߳ä¿ÉÒÔͨ¹ý¸ÃMessage Queue²¢½áºÏHandlerºÍLooper×é¼þ½øÐÐÐÅÏ¢½»»»¡£ÏÂÃæ½«¶ÔËüÃǽøÐзֱð½éÉÜ£º
2.2.1. Message MessageÏûÏ¢
Àí½âΪÏ̼߳佻Á÷µÄÐÅÏ¢£¬´¦ÀíÊý¾Ýºǫ́Ïß³ÌÐèÒª¸üÐÂUI£¬Ôò·¢ËÍMessageÄÚº¬Ò»Ð©Êý¾Ý¸øUIÏ̡߳£
2.2.2. Handler Handler´¦ÀíÕß
ÊÇMessageµÄÖ÷Òª´¦ÀíÕߣ¬¸ºÔðMessageµÄ·¢ËÍ£¬MessageÄÚÈݵÄÖ´Ðд¦Àí¡£ºǫ́Ï߳̾ÍÊÇͨ¹ý´«½øÀ´µÄHandler¶ÔÏóÒýÓÃÀ´
sendMessage(Message)¡£¶øÊ¹ÓÃHandler£¬ÐèÒªimplement ¸ÃÀàµÄ handleMessage(Message)
·½·¨£¬ËüÊÇ´¦ÀíÕâЩMessageµÄ²Ù×÷ÄÚÈÝ£¬ÀýÈçUpdate UI¡£Í¨³£ÐèÒª×ÓÀ໯HandlerÀ´ÊµÏÖhandleMessage·½·¨¡£
2.2.3. Message Queue
Message QueueÏûÏ¢¶ÓÁÐ ÓÃÀ´´æ·Åͨ¹ýHandler·¢²¼µÄÏûÏ¢£¬°´ÕÕÏȽøÏȳöÖ´ÐС£
ÿ¸ömessage queue¶¼»áÓÐÒ»¸ö¶ÔÓ¦µÄHandler¡£Handler»áÏòmessage queueͨ¹ýÁ½ÖÖ·½·¨·¢ËÍÏûÏ¢£ºsendMessage»òpost¡£ÕâÁ½ÖÖÏûÏ¢¶¼»á²åÔÚmessage
queue¶Óβ²¢°´ÏȽøÏȳöÖ´ÐС£µ«Í¨¹ýÕâÁ½ÖÖ·½·¨·¢Ë͵ÄÏûÏ¢Ö´Ðеķ½Ê½ÂÔÓв»Í¬£ºÍ¨¹ýsendMessage·¢Ë͵ÄÊÇÒ»¸ömessage¶ÔÏó,»á±»
HandlerµÄhandleMessage()º¯Êý´¦Àí£»¶øÍ¨¹ýpost·½·¨·¢Ë͵ÄÊÇÒ»¸örunnable¶ÔÏó£¬Ôò»á×Ô¼ºÖ´ÐС£
2.2.4. Looper
LooperÊÇÿÌõÏß³ÌÀïµÄMessage QueueµÄ¹Ü¼Ò¡£ AndroidûÓÐGlobalµÄMessage
Queue£¬¶øAndroid»á×Ô¶¯ÌæÖ÷Ïß³Ì(UIÏß³Ì)½¨Á¢Message Queue£¬µ«ÔÚ×ÓÏß³ÌÀﲢûÓн¨Á¢Message
Queue¡£ËùÒÔµ÷ÓÃLooper.getMainLooper()µÃµ½µÄÖ÷Ï̵߳ÄLooper²»ÎªNULL£¬µ«µ÷ÓÃLooper.myLooper()
µÃµ½µ±Ç°Ï̵߳ÄLooper¾ÍÓпÉÄÜΪNULL¡£
¶ÔÓÚ×ÓÏß³ÌʹÓÃLooper£¬API DocÌṩÁËÕýÈ·µÄʹÓ÷½·¨£º
Java´úÂë
package com.test; import android.os.Handler; import android.os.Looper; import android.os.Message; class LooperThread extends Thread { public Handler mHandler; public void run() { Looper.prepare(); // ´´½¨±¾Ï̵߳ÄLooper²¢´´½¨Ò»¸öMessageQueue mHandler = new Handler() { public void handleMessage(Message msg) { // process incoming messages here } }; Looper.loop(); // ¿ªÊ¼ÔËÐÐLooper,¼àÌýMessage Queue } } |
Õâ¸öMessage»úÖÆµÄ´ó¸ÅÁ÷³Ì£º
1. ÔÚLooper.loop()·½·¨ÔËÐпªÊ¼ºó£¬Ñ»·µØ°´ÕÕ½ÓÊÕ˳ÐòÈ¡³öMessage
QueueÀïÃæµÄ·ÇNULLµÄMessage¡£
2. Ò»¿ªÊ¼Message QueueÀïÃæµÄMessage¶¼ÊÇNULLµÄ¡£µ±Handler.sendMessage(Message)µ½Message
Queue£¬¸Ãº¯ÊýÀïÃæÉèÖÃÁËÄǸöMessage¶ÔÏóµÄtargetÊôÐÔÊǵ±Ç°µÄHandler¶ÔÏó¡£ËæºóLooperÈ¡³öÁËÄǸöMessage£¬Ôòµ÷ÓÃ
¸ÃMessageµÄtargetÖ¸ÏòµÄHanderµÄdispatchMessageº¯Êý¶ÔMessage½øÐд¦Àí¡£
ÔÚdispatchMessage·½·¨ÀÈçºÎ´¦ÀíMessageÔòÓÉÓû§Ö¸¶¨£¬Èý¸öÅжϣ¬ÓÅÏȼ¶´Ó¸ßµ½µÍ£º
1) MessageÀïÃæµÄCallback£¬Ò»¸öʵÏÖÁËRunnable½Ó¿ÚµÄ¶ÔÏ󣬯äÖÐrunº¯Êý×ö´¦Àí¹¤×÷£»
2) HandlerÀïÃæµÄmCallbackÖ¸ÏòµÄÒ»¸öʵÏÖÁËCallback½Ó¿ÚµÄ¶ÔÏó£¬ÓÉÆähandleMessage½øÐд¦Àí£»
3) ´¦ÀíÏûÏ¢Handler¶ÔÏó¶ÔÓ¦µÄÀà¼Ì³Ð²¢ÊµÏÖÁËÆäÖÐhandleMessageº¯Êý£¬Í¨¹ýÕâ¸öʵÏÖµÄhandleMessageº¯Êý´¦ÀíÏûÏ¢¡£
Óɴ˿ɼû£¬ÎÒÃÇʵÏÖµÄhandleMessage·½·¨ÊÇÓÅÏȼ¶×îµÍµÄ£¡
3. Handler´¦ÀíÍê¸ÃMessage (update UI) ºó£¬LooperÔòÉèÖøÃMessageΪNULL£¬ÒﱋȯÊÕ£¡
3.AndroidÁíÍâÌṩÁËÒ»¸ö¹¤¾ßÀࣺAsyncTask¡£
ËüʹµÃUI threadµÄʹÓñäµÃÒì³£¼òµ¥¡£Ëüʹ´´½¨ÐèÒªÓëÓû§½çÃæ½»»¥µÄ³¤Ê±¼äÔËÐеÄÈÎÎñ±äµÃ¸ü¼òµ¥£¬²»ÐèÒª½èÖúÏ̺߳ÍHandler¼´¿ÉʵÏÖ¡£
1) ×ÓÀ໯AsyncTask
2) ʵÏÖAsyncTaskÖж¨ÒåµÄÏÂÃæÒ»¸ö»ò¼¸¸ö·½·¨
onPreExecute() ¿ªÊ¼Ö´ÐÐǰµÄ×¼±¸¹¤×÷£»
doInBackground(Params...) ¿ªÊ¼Ö´Ðкǫ́´¦Àí£¬¿ÉÒÔµ÷ÓÃpublishProgress·½·¨À´¸üÐÂʵʱµÄÈÎÎñ½ø¶È£»
onProgressUpdate(Progress...) ÔÚpublishProgress·½·¨±»µ÷Óúó£¬UI
thread½«µ÷ÓÃÕâ¸ö·½·¨´Ó¶øÔÚ½çÃæÉÏչʾÈÎÎñµÄ½øÕ¹Çé¿ö£¬ÀýÈçͨ¹ýÒ»¸ö½ø¶ÈÌõ½øÐÐչʾ¡£
onPostExecute(Result) Ö´ÐÐÍê³ÉºóµÄ²Ù×÷£¬´«Ëͽá¹û¸øUI
Ï̡߳£
Õâ4¸ö·½·¨¶¼²»ÄÜÊÖ¶¯µ÷Ó᣶øÇÒ³ýÁËdoInBackground(Params...)·½·¨£¬ÆäÓà3¸ö·½·¨¶¼ÊDZ»UIÏß³ÌËùµ÷Óõģ¬ËùÒÔÒªÇó£º
1) AsyncTaskµÄʵÀý±ØÐëÔÚUI threadÖд´½¨£»
2) AsyncTask.execute·½·¨±ØÐëÔÚUI threadÖе÷Óã»
ͬʱҪעÒ⣺¸ÃtaskÖ»Äܱ»Ö´ÐÐÒ»´Î£¬·ñÔò¶à´Îµ÷ÓÃʱ½«»á³öÏÖÒì³£¡£
ÔÚʹÓùý³ÌÖУ¬·¢ÏÖAsyncTaskµÄ¹¹Ô캯ÊýµÄ²ÎÊýÉèÖÃÐèÒª¿´Ã÷°×£º
AsyncTask<Params, Progress, Result>
Params¶ÔÓ¦doInBackground(Params...)µÄ²ÎÊýÀàÐÍ¡£
¶ønew AsyncTask().execute(Params...
params)£¬¾ÍÊÇ´«½øÀ´µÄParamsÊý¾Ý£¬Äã¿ÉÒÔexecute(data)À´´«ËÍÒ»¸öÊý¾Ý£¬»òÕßexecute(data1,
data2, data3)ÕâÑù¶à¸öÊý¾Ý¡£
Progress¶ÔÓ¦onProgressUpdate(Progress...)µÄ²ÎÊýÀàÐÍ£»
Result¶ÔÓ¦onPostExecute(Result)µÄ²ÎÊýÀàÐÍ¡£
µ±ÒÔÉϵIJÎÊýÀàÐͶ¼²»ÐèÒªÖ¸Ã÷ij¸öʱ£¬ÔòʹÓÃVoid£¬×¢Òâ²»ÊÇvoid¡£²»Ã÷°×µÄ¿ÉÒԲο¼ÉÏÃæµÄÀý×Ó£¬»òÕßAPI
DocÀïÃæµÄÀý×Ó¡£
ÏÂÃæÊǹØÓÚAsyncTaskµÄʹÓÃʾÀý£º
Java´úÂë
((Button) findViewById(R.id.load_AsyncTask)).setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { data = null; data = new ArrayList<String>(); adapter = null; //ÏÔʾProgressDialog·Åµ½AsyncTask.onPreExecute()Àï //showDialog(PROGRESS_DIALOG); new ProgressTask().execute(data); } }); private class ProgressTask extends AsyncTask<ArrayList<String>, Void, Integer> { /* ¸Ã·½·¨½«ÔÚÖ´ÐÐʵ¼ÊµÄºǫ́²Ù×÷ǰ±»UI threadµ÷Ó᣿ÉÒÔÔڸ÷½·¨ÖÐ×öһЩ׼±¸¹¤×÷£¬ÈçÔÚ½çÃæÉÏÏÔʾһ¸ö½ø¶ÈÌõ¡£ */ @Override protected void onPreExecute() { // ÏÈÏÔʾProgressDialog showDialog(PROGRESS_DIALOG); } /* Ö´ÐÐÄÇЩºÜºÄʱµÄºǫ́¼ÆË㹤×÷¡£¿ÉÒÔµ÷ÓÃpublishProgress·½·¨À´¸üÐÂʵʱµÄÈÎÎñ½ø¶È¡£ */ @Override protected Integer doInBackground(ArrayList<String>... datas) { ArrayList<String> data = datas[0]; for (int i=0; i<8; i++) { data.add("ListItem"); } return STATE_FINISH; } /* * ÔÚdoInBackground Ö´ÐÐÍê³Éºó£¬onPostExecute ·½·¨½«±»UI threadµ÷Ó㬠ºǫ́µÄ¼ÆËã½á¹û½«Í¨¹ý¸Ã·½·¨´«µÝµ½UI * thread. */ @Override protected void onPostExecute(Integer result) { int state = result.intValue(); switch(state){ case STATE_FINISH: dismissDialog(PROGRESS_DIALOG); Toast.makeText(getApplicationContext(), "¼ÓÔØÍê³É!", Toast.LENGTH_LONG).show(); adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, data ); setListAdapter(adapter); break; case STATE_ERROR: dismissDialog(PROGRESS_DIALOG); Toast.makeText(getApplicationContext(),"´¦Àí¹ý³Ì·¢Éú´íÎó!",Toast.LENGTH_LONG).show(); adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, data ); setListAdapter(adapter); break; default: } } |
ÒÔÉÏÊÇ´ÓÍøÂç»ñÈ¡Êý¾Ý£¬¼ÓÔØµ½ListViewÖÐʾÀý¡£
4.AndroidÖÐÈçºÎ½áÊø½ø³Ì
4.1 Android ½áÊø½ø³Ì£¬¹Ø±Õ³ÌÐòµÄ·½·¨ ¼´²ÉÓÃÏÂÃæÕâ¸öÀà
Void android.app.ActivityManager.restartPackage(String packageName) public void restartPackage (String packageName) Since: API Level 3 Have the system perform a force stop of everything associated with the given application package.
All processes that share its uid will be killed, all services it has running stopped, all activities removed, etc.
In addition,
a ACTION_PACKAGE_RESTARTED broadcast will be sent, so that any of its registered alarms can be stopped,
notifications removed,
etc. You must hold the permission RESTART_PACKAGES to be able to call this method. Parameters packageName
The name of the package to be stopped. |
ʹÓÃÕâ¸öÀàµÄ¾ßÌåÔ´´úÂë
final ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); am.restartPackage(getPackageName()); |
¸´ÖÆ´úÂë
²»ÒªÍü¼ÇÁËÔÚÅäÖÃÎļþÖÐÉèÖÃȨÏÞ£º
<uses-permission android:name="android.permission.RESTART_PACKAGES"></uses-permission> |
¸´ÖÆ´úÂë
½áÊø½ø³Ì»¹ÓÐ
4.2 android.os.Process.killProcess(pid)
Ö»ÄÜÖÕÖ¹±¾³ÌÐòµÄ½ø³Ì£¬ÎÞ·¨ÖÕÖ¹ÆäËüµÄ
public static final void killProcess (int pid) Kill the process with the given PID. Note that,
though this API allows us to request to kill any process based on its PID,
the kernel will still impose standard restrictions on which PIDs you are actually able to kill.
Typically this means only the process running the caller's packages/application
and any additional processes created by that app;
packages sharing a common UID will also be able to kill each other's processes. |
¾ßÌå´úÂëÈçÏ£º
Process.killProcess(Process.myPid()); Process.killProcess(Process.myPid()); |
¸´ÖÆ´úÂë
public void finish () Call this when your activity is done and should be closed.
The ActivityResult is propagated back to whoever launched you via onActivityResult(). |
ÕâÊǽáÊøµ±Ç°activityµÄ·½·¨¡£ ÒªÖ÷¶¯µÄ½áÊøÒ»¸ö»î¶¯Activity£¬ÕâÀïÐèҪעÒâfinishÊǽáÊøµôÒ»¸öActivity£¬¶ø²»ÊÇÒ»¸ö½ø³Ì¡£Õâ¸ö·½·¨×îºó»áµ÷ÓÃActivityµÄ
ÉúÃüÖÜÆÚº¯ÊýonDestroy·½·¨£¬½áÊøµ±Ç° µÄActivity£¬´ÓÈÎÎñÕ»Öе¯³öµ±Ç°µÄActivity£¬¼¤»îÏÂÒ»¸öActivity¡£µ±È»ÆäËûµÄfinishϵÁз½·¨£¬ÎÒÃDz»ÔÚÕâÀï×öÏêϸÌÖ
ÂÛ¡£
4.3 System.exit(int code)
ÀýÈ磺 System.exit(0);
¸Ã·½·¨Ö»ÄÜÓÃÓÚ½áÊøµ±Ç°½ø³Ì×ÔÉí£¬ÔÚ³ÌÐòÓöµ½Òì³££¬ÎÞ·¨Õý³£Ö´ÐÐʱ£¬¿ÉÒÔ Í¨¹ýÕâ¸ö·½·¨Ç¿ÖÆÍ˳ö¡£
ÐèҪעÒâµÄÊÇ£º android.os.Process.killProcess(pid)
ºÍ System.exit(int code) »áµ¼Ö½ø³Ì·ÇÕý³£Í˳ö£¬½ø³ÌÍ˳öʱ²»»áÈ¥Ö´ÐÐActivityµÄonPause¡¢onStopºÍonDestroy·½·¨£¬ÄÇô½ø³ÌºÜÓпÉÄÜ´í¹ýÁ˱£´æÊý¾ÝµÄ»ú»á¡£Òò´Ë£¬ÕâÁ½¸ö·½·¨×îºÃʹÓÃÔÚ³öÏÖÒì³£µÄʱºò£¡´ó¼ÒÐèҪעÒâÆäʹÓ÷½·¨¡£
4.4 ÔÚandroid2.2°æ±¾Ö®ºóÔò²»ÄÜÔÙʹÓÃrestartPackage()·½·¨£¬¶øÓ¦¸ÃʹÓÃkillBackgroundProcesses()·½·¨
manager.killBackgroundProcesses(getPackageName()); ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE); manager.killBackgroundProcesses(getPackageName()); |
¸´ÖÆ´úÂë
1.//ÐèÒªÔÚxmlÖмÓÈëȨÏÞÉùÃ÷
2.<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
|
¸´ÖÆ´úÂë
ÁíÍ⣬ÔÚandroid2.2ÒÔºó£¬Èç¹û·þÎñÔÚondestroyÀï¼ÓÉÏÁËstart×Ô¼º£¬ÓÃkill
backgroudprocessͨ³£ÎÞ·¨½áÊø×Ô¼º¡£
4.5»¹ÓÐÒ»ÖÖ×îз¢Ïֵķ½·¨£¬ÀûÓ÷´Éäµ÷ÓÃforceStopPackageÀ´½áÊø½ø³Ì
1.Method
forceStopPackage = am.getClass().getDeclaredMethod("forceStopPackage",
String.class);
2.forceStopPackage.setAccessible(true);
3.forceStopPackage.invoke(am,
yourpkgname);
|
¸´ÖÆ´úÂë
ÅäÖÃÎļþÖÐÐèÒªÌí¼Ó¶¨Òå
1. android:sharedUserId="android.uid.system" |
¸´ÖÆ´úÂë
ÁíÍâÐèÒªÔÙÔÚÅäÖÃÎļþÌí¼ÓȨÏÞ£º
<uses-permission android:name="android.permission.FORCE_STOP_PACKAGES"></uses-permission>
|
¸´ÖÆ´úÂë
²¢ÇÒ²ÉÓÃϵͳplatformÇ©Ãû ÒòΪÐèÒªÓÃFORCE_STOP_PACKAGESȨÏÞ£¬¸ÃȨÏÞÖ»¸³ÓèϵͳǩÃû¼¶³ÌÐò
¼´¿ÉʵÏÖÇ¿ÖÆÍ£Ö¹Ö¸¶¨³ÌÐò
4.6 »¹ÓÐÒ»ÖÖ·½·¨ ÀûÓÃlinuxµÄkill -9ÃüÁî
4.7 Í˳öµ½Ö÷ÆÁÄ»£¨ÊǶԵ±Ç°½ø³ÌµÄÒ»ÖÖ´¦Àí£©
Õâ¸ö·½·¨£¬Ò²ÊÇÍ˳öµ±Ç°½ø³ÌµÄÒ»¸ö·½·¨¡£Èç¹ûÎÒÃÇÔÚ½ø³ÌÖд´½¨Á˺ܶàµÄActivity£¬
µ«ÊÇÓÖ²»Ïë¹Ø±ÕʱȥÍ˳ö²»ÔÚÈÎÎñÕ»¶¥µÄActivity £¬ÄÇô¾Í¿ÉÒÔÖ±½ÓʹÓÃÕâ¸ö·½·¨ÁË¡£
¹¦ÄÜ£ºµ±°´Ï·µ»Ø¼üʱ£¬¾Í·µ»Øµ½Ö÷ÆÁÄ»£¬²¢´øÓвÎÊý FLAG_ACTIVITY_CLEAR_TOP
£¬ »áÇåÀíµôµ±Ç°µÄ»î¶¯¡£
ÒÔÏÂÊǰ´Ï·µ»Ø¼üͬʱ²»Öظ´Ê±£¬·µ»Øµ½Ö÷ÆÁÄ»µÄʾÀý£º
Java´úÂë
package com.test.android; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.KeyEvent; /** * Andriod°´·µ»Ø¼ü·µ»Øµ½Ö÷ÆÁĻʾÀý */ public class MyTestProjectActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // event.getRepeatCount()£º°´Ï·µ»Ø¼ü£¬Í¬Ê±Ã»ÓÐÖØ¸´ if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { Intent home = new Intent(Intent.ACTION_MAIN); home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); home.addCategory(Intent.CATEGORY_HOME); startActivity(home); } return super.onKeyDown(keyCode, event); } } |
|