当前位置:  编程技术>移动开发
本页文章导读:
    ▪銆愬師鍒涖€慉ndroid 绯荤粺绋冲畾鎬? Watchdog        銆愬師鍒涖€慉ndroid 绯荤粺绋冲畾鎬?- Watchdog 鏂囩珷閮戒负鍘熷垱锛岃浆杞借娉ㄦ槑鍑哄锛屾湭缁忓厑璁歌€岀洍鐢ㄨ€呰拷绌舵硶寰嬭矗浠汇€偮?/strong> 寰堜箙涔嬪墠鍐欑殑浜嗭.........
    ▪ QQ跟新浪帐号授权登录        QQ和新浪帐号授权登录 package p.wy.hc.activity; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import p.wy.hc.........
    ▪ java 栈内存储器解惑       java 栈内存解惑 int j = 0;          j = j++;          //由于是虚拟机的问题, j 初始为0, 先给j 赋值为0, 然后 j的新的地址已经改变了,然后再给老的j+1; 但是新的j的值依然为0  .........

[1]銆愬師鍒涖€慉ndroid 绯荤粺绋冲畾鎬? Watchdog
    来源: 互联网  发布时间: 2014-02-18
銆愬師鍒涖€慉ndroid 绯荤粺绋冲畾鎬?- Watchdog

鏂囩珷閮戒负鍘熷垱锛岃浆杞借娉ㄦ槑鍑哄锛屾湭缁忓厑璁歌€岀洍鐢ㄨ€呰拷绌舵硶寰嬭矗浠汇€偮?/strong>

寰堜箙涔嬪墠鍐欑殑浜嗭紝鐣欑潃鏈夌偣娴垂锛屽叡浜箣锛堟枃绔犳病鏈夊畬鍏ㄥ啓瀹岋級銆偮?/strong>

缂栧啓鑰咃細鏉庢枃鏍嬄?/strong>

绗?绔?绯荤粺杩涚▼鐨刉atchdog 3.1 Watchdog绠€浠?/strong>

聽 聽 聽 聽 瀵逛簬鍍忕瑪鑰呰繖鏍锋病鐜╄繃纭欢鐨勭函杞▼搴忓憳鏉ヨ锛岀涓€娆$湅鍒拌繖涓浼欑殑鏃跺€欑湡蹇冧竴澶撮浘姘达紝鍙槸瑙夊緱杩欎釜鍚嶅瓧寰堟湁鎰忔€濄€備竴鐣皟鏌ュ悗鍙戠幇锛學atchdog鏈哄埗鏈€鏃╂潵婧愪簬纭欢锛屽湪璁$畻鏈虹郴缁熶腑锛屽崟鐗囨満鐨勫伐浣滃鏄撳彈鍒版潵鑷鐣岀數纾佸満鐨勫共鎵帮紝鑰岄櫡鍏ユ寰幆锛岀郴缁熸棤娉曠户缁伐浣滐紝涓轰簡瑙e喅杩欎釜闂锛屼究浜х敓浜嗕竴绉嶄笓闂ㄧ敤浜庣洃娴嬪崟鐗囨満绋嬪簭杩愯鐘舵€佺殑鑺墖锛屼織绉?鐪嬮棬鐙?(Watchdog)銆?/p>

聽 聽 聽 聽 鈥滅湅闂ㄧ嫍鈥濇湰韬槸涓€涓畾鏃跺櫒鐢佃矾锛屽唴閮ㄤ細涓嶆柇鐨勮繘琛岃鏃讹紙鎴栬鏁帮級鎿嶄綔銆傝绠楁満绯荤粺鍜屸€滅湅闂ㄧ嫍鈥濇湁涓や釜寮曡剼鐩歌繛鎺ワ紝姝e父杩愯鏃舵瘡闅斾竴娈垫椂闂村氨浼氶€氳繃鍏朵腑涓€涓紩鑴氬悜鈥滅湅闂ㄧ嫍鈥濆彂閫佷俊鍙凤紝鈥滅湅闂ㄧ嫍鈥濇帴鏀跺埌淇″彿鍚庝細灏嗚鏃跺櫒娓呴浂骞堕噸鏂板紑濮嬭鏃躲€傝€屼竴鏃︾郴缁熷嚭鐜伴棶棰橈紝杩涘叆姝诲惊鐜垨浠讳綍闃诲鐘舵€侊紝涓嶈兘鍙婃椂鍙戦€佷俊鍙疯鈥滅湅闂ㄧ嫍鈥濈殑璁℃椂鍣ㄦ竻闆讹紝褰撹鏃剁粨鏉熸椂锛屸€滅湅闂ㄧ嫍鈥濆氨浼氶€氳繃鍙︿竴涓紩鑴氬悜绯荤粺鍙戦€佲€滃浣嶄俊鍙封€濓紝璁╃郴缁熼噸鍚€?/p>

聽 聽 聽 聽杩欐牱鐪嬫潵锛屽悜鈥滅湅闂ㄧ嫍鈥濆彂閫佷俊鍙峰氨鍍忔槸鈥滃杺鐙椻€濓紝璁℃椂鍣ㄥ氨鏄€滅湅闂ㄧ嫍鈥濈殑鑳冿紝褰撹鏃剁粨鏉燂紝鐙楅タ浜嗭紝灏变竴鍙f妸绯荤粺鍜锛岃瀹冮噸鐢熴€?/p>

聽 聽 聽 聽聽杞欢涓婄殑鐪嬮棬鐙楁妧鏈殑鎬濇兂鍜屽奖鍝嶇被浼硷紝渚嬪Linux鑷甫鐨刉atchdog銆備笅闈㈡垜浠潵鐪嬬湅Android绯荤粺杩涚▼鐨勮繖鏉″皬鐙楀惂銆?/p>

3.2 绯荤粺杩涚▼鐨刉atchdog

聽 聽 聽 聽聽Android绯荤粺杩涚▼涓殑Watchdog锛堜互涓嬬畝绉癢D锛夎嚜鐒舵槸鐢ㄦ潵鐩戞祴绯荤粺杩涚▼鐨勶紝瀹冨拰纭欢涓婄殑WD鏈変粈涔堝尯鍒憿锛熺郴缁熻繘绋嬩腑缁存姢鐫€澶ч噺鐨勬湇鍔″璞★紝鍏朵腑鏈変竴浜涢潪甯搁噸瑕佺殑瀵硅薄锛屼緥濡侫ctivityManagerService锛?WindowManagerService绛夛紝杩欎簺鏈嶅姟瀵硅薄鑳藉琚甯歌闂绯荤粺鐨勮繍琛屾潵璇磋嚦鍏抽噸瑕侊紝鏆備笖绉板畠浠负鍏抽敭瀵硅薄銆傝繖浜涘叧閿璞″彲鑳藉悓鏃朵細琚涓嚎绋嬩娇鐢紝鎵€浠ラ渶瑕佸湪鎿嶄綔杩欎簺瀵硅薄鐨勫湴鏂逛娇鐢ㄥ悓姝ラ攣灏嗗畠浠繚鎶よ捣鏉ワ紝纭繚瀵硅薄鐘舵€佺殑涓€鑷存€с€備絾鏄鏋滄煇涓嚎绋嬮攣浣忓叧閿璞″悗闀挎椂闂存病鏈夐噴鏀鹃攣锛屽叾浠栫嚎绋嬫棤娉曚娇鐢ㄥ璞″畬鎴愬悗缁殑浠诲姟锛岄偅涔堢郴缁熷氨浼氬浜庡仠婊炵姸鎬佹棤娉曡繍琛岋紝姝ゆ椂灏遍渶瑕佽绯荤粺閲嶅惎浠ユ仮澶嶅埌涓€涓甯哥殑杩愯鐘舵€併€傛娴嬭繖浜涘叧閿湇鍔″璞℃槸鍚﹁閿佷綇锛屽拰閲嶅惎绯荤粺鐨勬搷浣滃氨鏄敱WD瀹屾垚鐨勩€?/p>

聽 聽 聽 聽聽WD鏄浣曞畬鎴愯繖椤圭鍦g殑浣垮懡鐨勫憿锛熸垜浠厛鏉ヤ簡瑙d竴涓媁D鐨勫垱寤哄拰鍚姩锛屽啀鏉ュ墫鏋愬畠鐨勭粨鏋勫拰娴佺▼銆?/p>

3.2.1 Watchdog鍒濆鍖栧拰鍚姩

聽 聽 聽 聽聽WD瀵硅薄鏄竴涓崟渚嬶紝鏄湪绯荤粺鍚姩杩囩▼涓殑ServerThread绾跨▼涓椂鍒涘缓鐨勩€?/p>

ServerThread.java 鈫?run()

Slog.i(TAG, "Init Watchdog");

Watchdog.getInstance().init(context, battery, power, alarm,

ActivityManagerService.self());

聽 聽 聽 聽聽闇€瑕佹敞鎰忕殑鏄疻D鐨勬瀯閫犳柟娉曪紝鍏跺唴閮ㄥ垱寤轰簡涓€涓狧eartbeatHandler绫诲瀷鐨勫璞★紝鍚庨潰浼氳缁嗕粙缁嶅畠锛屼笉杩囧彲浠ヨ偗瀹氱殑鏄紝杩欎釜Handler瀹炰緥缁戝畾浜哠erverThread绾跨▼鐨凩ooper銆?/p>

Watchdog.java 鈫?Watchdog()

private Watchdog() {

聽 聽 聽 聽聽super("watchdog");

聽 聽 聽 聽聽mHandler = new HeartbeatHandler();

}

聽 聽 聽 聽聽鍐嶇湅涓€涓媔nit鏂规硶鍏蜂綋鍋氫簡浠€涔堛€?/p>

Watchdog.java 鈫?init()

publicvoid init(Context context, BatteryService battery,

聽 聽 聽 聽聽PowerManagerService power, AlarmManagerService alarm,

聽 聽 聽 聽聽ActivityManagerService activity) {

聽 聽 聽 聽聽//淇濆瓨浜嗗嚑涓鐢ㄥ埌鐨勬湇鍔″璞?/p>

聽 聽 聽 聽聽mResolver = context.getContentResolver();

聽 聽 聽 聽聽mBattery = battery;

聽 聽 聽 聽聽mPower = power;

聽 聽 聽 聽聽mAlarm = alarm;

聽 聽 聽 聽聽mActivity = activity;

聽 聽 聽 聽聽//娉ㄥ唽涓や釜BroadcastReceiver锛屾潵鎺ユ敹閲嶅惎鐨勬秷鎭?/p>

聽 聽 聽 聽聽context.registerReceiver(new RebootReceiver(),

聽 聽 聽 聽聽new IntentFilter(REBOOT_ACTION));

聽 聽 聽 聽聽mRebootIntent = PendingIntent.getBroadcast(context,

聽 聽 聽 聽聽聽 聽 聽 聽聽0, new Intent(REBOOT_ACTION), 0);

聽 聽 聽 聽聽context.registerReceiver(new RebootRequestReceiver(),

聽 聽 聽 聽聽new IntentFilter(Intent.ACTION_REBOOT),

聽 聽 聽 聽聽聽 聽 聽 聽聽android.Manifest.permission.REBOOT, null);

聽 聽 聽 聽聽mBootTime = System.currentTimeMillis(); //璁板綍鍚姩鏃堕棿

}

聽 聽 聽 聽聽init鏂规硶寰堢畝鍗曪紝娑夊強鐨勫唴瀹瑰悗闈細鍋氫粙缁嶃€?/p>

聽 聽 聽 聽聽瀹屾垚鍒濆鍖栧悗锛學D杩樻病鏈夊惎鍔ㄨ繍琛屻€傜湅涓€涓媁D鐨勭被澹版槑鍙互鐭ラ亾锛屽畠鏄疶hread绫荤殑瀛愮被锛屽彲浠ユ兂鍒癢D鏄湪鑷繁鐨勭嚎绋嬩腑瀹炵幇鈥滃畾鏃跺櫒鈥濈殑鍔熻兘鐨勶紝杩欏緢鍚堢悊锛岃瀹炵幇绫讳技浜庣嫭绔嬬‖浠跺畬鎴愮殑璁℃椂宸ヤ綔锛岀敤鐙珛绾跨▼瀹屾垚瀵规墍鍦ㄨ繘绋嬬殑鐩戞帶鏄啀濂戒笉杩囩殑銆傚惎鍔╓D绾跨▼鏄湪ServerThread绾跨▼鐨勬渶鍚庨樁娈靛畬鎴愮殑銆?/p>

ActivityManagerService.self().systemReady(new Runnable() {

聽 聽 聽 聽聽publicvoid run() {

聽 聽 聽 聽聽... ...

聽 聽 聽 聽聽Watchdog.getInstance().start();

聽 聽 聽 聽聽... ...

聽 聽 聽 聽聽}

);

3.2.2 Watchdog缁撴瀯鍓栨瀽

聽 聽 聽 聽聽涓轰簡鎻忚堪鏂逛究锛屽厛缁欏嚭WD鐨勭被鍥俱€?/p>



聽 聽 聽 聽聽WD鐨勭粨鏋勮繕鏄瘮杈冪畝鍗曠殑锛屼笅闈㈡垜浠垎鍑犱釜閮ㄥ垎鏉ュ垎鏋愩€?/p>

1. Watchdog

聽 聽 聽 聽聽WD鐨勨€滃畾鏃跺櫒鈥濈殑鍔熻兘鏄湪鍗曠嫭鐨勭嚎绋嬩腑瀹屾垚鐨勶紝鎵€浠D鏈韩缁ф壙浜員hread锛屽鍓嶉潰鎵€璇达紝瀹冩槸鍦ˋctivityManagerService鐨剆ystemReady鏂规硶涓惎鍔ㄧ殑銆?/p>

2. HeartbeatHandler

聽 聽 聽 聽聽Android绯荤粺杩涚▼鐨刉D鍜岀‖浠剁殑鈥滅湅闂ㄧ嫍鈥濈殑鎬濇兂鏄竴鑷寸殑锛屼絾鏄疄鐜版柟寮忎笂涓嶅悓銆俉D绾跨▼鍦ㄨ鏃剁殑杩囩▼涓苟涓嶆槸琚姩鐨勭瓑寰呯郴缁熺殑鈥滃杺鐙椻€濅俊鍙凤紝鑰屾槸鍦ㄦ瘡杞鏃剁殑寮€濮嬪悜ServerThread锛堜互涓嬬畝绉癝T锛夌嚎绋嬪彂涓€涓娴嬫秷鎭紝ST鎺ユ敹鍒版秷鎭悗寮€濮嬮亶鍘哅onitor瀵硅薄闆嗗悎锛屽皾璇曡幏鍙栨瘡涓璞$殑閿侊紝杩欎釜娑堟伅妫€娴嬭繃绋嬪氨鏄湪HeartbeatHandler锛堜互涓嬬畝绉扳€淗H鈥濓級涓疄鐜扮殑銆傞渶瑕佹敞鎰忕殑鏄紝HH缁戝畾鐨勬槸ST绾跨▼锛孲T浣滀负绯荤粺杩涚▼鐨勪富绾跨▼鎵ц妫€娴嬫搷浣溿€?/p>

3. Monitor鍜岃鐩戞帶鐨勬湇鍔″璞?/p>

聽 聽 聽 聽聽WD鐩戞帶鐨勬槸绯荤粺杩涚▼涓嚑涓叧閿殑鏈嶅姟瀵硅薄锛屽杩欑被瀵硅薄杩涜鎶借薄瀹氫箟锛屼究鏈変簡Monitor鎺ュ彛锛屽畠鍙湁涓€涓猰onitor鏂规硶銆俉D瀵瑰疄鐜颁簡姝ゆ帴鍙g殑瀵硅薄杩涜鐩戞帶锛屽叾鍐呴儴鏈変竴涓瓨鏀綧onitor瀵硅薄鐨勯泦鍚堬紝浠讳綍瀵硅薄鍙瀹炵幇浜哅onitor鎺ュ彛锛屽苟涓旈€氳繃WD鐨刟ddMonitor鏂规硶娉ㄥ唽杩涢泦鍚堝嵆鍙鐩戞帶銆?/p>

聽 聽 聽 聽聽鍦℅ingerBread涔嬪墠锛岃鐩戞帶鏈嶅姟瀵硅薄鍙?lt;!-- 纭涓€涓嬫槸鍚︽槸浠?.3寮€濮嬬殑 -->鏈堿ctivityManagerService銆乄indowManagerService鍜孭owerManagerService锛屽湪姝や箣鍚庡張澧炲姞浜?涓紝鍒嗗埆鏄疦etworkManagementService銆丮ountService銆丯ativeDaemonConnector鍜孖nputManager銆?/p>

聽 聽 聽 聽聽Monitor鎺ュ彛鐨勫疄鐜版柟娉曞緢绠€鍗曪紝渚嬪AMS鐨勫疄鐜帮細

ActivityManagerService.java 鈫?monitor()

publicvoid monitor() {

聽 聽 聽 聽聽synchronized (this) { }

}

聽 聽 聽 聽聽鍙互鐪嬪埌鎵€璋撶殑鈥滅洃鎺ф湇鍔″璞♀€濓紝璇寸櫧浜嗗氨鏄杩欎簺瀵硅薄杩涜姝婚攣妫€娴嬶紝濡傛灉鑳藉椤哄埄鐨勮幏寰楄鐩戞帶瀵硅薄鐨勯攣鍒欒涓虹郴缁熻繍琛屾甯革紝濡傛灉闀挎椂闂存病鏈夎幏寰楀垯璁や负绯荤粺澶勪簬鍋滄粸鐘舵€侊紝闇€瑕侀噰鍙栨帾鏂戒簡銆?/p>

4. RebootReceiver鍜孯ebootRequestReceiver



3.2.3 Watchdog宸ヤ綔娴佺▼

聽 聽 聽 聽聽WD鐨勫伐浣滄祦绋嬩富瑕佸氨鏄疻D绾跨▼鍜孒H绾跨▼涔嬮棿鐨勪氦浜掞紝鍏堜粠WD鐨剅un鏂规硶鐪嬭捣銆?/p>

Watchdog.java 鈫?run()

publicvoid run() {

聽 聽 聽 聽聽boolean waitedHalf = false;//鉃€璁板綍鏄惁宸茬粡绛夊緟浜嗕竴鍗?/p>

聽 聽 聽 聽聽while (true) {

聽 聽 聽 聽聽mCompleted = false;//鐢ㄤ竴涓竷灏斿彉閲忔爣璁版槸鍚﹀畬鎴愭閿佹娴?/p>

聽 聽 聽 聽聽//鉃佸悜HH鍙戦€佹娴嬩俊鍙凤紝瀹冩槸鍦⊿T绾跨▼涓墽琛岀殑

聽 聽 聽 聽聽mHandler.sendEmptyMessage(MONITOR);

聽 聽 聽 聽聽synchronized (this) {

聽 聽 聽 聽聽//鍙戦€佹娴嬩俊鍙峰悗浼氱瓑寰呮娴嬫搷浣滃畬鎴愶紝绛夊緟鏃堕棿鍦ㄦ甯歌繍琛岀殑鎯呭喌涓嬫槸30绉?/p>

聽 聽 聽 聽聽long timeout = TIME_TO_WAIT;

聽 聽 聽 聽聽long start = SystemClock.uptimeMillis();

聽 聽 聽 聽聽while (timeout > 0 && !mForceKillSystem) {

聽 聽 聽 聽聽try {

聽 聽 聽 聽聽 聽 聽 聽聽聽wait(timeout);

聽 聽 聽 聽聽聽 聽 聽 聽聽... ...

聽 聽 聽 聽聽}

.聽 聽 聽 聽聽.. ...

聽 聽 聽 聽聽閫氳繃浠ヤ笂浠g爜鍙互鐭ラ亾锛岀洃鎺ц繃绋嬪氨鏄竴涓寰幆锛屾瘡娆″惊鐜兘浼氬仛涓€杞閿佹娴嬨€傛湁涓や釜闇€瑕佹敞鎰忕殑鐐癸紝璇存槑濡備笅锛?/p>

鉃€聽WD鐨勮繖涓€滃畾鏃跺櫒鈥濇瘡杞娴嬬殑瓒呮椂鏃堕棿鏄?0绉掞紝浣嗘槸30绉掕秴鏃跺悗WD骞朵笉浼氶┈涓婇噸鍚郴缁燂紝鑰屾槸灏唚aitedHalf璁剧疆涓簍rue锛岃涓哄彧鏄瓑寰呬簡涓€鍗婄殑鏃堕棿锛屼篃灏辨槸璇碬D鎯冲缁欓偅涓閿佷綇鐨勫璞′竴娆℃満浼氾紝鍋氫袱杞娴嬶紝濡傛灉浠嶇劧瓒呮椂鍐嶆潃涔熶笉鏅氥€俉D杩樻槸寰堟湁浜烘儏鍛崇殑锛屽悗闈細鐪嬪埌waitedHalf浣曟椂琚缃负true鐨勩€?/p>

鉃伮犳瘡杞殑妫€娴嬫搷浣滀笉鏄敱WD绾跨▼鑷繁瀹屾垚鐨勶紝鑰屾槸鍙戦€佷竴涓秷鎭粰HH锛岀敱HH鎵€缁戝畾鐨凷T绾跨▼瀹屾垚銆傚畠鏄€庝箞鍋氱殑鍛紵鎺ヤ笅鏉ヨ浆鍒癏H涓€鎺㈢┒绔熴€?/p>

finalclass HeartbeatHandler extends Handler {

聽 聽 聽 聽聽... ...

聽 聽 聽 聽聽caseMONITOR: {

聽 聽 聽 聽聽... ...

聽 聽 聽 聽聽finalint size = mMonitors.size();

聽 聽 聽 聽聽for (int i = 0 ; i < size ; i++) {

聽 聽 聽 聽聽 聽 聽 聽聽聽//璁板綍涓嬪綋鍓嶆鍦ㄨ妫€娴嬬殑Monitor瀵硅薄锛岃繖寰堥噸瑕?/p>

聽 聽 聽 聽聽聽 聽 聽 聽聽mCurrentMonitor = mMonitors.get(i);

聽 聽 聽 聽聽聽 聽 聽 聽聽mCurrentMonitor.monitor();//妫€娴嬫閿?/p>

聽 聽 聽 聽聽}

聽 聽 聽 聽聽synchronized (Watchdog.this) {

聽 聽 聽 聽聽聽 聽 聽 聽聽mCompleted = true;//鏍囪妫€娴嬪畬鎴愶紝WD绾跨▼浼氱敤姝ゅ垽鏂槸鍚﹀畬鎴?/p>

聽 聽 聽 聽聽聽 聽 聽 聽聽mCurrentMonitor = null;

聽 聽 聽 聽聽... ...

聽 聽 聽 聽聽閫昏緫寰堢畝鍗曪紝涓嶅瑙i噴锛屽彧鏄鐣欐剰HH鍋氬畬姝婚攣妫€娴嬪悗娌℃湁鐢╪otifyAll鍞ら啋WD绾跨▼锛屾墍浠ユ甯告儏鍐典笅WD绾跨▼浼氬湪瓒呮椂鍚庡啀缁х画涓嬩竴杞娴嬨€侶H姣旇緝浼氬伔鎳掋€?/p>

鎺ヤ笅鏉ュ張鍥炲埌WD绾跨▼銆?/p>

聽 聽 聽 聽聽... ... //WD绾跨▼缁撴潫wait绛夊緟

聽 聽 聽 聽聽if (mCompleted && !mForceKillSystem) {

聽 聽 聽 聽聽聽 聽 聽 聽聽//濡傛灉妫€娴嬫垚鍔燂紝鍒欓噸缃畐aitedHalf鏍囪锛岀户缁笅涓€杞娴?/p>

聽 聽 聽 聽聽聽 聽 聽 聽聽waitedHalf = false;

聽 聽 聽 聽聽聽 聽 聽 聽聽continue;

聽 聽 聽 聽聽}

聽 聽 聽 聽聽if (!waitedHalf) {

聽 聽 聽 聽聽聽 聽 聽 聽聽//鎵ц鍒拌繖閲岋紝璇存槑妫€娴嬭繃绋嬮樆濉炰簡锛屾病鏈夊畬鎴愶紝骞朵笖waitedHalf涓篺alse锛岃鏄?/p>

聽 聽 聽 聽聽 聽 聽 聽聽聽//杩欐槸姝婚攣妫€娴嬪け璐ョ殑绗竴杞娴嬨€傞€氳繃AMS灏嗙郴缁熻繘绋嬩腑鍚勪釜绾跨▼鐨勫嚱鏁拌皟鐢ㄦ爤

聽 聽 聽 聽聽聽 聽 聽 聽聽//杈撳嚭鍒?data/anr/traces.txt鏂囦欢涓紝鍚屾椂涔熶細杈撳嚭鍑犱釜閲嶈鐨刵ative杩涚▼鐨?/p>

聽 聽 聽 聽聽聽 聽 聽 聽聽//backtrace锛屼互渚挎彁渚涙洿澶氫俊鎭潵瀹氫綅闂锛屽洜涓篔ava灞傜殑闃诲寰堟湁鍙兘鏄痭ative

聽 聽 聽聽聽 聽 聽 聽聽聽聽//灞傜殑闃诲閫犳垚鐨勩€?/p>

聽 聽 聽 聽聽聽 聽 聽 聽聽ArrayList<Integer> pids = new ArrayList<Integer>();

聽 聽 聽 聽聽聽 聽 聽 聽聽pids.add(Process.myPid());

聽 聽 聽 聽聽聽 聽 聽 聽聽ActivityManagerService.dumpStackTraces(true, pids, null, null,

聽 聽 聽 聽聽聽 聽 聽 聽聽聽 聽 聽 聽聽NATIVE_STACKS_OF_INTEREST);

聽 聽 聽 聽聽聽 聽 聽 聽聽waitedHalf = true;//璁剧疆涓簍rue锛岃鏄嶹D绾跨▼绛変簡涓€杞簡

聽 聽 聽 聽聽聽 聽 聽 聽聽continue;//鍐嶆潵涓€杞紝缁欎釜鏈轰細

聽 聽 聽 聽聽}

聽 聽 聽 聽聽濡傛灉鎺ヤ笅鏉ョ殑绗簩杞閿佹娴嬩粛鐒跺け璐ワ紝鍒欎笂杩扮殑浠g爜灏变笉浼氭墽琛岋紝缁х画寰€涓嬭蛋銆?/p>

聽 聽 聽 聽聽//姝ゅ悗渚挎槸涓轰簡鑳藉鏂逛究鍒嗘瀽姝婚攣鍘熷洜锛岃€岃緭鍑虹殑鍚勭绫诲瀷鐨勬棩蹇椾俊鎭?/p>

聽 聽 聽 聽聽final String name = (mCurrentMonitor != null) ?

聽 聽 聽 聽聽mCurrentMonitor.getClass().getName() : "null";

聽 聽 聽 聽聽//鉃€璁板綍姝e湪鎵ц姝婚攣妫€娴嬬殑瀵硅薄

聽 聽 聽 聽聽EventLog.writeEvent(EventLogTags.WATCHDOG, name);

聽 聽 聽 聽聽//鉃佸啀娆¤緭鍑虹郴缁熻繘绋嬬殑鍑芥暟鏍堜俊鎭?/p>

聽 聽 聽 聽聽ArrayList<Integer> pids = new ArrayList<Integer>();

聽 聽 聽 聽聽pids.add(Process.myPid());

聽 聽 聽 聽聽//鍚屾椂杈撳嚭com.android.phone杩涚▼鐨勫嚱鏁版爤锛屽洜涓虹數璇濈郴缁熷浜庢墜鏈烘潵璇存槸鏈€閲嶈鐨?/p>

聽 聽 聽 聽聽//妯″潡锛岃嚜鐒惰閲嶇偣瀵瑰緟

聽 聽 聽 聽聽if (mPhonePid > 0) pids.add(mPhonePid);

聽 聽 聽 聽聽final File stack = ActivityManagerService.dumpStackTraces(

聽 聽 聽 聽聽聽 聽 聽 聽聽!waitedHalf, pids, null, null, NATIVE_STACKS_OF_INTEREST);

聽 聽 聽 聽聽... ...

聽 聽 聽 聽聽if (RECORD_KERNEL_THREADS) {

聽 聽 聽 聽聽聽 聽 聽 聽聽dumpKernelStackTraces();//杈撳嚭涓€閮ㄥ垎Kernel鐨勪俊鎭府鍔╁畾浣嶉棶棰?/p>

聽 聽 聽 聽聽}

聽 聽 聽 聽聽... ...

聽 聽 聽 聽聽//鉃傚湪涓€涓瓙绾跨▼涓緭鍑哄埌DropBox涓?/p>

聽 聽 聽 聽聽mActivity.addErrorToDropBox(

聽 聽 聽 聽聽聽 聽 聽 聽聽"watchdog", null, "system_server", null, null,

聽 聽 聽 聽聽聽 聽 聽 聽聽name, null, stack, null);

聽 聽 聽 聽聽... ...

聽 聽 聽 聽聽//濡傛灉璋冭瘯鍣ㄦ病鏈夐摼鎺ュ垯鐩存帴閫€鍑鸿繘绋?/p>

聽 聽 聽 聽聽if (!Debug.isDebuggerConnected()) {

聽 聽 聽 聽聽聽 聽 聽 聽聽Slog.w(TAG, "*** WATCHDOG KILLING SYSTEM PROCESS: " + name);

聽 聽 聽 聽聽聽 聽 聽 聽聽Process.killProcess(Process.myPid());

聽 聽 聽 聽聽聽 聽 聽 聽聽System.exit(10);

聽 聽 聽 聽聽} else {//濡傛灉姝e湪Debug锛岄偅浣犲氨鍙互鏂偣璋冭瘯浜?/p>

聽 聽 聽 聽聽... ...

鏈変笁涓叧閿偣闇€瑕佹敞鎰忥細

鉃€聽璁板綍姝e湪鎵ц姝婚攣妫€娴嬬殑瀵硅薄锛屽鏋渘ame涓衡€漬ull鈥濓紝鍏跺疄灏辩浉褰撲簬ServerThread绾跨▼杩樻病鏈夋墽琛孒H鐨刪andleMessage鏂规硶锛屽氨鍦ㄥ叾浠栧湴鏂归樆濉炰簡銆傛墍浠ヨ鐗瑰埆娉ㄦ剰锛屽鏋滃湪鍒嗘瀽trace淇℃伅鏃跺彂鐜版病鏈夊洜涓鸿妫€娴嬬殑鍏抽敭鏈嶅姟瀵硅薄鑰屽彂鐢熼樆濉烇紝閭d箞灏遍渶瑕佺湅鐪婼erverThread绾跨▼鐨勫嚱鏁拌皟鐢ㄦ爤锛岀‘瀹氱湡姝g殑闃诲鍘熷洜銆?/p>

鉃伮犲湪杩涜绯荤粺閲嶅惎鍓嶄細鍋氫袱杞閿佹娴嬶紝绗竴杞細鏂板缓traces.txt鏂囦欢锛屼絾绗簩杞細鍦ㄥ師鏈夋枃浠剁殑鍩虹涓婄画鍐欙紝鎵€浠ヤ綘浼氬湪trace淇℃伅涓湅鍒颁袱娆$郴缁熻繘绋嬪悇涓嚎绋嬬殑鍑芥暟璋冪敤鏍堜俊鎭€?/p>

鉃偮犲湪涓€涓瓙绾跨▼涓緭鍑哄埌DropBox涓紝鎵€浠ュ鏋滆繖娆′繚瀛樺湪traces.txt涓殑姝婚攣淇℃伅娌℃湁鏉ュ緱鍙婃煡鐪嬪氨琚鐩栦簡锛岄偅涔堝彲浠ュ埌/data/system/dropbox鐩綍涓嬫壘鍒拌繖娆℃棩蹇楃殑澶囦唤銆?/p>

Watchdog鐨勫疄鐜拌鐧戒簡鍏跺疄灏辨槸鍦ㄤ竴涓嚎绋嬩腑寤虹珛娑堟伅寰幆锛岄€氳繃Message鍜屾垚鍛樺彉閲忓湪绾跨▼闂磋繘琛岄€氳锛岃繖鍜孒andler鏈哄埗鐨勬湰璐ㄦ槸涓€鏍风殑銆?/p>

鑷虫锛學D鐨勫伐浣滄祦绋嬩粙缁嶅畬浜嗭紝杩樼畻姣旇緝绠€鍗曪紝鍦ㄦ湰绔犵殑鏈€鍚庨檮涓婁簡WD鐨勬祦绋嬪浘銆傛帴涓嬫潵浼氫粙缁嶄竴浜沇D妫€娴嬪埌姝婚攣鍚庡鑷撮噸鍚殑闂鐨勫垎鏋愭柟娉曪紝瀵逛簬Android绯荤粺宸ョ▼甯堟潵璇达紝澶勭悊杩欑被闂鑲畾鏄甯镐究楗簡銆?/p>

3.3 Watchdog寮曡捣鐨勯噸鍚棶棰樺垎鏋愭柟娉?/span> 聽 3.3.1 琚洃娴嬪璞℃閿?/h5>

(寰呯画)

3.3.2 ServerThread绾跨▼闃诲

(寰呯画)

Watchdog鐨勬祦绋嬪浘




    
[2] QQ跟新浪帐号授权登录
    来源: 互联网  发布时间: 2014-02-18
QQ和新浪帐号授权登录
package p.wy.hc.activity;


import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;

import p.wy.hc.bean.SharedPreferencesForLogin;
import p.wy.hc.util.JsonUtils;
import p.wy.hc.util.UpdateManager;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Handler.Callback;
import android.os.Looper;
import android.os.Message;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;
import cn.sharesdk.framework.AbstractWeibo;
import cn.sharesdk.framework.WeiboActionListener;
import cn.sharesdk.sina.weibo.SinaWeibo;
import cn.sharesdk.tencent.qzone.QZone;

/**
 * @author yangyu
 *	功能描述:获取用户资料
 * 
 * 启动页面时传递一个int类型的字段type,用于标记获取自己的资料(type = 0)还是别人的资料(type = 1)。
 * 如果尝试获取别人的资料,示例代码会获取不同平台Share SDK的官方帐号的资料。
 * 
 * 如果资料获取成功,会通过{@link ShowInforPage}展示
 */
public class MainActivity  extends Activity implements Callback, OnClickListener,WeiboActionListener {
	
	//定义标题栏布局对象
//	private TitleLayout llTitle;
	
	private Button sinaBt,qzoneBt,logonBt;
	
	private TextView user_phone,user_psw,user_reg;
	private Handler handler;
	
	Message message = null;  
	private static final int DISMISS_PROGRESS_DIALOG = 1;  
	private ProgressDialog progressDialog = null; 
	private Button nextBt;
	private String userName;
	private String userPsw;
	private String flag="false"; //true 为登录成功
	private SharedPreferencesForLogin spflusrinfo;
	private String url;

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
			
		//初始化ShareSDK
		AbstractWeibo.initSDK(this);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		handler = new Handler(this);
		setContentView(R.layout.logon_main);
//		setContentView(R.layout.logonmain);
		spflusrinfo= new SharedPreferencesForLogin(MainActivity.this,"shared_prefsusrinfo"); //user logon type			
		initView();
		
		initData();
		
		// 检查软件更新
		UpdateManager manager = new UpdateManager(MainActivity.this);
		manager.checkUpdate();
		
		initUser();
	}
	//查看本地是否有用户信息,有的话直接跳转到主页
	public void initUser(){
		String userinfo=spflusrinfo.getValue("usrinfo");
		
	}
	/**
	 * 初始化组件
	 */
	private void initView(){
		//得到按钮对象
		/******
		sinaBt    = (Button) findViewById(R.id.sina_id);
		qzoneBt   = (Button) findViewById(R.id.qq_id);
		
		user_phone=(TextView)findViewById(R.id.user_phone_number);
		user_psw=(TextView)findViewById(R.id.user_phone_psw);
		user_reg=(TextView)findViewById(R.id.user_reg);
		logonBt=(Button)findViewById(R.id.logon_btn);
		*****/
		sinaBt    = (Button) findViewById(R.id.sina_logon);
		qzoneBt   = (Button) findViewById(R.id.qq_logon);
	
	}

	
	/**
	 * 初始化数据
	 */
	private void initData(){	
		//设置监听
		sinaBt.setOnClickListener(this);
		qzoneBt.setOnClickListener(this);
		
		/****
		user_phone.setOnClickListener(this);
		user_reg.setOnClickListener(this);
		logonBt.setOnClickListener(this);
		
		user_phone.setOnFocusChangeListener(new OnFocusChangeListener() {
			
			@Override
			public void onFocusChange(View v, boolean hasFocus) {
				// TODO Auto-generated method stub
				user_phone.setBackgroundResource(R.drawable.aabb2);
				user_psw.setBackgroundResource(R.drawable.m);
			}
		});
		user_psw.setOnFocusChangeListener(new OnFocusChangeListener() {
			
			@Override
			public void onFocusChange(View v, boolean hasFocus) {
				// TODO Auto-generated method stub
				user_psw.setBackgroundResource(R.drawable.aabb1);
				user_phone.setBackgroundResource(R.drawable.n);
				user_psw.setText("");
			}
		});
		*****/
		
	}
	
	/**
	 * 点击按钮获取授权用户的资料
	 */
	@Override
	public void onClick(View v) {
		String name = null;	
		switch (v.getId()) {
		case R.id.sina_logon:
			name = SinaWeibo.NAME;
			break;
		case R.id.qq_logon:
			name = QZone.NAME;
			break;
		/***************
		switch (v.getId()) {
		case R.id.sina_id:
			name = SinaWeibo.NAME;
			break;
		case R.id.qq_id:
			name = QZone.NAME;
			break;
			
		case R.id.user_phone_number:
			user_phone.setBackgroundResource(R.drawable.aabb2);
			user_psw.setBackgroundResource(R.drawable.m);
			user_phone.setText("");
			break;
//		case R.id.user_phone_psw:
//			user_psw.setBackgroundResource(R.drawable.aabb1);
//			user_phone.setBackgroundResource(R.drawable.n);
//			user_psw.setText("");
//			break;
		case R.id.user_reg:
			Intent intentreg = new Intent();
			intentreg.setClass(MainActivity.this, RegisterInfoActivity.class);
			startActivity(intentreg);
			break;
		case R.id.logon_btn:
			userName=user_phone.getText().toString();
			userPsw=user_psw.getText().toString();
			Toast.makeText(MainActivity.this, "登录",Toast.LENGTH_SHORT).show();
			/*****
			new Thread(runnablelogon).start();
			if(flag.equals("true")){
				//登录成功跳转
				Intent intent = new Intent();
				intent.setClass(MainActivity.this, HealthCheckActivity.class);
				intent.putExtra("userName", userName);
				startActivity(intent);
			}else{
				//登录失败
				Toast.makeText(MainActivity.this, "登录失败",Toast.LENGTH_SHORT).show();
			}

			break;
			
			*****/
		}	
		
		if (name != null) {
			AbstractWeibo weibo = AbstractWeibo.getWeibo(this, name);
			weibo.setWeiboActionListener(this);
			String account = null;
			weibo.showUser(account);
			HealthCheckApplication hca=(HealthCheckApplication)this.getApplication();
			hca.weibo=weibo;
		}
	}

	/*****
	//登录验证
	private Runnable runnablelogon = new Runnable() {
		public void run() {
			Map<String, String> map = new HashMap<String, String>();
			map.put("username", userName);
			map.put("pwd", userPsw);
			map.put("dtype", "18");
			String result=HttpClientUtil.getResultData(CDefault.LOGON_URL, map);
			flag=FileUtil.getJSON(result, "authkey");  //true 为登录成功
			
		}
	};
	*****/
	public void onComplete(AbstractWeibo weibo, int action,HashMap<String, Object> res) {
		Message msg = new Message();
		msg.arg1 = 1;
		msg.arg2 = action;
		msg.obj = weibo;
		handler.sendMessage(msg);
		
		Message msg2 = new Message();
		if(weibo.getDb().getWeiboNname().equals("QZone")){
			msg2.what = 2;
		}else if(weibo.getDb().getWeiboNname().equals("SinaWeibo")){
			msg2.what = 1;
		}
		JsonUtils ju = new JsonUtils();
		String json = ju.fromHashMap(res);
		msg2.obj = ju.format(json);
		handler.sendMessage(msg2);
	}

	public void onError(AbstractWeibo weibo, int action, Throwable t) {
		t.printStackTrace();
		
		Message msg = new Message();
		msg.arg1 = 2;
		msg.arg2 = action;
		msg.obj = weibo;
		handler.sendMessage(msg);
	}

	public void onCancel(AbstractWeibo weibo, int action) {
		Message msg = new Message();
		msg.arg1 = 3;
		msg.arg2 = action;
		msg.obj = weibo;
		handler.sendMessage(msg);
	}
	
	/** 处理操作结果 */
	public boolean handleMessage(Message msg) {
		
		switch(msg.what) {
			case 1: {
				try {
					SharedPreferencesForLogin spflsina = new SharedPreferencesForLogin(this,"shared_prefssina");
					String userdata=spflsina.getValue("strsina");
					if(userdata!=null){
						Intent intent = new Intent();
						intent.setClass(MainActivity.this, HealthCheckActivity.class);
						String[] userInfo=userdata.split(",");
						intent.putExtra("userName", userInfo[0]);
						intent.putExtra("userIamage", userInfo[1]);
						url=userInfo[1];
						new ShowImgThread().start();
						//intent.putExtra("userIamage", userImg);
						intent.putExtra("weiboData", "SinaWeibo");
						spflusrinfo.putValue("Logon_Sina", "SinaWeibo");
						spflusrinfo.putValue("Logon_QQ", null);
						startActivity(intent);
					}else{
						Intent i = new Intent(this, ShowInforActivity.class);
						i.putExtra("data", String.valueOf(msg.obj));
						i.putExtra("weiboData", "SinaWeibo");
						spflusrinfo.putValue("Logon_Sina", "SinaWeibo");
						spflusrinfo.putValue("Logon_QQ", null);
						startActivity(i);
					}
				} catch (Exception e) {
					// TODO: handle exception
					e.printStackTrace();
				}
			}
			break;
			case 2: {
				try {
					SharedPreferencesForLogin spflqq = new SharedPreferencesForLogin(this,"shared_prefsqq");
					String userdata=spflqq.getValue("strqq");
					if(userdata!=null){
						System.out.println(userdata); //直接跳转
						Intent intent = new Intent();
						intent.setClass(MainActivity.this, HealthCheckActivity.class);
						String[] userInfo=userdata.split(",");
						intent.putExtra("userName", userInfo[0]);
						intent.putExtra("userIamage", userInfo[1]);
						new ShowImgThread().start();
						intent.putExtra("weiboData", "QZone");
						//intent.putExtra("userIamage", userImg);
						spflusrinfo.putValue("Logon_Sina", null);
						spflusrinfo.putValue("Logon_QQ", "QZone");
						startActivity(intent);
						url=userInfo[1];
						new ShowImgThread().start();
					}else{
						Intent i = new Intent(this, ShowInforActivity.class);
						i.putExtra("data", String.valueOf(msg.obj));
						i.putExtra("weiboData", "QZone");
						spflusrinfo.putValue("Logon_Sina", null);
						spflusrinfo.putValue("Logon_QQ", "QZone");
						startActivity(i);
					}
				} catch (Exception e) {
					// TODO: handle exception
					e.printStackTrace();
				}
			}
			break;
			default: {
				AbstractWeibo weibo = (AbstractWeibo) msg.obj;
				String text = MainActivity.actionToString(msg.arg2);
				switch (msg.arg1) {
					case 1: { // 成功
						text = weibo.getName() + " completed at " + text;
					}
					break;
					case 2: { // 失败
						text = weibo.getName() + " caught error at " + text;
					}
					break;
					case 3: { // 取消
						text = weibo.getName() + " canceled at " + text;
					}
					break;
				}
				//Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
			}
			break;
		}
		return false;
	}

	/**
	 * 将action转换为String
	 */
	public static String actionToString(int action) {
		switch (action) {
			case AbstractWeibo.ACTION_AUTHORIZING: return "ACTION_AUTHORIZING";
			case AbstractWeibo.ACTION_GETTING_FRIEND_LIST: return "ACTION_GETTING_FRIEND_LIST";
			case AbstractWeibo.ACTION_FOLLOWING_USER: return "ACTION_FOLLOWING_USER";
			case AbstractWeibo.ACTION_SENDING_DIRECT_MESSAGE: return "ACTION_SENDING_DIRECT_MESSAGE";
			case AbstractWeibo.ACTION_TIMELINE: return "ACTION_TIMELINE";
			case AbstractWeibo.ACTION_USER_INFOR: return "ACTION_USER_INFOR";
			case AbstractWeibo.ACTION_SHARE: return "ACTION_SHARE";
			default: {
				return "UNKNOWN";
			}
		}
	}
	
	
	/**监听对话框里面的button点击事件*/  
    DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener()  
    {  
        public void onClick(DialogInterface dialog, int which)  
        {  
            switch (which)  
            {  
            case AlertDialog.BUTTON_POSITIVE:// "确认"按钮退出程序  
            	finish();  
            	  //这里处理退出前跳到首个加载界面后执行下面的退出
				Intent intent = new Intent();
				intent.setClass(MainActivity.this, MainActivity.class);
				startActivity(intent);
				// 退出程序
				Intent mHomeIntent = new Intent(
						Intent.ACTION_MAIN);
				mHomeIntent.addCategory(Intent.CATEGORY_HOME);
				mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
				startActivity(mHomeIntent);
				// 第二次关闭
				android.os.Process
				.killProcess(android.os.Process.myPid());

                break;  
            case AlertDialog.BUTTON_NEGATIVE:// "取消"第二个按钮取消对话框  
                break;  
            default:  
                break;  
            }  
        }  
    };    
    @Override  
    public boolean onKeyDown(int keyCode, KeyEvent event)  
    {  
        if (keyCode == KeyEvent.KEYCODE_BACK )  
        {  
            // 创建退出对话框  
            AlertDialog isExit = new AlertDialog.Builder(this).create();  
            // 设置对话框标题  
            isExit.setTitle("系统提示");  
            // 设置对话框消息  
            isExit.setMessage("确定要退出吗");  
            // 添加选择按钮并注册监听  
            isExit.setButton("确定", listener);  
            isExit.setButton2("取消", listener);  
            // 显示对话框  
            isExit.show();  
        }  
        return false;  
          
    }
    
    private class ShowImgThread extends Thread
    {
    	@Override
    	public void run()
    	{
    		Looper.prepare();

    		returnBitMap(url);

    		Looper.loop();
    	}

    };	
    //获取网络图片
    public void returnBitMap(String url) {   
    	URL myFileUrl = null;   
    	Bitmap bitmap = null;   
    	try {   
    		myFileUrl = new URL(/blog_article/url/index.html);   
    	} catch (MalformedURLException e) {   
    		e.printStackTrace();   
    	}   
    	try {   
    		if(myFileUrl!=null){
    			HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();   
    			conn.setDoInput(true);   
    			conn.connect();   
    			InputStream is = conn.getInputStream();   
    			bitmap = BitmapFactory.decodeStream(is);   
    			is.close();  
    		}
    	} catch (IOException e) {   
    		e.printStackTrace();   
    	}   
    	HealthCheckApplication applictaion=(HealthCheckApplication)this.getApplication();
    	
    	if(spflusrinfo.getValue("Logon_Sina")==null){
    		applictaion.mHeadBmQQ=bitmap;
    	}else{
    		applictaion.mHeadBmSina=bitmap;
    	}
//    	mHandler.sendEmptyMessage(DOWNLOAD_FINISH);
    } 
}






源码下载地址 :http://www.32666.com/file-600256.html


    
[3] java 栈内存储器解惑
    来源: 互联网  发布时间: 2014-02-18
java 栈内存解惑
int j = 0;
         j = j++;
         //由于是虚拟机的问题, j 初始为0, 先给j 赋值为0, 然后 j的新的地址已经改变了,然后再给老的j+1; 但是新的j的值依然为0
         System.out.println(j);//0
         System.out.println(j);//0
        
         int i = j;
         System.out.println(i);//0

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3