锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
ADB鍏ㄧОAndroid Debug Bridge, 鏄痑ndroid sdk閲岀殑涓涓伐鍏? 鐢ㄨ繖涓伐鍏峰彲浠ョ洿鎺ユ搷浣滅鐞哸ndroid妯℃嫙鍣ㄦ垨鑰呯湡瀹炵殑andriod璁懼(濡侴1鎵嬫満).
瀹冪殑涓昏鍔熻兘鏈?
•榪愯璁懼鐨剆hell(鍛戒護琛?
•綆$悊妯℃嫙鍣ㄦ垨璁懼鐨勭鍙f槧灝?
•璁$畻鏈哄拰璁懼涔嬮棿涓婁紶/涓嬭澆鏂囦歡
•灝嗘湰鍦癮pk杞歡瀹夎鑷蟲ā鎷熷櫒鎴朼ndroid璁懼
ADB鏄竴涓?瀹㈡埛绔?鏈嶅姟鍣ㄧ 紼嬪簭, 鍏朵腑瀹㈡埛绔槸浣犵敤鏉ユ搷浣滅殑鐢佃剳, 鏈嶅姟鍣ㄧ鏄痑ndroid璁懼.
鍏堣瀹夎鏂規硶, 鐢佃剳涓婇渶瑕佸畨瑁呭鎴風. 瀹㈡埛绔寘鍚湪sdk閲? 璁懼涓婁笉闇瑕佸畨瑁? 鍙渶瑕佸湪鎵嬫満涓婃墦寮閫夐」settings-applications-development-USB debugging.
瀵逛簬Mac鍜孡inux鐢ㄦ埛, 涓嬭澆濂界殑sdk瑙e帇鍚? 鍙互鏀緙鎴栬呬換鎰忕洰褰? 鐒跺悗淇敼~/.bash_profile鏂囦歡, 璁劇疆榪愯鐜鎸囧悜sdk鐨則ools鐩綍.
鍏蜂綋鏄墦寮~/.bash_profile鏂囦歡(濡傛灉娌℃湁姝ゆ枃浠朵篃鍙互鑷娣誨姞), 鍦ㄩ噷闈㈠姞鍏ヤ竴琛?
export PATH=${PATH}:<浣犵殑sdk鐩綍>/tools
渚嬪錛?/p>
鐒跺悗灝卞彲浠ヤ嬌鐢╝db鍛戒護浜?
瀚屽畨瑁呴夯鐑︾殑鍚屽鍏跺疄涔熷彲浠ョ渷鍘諱笂闈㈠畨瑁呮楠? 鐩存帴杈撳叆瀹屾暣璺緞鏉ヤ嬌鐢ㄥ懡浠? 渚嬪:
瀵逛簬windows xp鐢ㄦ埛, 闇瑕佸厛瀹夎usb椹卞姩, 鐒跺悗濡傛灉浣犲彧鎵撶畻浣跨敤adb鑰屼笉鎯充笅杞芥暣涓猻dk鐨勮瘽, 鍙互涓嬭澆榪欎釜鍗曠嫭鐨刟db宸ュ叿鍖?涓嬭澆鍚庤В鍘? 鎶婇噷闈?adb.exe 鍜?AdbWinApi.dll 涓や釜鏂囦歡鏀懼埌緋葷粺鐩樼殑 windows/system32 鏂囦歡澶歸噷灝卞彲浠ヤ簡.
鐜板湪璇翠笅ADB甯哥敤鐨勫嚑涓懡浠?br>1. 鏌ョ湅璁懼
•adb devices
榪欎釜鍛戒護鏄煡鐪嬪綋鍓嶈繛鎺ョ殑璁懼, 榪炴帴鍒拌綆楁満鐨刟ndroid璁懼鎴栬呮ā鎷熷櫒灝嗕細鍒楀嚭鏄劇ず
2. 瀹夎杞歡
•adb install <apk鏂囦歡璺緞>
榪欎釜鍛戒護灝嗘寚瀹氱殑apk鏂囦歡瀹夎鍒拌澶囦笂
3. 鍗歌澆杞歡
•adb uninstall <杞歡鍚?gt;
•adb uninstall -k <杞歡鍚?gt;
濡傛灉鍔?-k 鍙傛暟,涓哄嵏杞借蔣浠朵絾鏄繚鐣欓厤緗拰緙撳瓨鏂囦歡.
4. 鐧誨綍璁懼shell
•adb shell
•adb shell <command鍛戒護>
榪欎釜鍛戒護灝嗙櫥褰曡澶囩殑shell.
鍚庨潰鍔?lt;command鍛戒護>灝嗘槸鐩存帴榪愯璁懼鍛戒護, 鐩稿綋浜庢墽琛岃繙紼嬪懡浠?/p>
5. 浠庣數鑴戜笂鍙戦佹枃浠跺埌璁懼
•adb push <鏈湴璺緞> <榪滅▼璺緞>
鐢╬ush鍛戒護鍙互鎶婃湰鏈虹數鑴戜笂鐨勬枃浠舵垨鑰呮枃浠跺す澶嶅埗鍒拌澶?鎵嬫満)
6. 浠庤澶囦笂涓嬭澆鏂囦歡鍒扮數鑴?
•adb pull <榪滅▼璺緞> <鏈湴璺緞>
鐢╬ull鍛戒護鍙互鎶婅澶?鎵嬫満)涓婄殑鏂囦歡鎴栬呮枃浠跺す澶嶅埗鍒版湰鏈虹數鑴?/p>
7. 鏄劇ず甯姪淇℃伅
•adb help
榪欎釜鍛戒護灝嗘樉紺哄府鍔╀俊鎭?/p>
8. 鏇村android鍛戒護浣跨敤鏂規硶,璇峰弬鑰冩垜鐨勫彟涓綃囧崥鏂?android鍛戒護瀹炴垬鎵嬪唽
鍏堢畝鍗曡璇碬idget鐨勫師鐞嗐俉idget鏄湪妗岄潰涓婄殑涓鍧楁樉紺轟俊鎭殑涓滆タ錛屼篃閫氳繃鍗曞嚮Widget璺寵漿鍒頒竴涓▼搴忛噷闈€傝?span class=t_tag onclick=tagshow(event) href="tag.php?name=%E7%B3%BB%E7%BB%9F">緋葷粺鑷甫鐨勭▼搴忥紝鍏稿瀷鐨刉idget鏄痬usic錛岃繖涓狝ndroid鍐呯疆鐨勯煶涔?span class=t_tag onclick=tagshow(event) href="tag.php?name=%E6%92%AD%E6%94%BE">鎾斁灝忕▼搴忋傝繖涓槸鍏稿瀷鐨刉idget+app搴旂敤銆傚氨鏄竴涓▼搴忔棦鍙互閫氳繃Widget鍚姩錛屼篃鍙互閫氳繃App鍚姩銆俉idget灝辨槸涓涓狝ppWidgetProvider+涓涓猆I鐣岄潰鏄劇ず錛堥鍏堢粦瀹氫簡濂藉Intent錛夛紝鐣岄潰涓婄殑淇℃伅鍙互閫氳繃紼嬪簭鎺у埗鑰屾敼鍙橈紝鍗曞嚮Widget錛屼笂鐨?span class=t_tag onclick=tagshow(event) href="tag.php?name=%E6%8E%A7%E4%BB%B6">鎺т歡鍙兘嬋鍙戝彂閫佷竴涓狪ntent錛屾垨鍙戝嚭涓涓?span class=t_tag onclick=tagshow(event) href="tag.php?name=Service">Service鐨勫惎鍔ㄩ氱煡銆傝孉ppWidgetProvider鍙互鎷︽埅榪欎釜Intent錛岃岃繘琛岀浉搴旂殑澶勭悊錛堟瘮濡傛樉紺烘柊鐨勪俊鎭級銆?/p> 鎴戜滑鍏堟潵鐪嬬湅AndroidManifest.xml涓殑浠g爜錛?br>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<receiver android:name=".BatteryMonitor"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_provider" />
</receiver>
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_provider" />
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="100dip"
android:minHeight="100dip"
android:initialLayout="@layout/main" >
</appwidget-provider>榪欎釜鏄疻idget鐨勬樉紺?span class=t_tag onclick=tagshow(event) href="tag.php?name=%E8%AE%BE%E7%BD%AE">璁劇疆錛屾槸瀵筗idget灞炴х殑涓涓厤緗枃浠惰繖涓猘ndroid:minHeight鏄疻idget鐨勯珮錛岃繖涓猘ndroid:minWidth
鏄疻idget鐨勫銆傝繖涓猘ndroid:updatePeriodMillis灞炴ф槸璁劇疆Widget欏甸潰鐨?br>鏇存柊欏甸潰鐨勬椂闂寸殑棰戠巼銆傝岃繖涓猘ndroid:initialLayout灞炴ф槸琛ㄧず鐨勬槸鍒濆鍖栭〉闈㈢殑甯冨眬錛孉ndroid閲岀敾UI鐨勫湴鏂歸兘鏄氳繃xml鏂囦歡錛屼篃鍙互閫氳繃浠g爜紼嬪簭鏉ョ敾錛屼笉榪囪繖鏍風敾鐨勫お楹葷儲浜嗐?/p>
寤轟竴涓被BatteryMonitor緇ф壙浜嶢ppWidgetProvider錛岃孉ppWidgetProvider緇ф壙涓巃ndroid.content.BroadcastReceiver錛屾墍浠estAppWidget灝辨槸涓涓嫤鎴鐞咺ntent鐨凚roadcastReceiver錛岃繖浜汭ntent鍙兘鍦ˋndroidmainfest閲岃緗潵鎷︽埅澶勭悊銆?br>鍦╫nUpdate涓緗獥鍙g晫闈細

public void defaultWidget(Context context)
{
RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.main);
//updateViews.setTextViewText(R.id.battery_level, BatteryLevel+" %");
updateViews.setImageViewResource(R.id.battery_img, R.drawable.batteryimg);
// Push update for this widget to the home screen
ComponentName batteryWidget = new ComponentName(context, BatteryMonitor.class);
AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(batteryWidget, updateViews);
}
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.util.Log;
import android.widget.RemoteViews;



public class BatteryMonitorReceiver extends Service

{
private int BatteryLevel = 0;
private BroadcastReceiver batteryReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
String action = intent.getAction();
if (action.equals(Intent.ACTION_BATTERY_CHANGED))
{
Log.d("BatteryLevel","BatteryCHANGED");
BatteryLevel = intent.getIntExtra("level", 0);
UpdateAppWidget(context);
}
}
};

public void UpdateAppWidget(Context context)
{
RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.main);
updateViews.setTextViewText(R.id.battery_level, BatteryLevel+" %");
// Push update for this widget to the home screen
ComponentName batteryWidget = new ComponentName(context, BatteryMonitor.class);
AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(batteryWidget, updateViews);
}

/**//* (non-Javadoc)
* @see android.app.Service#onCreate()
*/
@Override
public void onCreate()
{
// TODO Auto-generated method stub
super.onCreate();
IntentFilter itFilter = new IntentFilter();
itFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(batteryReceiver, itFilter);
}
@Override
public void onStart(Intent intent, int startId)
{
}

/**//* (non-Javadoc)
* @see android.app.Service#onDestroy()
*/
@Override
public void onDestroy()
{
// TODO Auto-generated method stub
super.onDestroy();
unregisterReceiver(batteryReceiver);
}
@Override
public IBinder onBind(Intent intent)
{
// TODO Auto-generated method stub
return null;
}
}
<service android:name=".BatteryMonitorReceiver">
<intent-filter>
<action android:name="com.adroid.pp" />
<category android:name="android.intent.category.default" />
</intent-filter>
</service>瀵逛簬adb shell錛屽悗闈㈠彲浠ヨ窡鐨勫懡浠や富瑕佹潵鑷猘ndroid-1.5\system\core\toolbox閲岄潰錛屽涓嬶細
ls
mount
cat
ps
kill
ln
insmod
rmmod
lsmod
ifconfig
setconsole
rm
mkdir
rmdir
reboot
getevent
sendevent
date
wipe
sync
umount
start
stop
notify
cmp
dmesg
route
hd
dd
df
getprop
setprop
watchprops
log
sleep
renice
printenv
smd
chmod
chown
mkdosfs
netstat
ioctl
mv
schedtop
top
iftop
id
vmstat
鍏蜂綋鐨勬剰鎬濆氨涓嶈В閲婁簡錛屽ぇ瀹跺彲浠ュ幓鐪媗inux鎵嬪唽鎴栬呯湅android鐨勬簮鐮併傞渶瑕佽涓涓嬬殑鏄痯s鍛戒護,寰堝鏃跺欐垜浠兂鍙垪涓懼嚭鎴戜滑闇瑕佺殑榪涚▼鍒楄〃錛屼緥濡傚垪涓懼嚭鎵鏈夎繍琛岀殑app銆備粠ps鐨勬簮鐮佹潵鐪嬶紝瀹冩槸鏀寔filter鐨勶紝ps app搴旇鍙互鍒椾婦鍑烘墍鏈変互app寮澶寸殑榪涚▼錛屼絾鍦ㄦ煇浜涙墜鏈洪噷闈㈣繍琛屾椂榪欎釜filter鍙堟槸娌$敤鐨勶紝鍙兘鏄繖浜涙墜鏈轟慨鏀逛簡ps鐨勪唬鐮併?/p>
榪樻湁涓や釜姣旇緝濂界敤鐨勫懡浠ゆ槸adb shell am鍜宎db shell pm,榪欎袱涓懡浠ゅ湪frameworks/base/cmds涓嬮潰銆俛m鍛戒護涓昏鐢ㄤ簬綆$悊Activity錛屼緥濡傚惎鍔紝鍋滄Activity錛坋clipse鍦ㄨ繍琛孉ctivity灝變嬌鐢ㄤ簡榪欎釜鍛戒護錛夛紝鍙戦乮ntent錛沺m鍛戒護鍒欎富瑕佺敤浜庣鐞嗗簲鐢╬ackage鐨勭鐞嗭紝鏈夌偣鍍忔帶鍒墮潰鏉跨殑娣誨姞鍜屽垹闄ょ▼搴忋?/p>
am鍛戒護鐨勫叿浣撶敤娉曞涓嬶細
usage: am [start|broadcast|instrument|profile]
am start -D INTENT
am broadcast INTENT
am instrument [-r] [-e <ARG_NAME> <ARG_VALUE>] [-p <PROF_FILE>]
[-w] <COMPONENT>
am profile <PROCESS> [start <PROF_FILE>|stop]
INTENT is described with:
[-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
[-c <CATEGORY> [-c <CATEGORY>] ...]
[-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
[--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
[-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
[-n <COMPONENT>] [-f <FLAGS>] [<URI>]
The start command starts activity. Use -D option to make 'DebugOption' true.
The broadcast command sends broadcast.
The instrument command starts instrumentation.
Use -r option to make 'rawMode' true.
Use -e option to add the pair of ARG_NAME and ARG_VALUE into Bundle.
Use -p option to specify profileFile.
Use -w option to make 'wait' true in order to new an instance of InstrumentationWatcher.
Use COMPONENT to specify the name of the instrumentation component.
The profile command turn on/off profiling in a particular process specified by PROCESS.
Use start option to turn on and stop to turn off.Use PROF_FILE to specify the file path of profile.
Use -a to set action specified by ACTION to be performed.
Use -d to create a Uri(data) which parses the given encoded URI string DATA_URI.
Use -t to specify the type specified by MIME_TYPE. Use -c to add a new category specified by
CATEGORY to the intent.
Use -e or --es to add extended data to the intent.EXTRA_KEY specifies the name of the extra data and
EXTRA_STRING_VALUE specifies the string data value.
Use --ez to add extended data to the intent. EXTRA_KEY specifies the name of the extra data and
EXTRA_BOOLEAN_VALUE specifies the serializable data value.
Use -e or --ei to add extended data to the intent. EXTRA_KEY specifies the name of the extra data and
EXTRA_INT_VALUE specifies the serializable data value.
Use -n to explicitly set the component specified by COMPONENT to handle the intent.
Use -f to set special flags controlling how this intent is handled.FLAGS specifies the desired flags.
Use URI to create an intent from a URI.
pm鍛戒護鐨勫叿浣撶敤娉曞涓嬶細
usage: pm [list|path|install|uninstall]
pm list packages [-f]
pm list permission-groups
pm list permissions [-g] [-f] [-d] [-u] [GROUP]
pm list instrumentation [-f] [TARGET-PACKAGE]
pm path PACKAGE
pm install [-l] [-r] PATH
pm uninstall [-k] PACKAGE
pm enable PACKAGE_OR_COMPONENT
pm disable PACKAGE_OR_COMPONENT
The list packages command prints all packages. Use
the -f option to see their associated file.
The list permission-groups command prints all known
permission groups.
The list permissions command prints all known
permissions, optionally only those in GROUP. Use
the -g option to organize by group. Use
the -f option to print all information. Use
the -s option for a short summary. Use
the -d option to only list dangerous permissions. Use
the -u option to list only the permissions users will see.
The list instrumentation command prints all instrumentations,
or only those that target a specified package. Use the -f option
to see their associated file.
The path command prints the path to the .apk of a package.
The install command installs a package to the system. Use
the -l option to install the package with FORWARD_LOCK. Use
the -r option to reinstall an exisiting app, keeping its data.
The uninstall command removes a package from the system. Use
the -k option to keep the data and cache directories around
after the package removal.
The enable and disable commands change the enabled state of
a given package or component (written as "package/class").
frameworks/base/cmds涓嬮潰榪樻湁涓涓埆鐨勫懡浠?濡備笅
dumpstate
dumpsys
ime
input
installd
runtime
service
servicemanager
surfaceflinger
svc
system_server
涓嬮潰鏄笂榪板懡浠ょ殑涓浜涜緭鍑猴細
C:\Users\xufan>adb shell dumpstate
========================================================
== dumpstate
========================================================
------ MEMORY INFO ------
MemTotal: 94348 kB
MemFree: 9912 kB
Buffers: 0 kB
Cached: 47876 kB
SwapCached: 0 kB
Active: 47016 kB
Inactive: 29980 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 29156 kB
Mapped: 22948 kB
Slab: 2992 kB
SReclaimable: 796 kB
SUnreclaim: 2196 kB
PageTables: 2180 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 47172 kB
Committed_AS: 658548 kB
VmallocTotal: 876544 kB
VmallocUsed: 8380 kB
VmallocChunk: 859132 kB
------ CPU INFO ------
User 7%, System 23%, IOW 0%, IRQ 0%
User 11 + Nice 0 + Sys 33 + Idle 98 + IOW 0 + IRQ 0 + SIRQ 0 = 142
PID TID CPU% S VSS RSS UID Thread Proc
743 743 26% R 928K 384K shell top top
565 581 1% S 177876K 25384K system er.ServerThread system_server
565 570 0% S 177876K 25384K system Binder Thread # system_server
565 571 0% S 177876K 25384K system Binder Thread # system_server
605 605 0% S 105820K 17540K radio app_process com.android.phone
565 619 0% S 177876K 25384K system er$SensorThread system_server
565 585 0% S 177876K 25384K system PackageManager system_server
565 586 0% S 177876K 25384K system FileObserver system_server
565 589 0% S 177876K 25384K system SyncHandlerThre system_server
565 590 0% S 177876K 25384K system UEventObserver system_server
565 591 0% S 177876K 25384K system PowerManagerSer system_server
565 592 0% S 177876K 25384K system AlarmManager system_server
565 593 0% S 177876K 25384K system WindowManager system_server
565 594 0% S 177876K 25384K system InputDeviceRead system_server
565 595 0% S 177876K 25384K system WindowManagerPo system_server
565 596 0% S 177876K 25384K system InputDispatcher system_server
565 597 0% S 177876K 25384K system ConnectivityThr system_server
565 598 0% S 177876K 25384K system WifiService system_server
565 599 0% S 177876K 25384K system WifiWatchdogThr system_server
565 600 0% S 177876K 25384K system er.ServerThread system_server
565 601 0% S 177876K 25384K system GpsEventThread system_server
565 602 0% S 177876K 25384K system AudioService system_server
565 603 0% S 177876K 25384K system android:unnamed system_server
565 604 0% S 177876K 25384K system android:unnamed system_server
565 609 0% S 177876K 25384K system watchdog system_server
565 640 0% S 177876K 25384K system r.MountListener system_server
565 651 0% S 177876K 25384K system Binder Thread # system_server
565 678 0% S 177876K 25384K system Binder Thread # system_server
605 606 0% S 105820K 17540K radio HeapWorker com.android.phone
605 607 0% S 105820K 17540K radio Signal Catcher com.android.phone
------ PROCRANK ------
C:\Users\xufan>adb shell dumpsys
Provider mms-sms
ContentProviderRecord{436a0040 com.android.providers.telephony.MmsSmsProvide
r}
package=com.android.providers.telephony process=com.android.phone
app=ProcessRecord{43638990 605:com.android.phone/1001}
launchingApp=null
provider=android.content.ContentProviderProxy@436c8c88
name=mms-sms
isSyncable=false
multiprocess=true initOrder=0 uid=1001
clients=[]
externals=0
Published content providers (by class):
Provider android.content.SyncProvider
ContentProviderRecord{435bceb8 android.content.SyncProvider}
package=android process=system
app=ProcessRecord{436236b8 565:system/1000}
launchingApp=null
provider=android.content.ContentProvider$Transport@43634c48
name=sync
isSyncable=false
multiprocess=false initOrder=0 uid=1000
clients=[]
externals=0
Provider com.android.providers.telephony.MmsSmsProvider
ContentProviderRecord{436a0040 com.android.providers.telephony.MmsSmsProvide
r}
package=com.android.providers.telephony process=com.android.phone
app=ProcessRecord{43638990 605:com.android.phone/1001}
launchingApp=null
provider=android.content.ContentProviderProxy@436c8c88
name=mms-sms
isSyncable=false
multiprocess=true initOrder=0 uid=1001
clients=[]
externals=0
Provider com.android.providers.settings.SettingsProvider
ContentProviderRecord{435bda90 com.android.providers.settings.SettingsProvid
er}
package=com.android.providers.settings process=system
app=ProcessRecord{436236b8 565:system/1000}
launchingApp=null
provider=android.content.ContentProvider$Transport@435a2b58
name=settings
isSyncable=false
multiprocess=false initOrder=100 uid=1000
clients=[ProcessRecord{4371bad0 655:com.android.alarmclock/10000}, ProcessRe
cord{43638990 605:com.android.phone/1001}]
externals=0
Provider com.android.providers.userdictionary.UserDictionaryProvider
ContentProviderRecord{436a2398 com.android.providers.userdictionary.UserDict
ionaryProvider}
package=com.android.providers.userdictionary process=android.process.acore
app=ProcessRecord{43645bc0 608:android.process.acore/10004}
launchingApp=null
provider=android.content.ContentProviderProxy@436ccca0
name=user_dictionary
isSyncable=false
multiprocess=false initOrder=0 uid=10004
clients=[]
externals=0
Provider com.android.providers.contacts.ContactsProvider
ContentProviderRecord{436a25e8 com.android.providers.contacts.ContactsProvid
er}
package=com.android.providers.contacts process=android.process.acore
app=ProcessRecord{43645bc0 608:android.process.acore/10004}
launchingApp=null
provider=android.content.ContentProviderProxy@436cd910
name=contacts;call_log
isSyncable=false
multiprocess=false initOrder=0 uid=10004
clients=[]
externals=0
Provider com.android.providers.drm.DrmProvider
ContentProviderRecord{4361c528 com.android.providers.drm.DrmProvider}
package=com.android.providers.drm process=android.process.media
app=ProcessRecord{436e89e8 644:android.process.media/10003}
launchingApp=null
provider=android.content.ContentProviderProxy@435ffed0
name=drm
isSyncable=false
multiprocess=false initOrder=0 uid=10003
clients=[]
externals=0
Provider com.android.launcher.LauncherProvider
ContentProviderRecord{436a2710 com.android.launcher.LauncherProvider}
package=com.android.launcher process=android.process.acore
app=ProcessRecord{43645bc0 608:android.process.acore/10004}
launchingApp=null
provider=android.content.ContentProviderProxy@436cdff0
name=com.android.launcher.settings
isSyncable=false
multiprocess=false initOrder=0 uid=10004
clients=[]
externals=0
Provider com.android.providers.media.MediaProvider
ContentProviderRecord{436e8728 com.android.providers.media.MediaProvider}
package=com.android.providers.media process=android.process.media
app=ProcessRecord{436e89e8 644:android.process.media/10003}
launchingApp=ProcessRecord{436e89e8 644:android.process.media/10003}
provider=android.content.ContentProviderProxy@435ff638
name=media
isSyncable=false
multiprocess=false initOrder=0 uid=10003
clients=[]
externals=0
Provider com.android.providers.downloads.DownloadProvider
ContentProviderRecord{4369e808 com.android.providers.downloads.DownloadProvi
der}
package=com.android.providers.downloads process=android.process.media
app=ProcessRecord{436e89e8 644:android.process.media/10003}
launchingApp=null
provider=android.content.ContentProviderProxy@43600a50
name=downloads
isSyncable=false
multiprocess=false initOrder=0 uid=10003
clients=[]
externals=0
Provider com.android.providers.telephony.MmsProvider
ContentProviderRecord{436a0f28 com.android.providers.telephony.MmsProvider}
package=com.android.providers.telephony process=com.android.phone
app=ProcessRecord{43638990 605:com.android.phone/1001}
launchingApp=null
provider=android.content.ContentProviderProxy@436c93a8
name=mms
isSyncable=false
multiprocess=true initOrder=0 uid=1001
clients=[]
externals=0
Provider com.android.googlesearch.SuggestionProvider
ContentProviderRecord{436a24c0 com.android.googlesearch.SuggestionProvider}
package=com.android.googlesearch process=android.process.acore
app=ProcessRecord{43645bc0 608:android.process.acore/10004}
launchingApp=null
provider=android.content.ContentProviderProxy@436cd288
name=com.android.googlesearch.SuggestionProvider
isSyncable=false
multiprocess=false initOrder=0 uid=10004
clients=[]
externals=0
Provider com.android.providers.telephony.TelephonyProvider
ContentProviderRecord{436a1030 com.android.providers.telephony.TelephonyProv
ider}
package=com.android.providers.telephony process=com.android.phone
app=ProcessRecord{43638990 605:com.android.phone/1001}
launchingApp=null
provider=android.content.ContentProviderProxy@436c9988
name=telephony
isSyncable=false
multiprocess=true initOrder=0 uid=1001
clients=[]
externals=0
Provider com.android.providers.telephony.SmsProvider
ContentProviderRecord{436a1138 com.android.providers.telephony.SmsProvider}
package=com.android.providers.telephony process=com.android.phone
app=ProcessRecord{43638990 605:com.android.phone/1001}
launchingApp=null
provider=android.content.ContentProviderProxy@436ca038
name=sms
isSyncable=false
multiprocess=true initOrder=0 uid=1001
clients=[]
externals=0
Provider com.android.phone.SimProvider
ContentProviderRecord{436a1240 com.android.phone.SimProvider}
package=com.android.phone process=com.android.phone
app=ProcessRecord{43638990 605:com.android.phone/1001}
launchingApp=null
provider=android.content.ContentProviderProxy@436ca648
name=sim
isSyncable=false
multiprocess=true initOrder=0 uid=1001
clients=[]
externals=0
Provider com.android.alarmclock.AlarmProvider
ContentProviderRecord{4371d520 com.android.alarmclock.AlarmProvider}
package=com.android.alarmclock process=com.android.alarmclock
app=ProcessRecord{4371bad0 655:com.android.alarmclock/10000}
launchingApp=null
provider=android.content.ContentProviderProxy@435e2c10
name=com.android.alarmclock
isSyncable=false
multiprocess=false initOrder=0 uid=10000
clients=[]
externals=0
Granted Uri Permissions:
-------------------------------------------------------------------------------
DUMP OF SERVICE activity.senders:
Intent Senders in Current Activity Manager State:
IntentSender IntentSenderRecord{435bb968 android broadcastIntent}
packageName=android type=broadcastIntent flags=0x0
activity=null who=null
requestCode=0 requestResolvedType=null
requestIntent=Intent { action=android.content.syncmanager.SYNC_ALARM }
sent=false canceled=false
IntentSender IntentSenderRecord{4359f4e0 android broadcastIntent}
packageName=android type=broadcastIntent flags=0x0
activity=null who=null
requestCode=0 requestResolvedType=null
requestIntent=Intent { action=android.intent.action.DATE_CHANGED }
sent=false canceled=false
IntentSender IntentSenderRecord{43638b10 android broadcastIntent}
packageName=android type=broadcastIntent flags=0x0
activity=null who=null
requestCode=0 requestResolvedType=null
requestIntent=Intent { action=com.android.service.Watchdog.REBOOT }
sent=false canceled=false
IntentSender IntentSenderRecord{436714c0 android broadcastIntent}
packageName=android type=broadcastIntent flags=0x0
activity=null who=null
requestCode=0 requestResolvedType=null
requestIntent=Intent { action=com.android.server.WifiManager.action.DEVICE_I
DLE }
sent=false canceled=false
IntentSender IntentSenderRecord{435e56d8 android broadcastIntent}
packageName=android type=broadcastIntent flags=0x0
activity=null who=null
requestCode=0 requestResolvedType=null
requestIntent=Intent { action=android.intent.action.TIME_TICK flags=0x400000
00 }
sent=true canceled=false
IntentSender IntentSenderRecord{435adb08 android broadcastIntent}
packageName=android type=broadcastIntent flags=0x0
activity=null who=null
requestCode=0 requestResolvedType=null
requestIntent=Intent { action=android.content.syncmanager.SYNC_POLL_ALARM }
sent=true canceled=false
IntentSender IntentSenderRecord{4359edf0 android broadcastIntent}
packageName=android type=broadcastIntent flags=0x0
activity=null who=null
requestCode=0 requestResolvedType=null
requestIntent=Intent { action=com.android.service.Watchdog.CHECKUP }
sent=false canceled=false
IntentSender IntentSenderRecord{436e3198 android broadcastIntent}
packageName=android type=broadcastIntent flags=0x0
activity=null who=null
requestCode=0 requestResolvedType=null
requestIntent=Intent { }
sent=false canceled=false
-------------------------------------------------------------------------------
DUMP OF SERVICE activity.services:
Services in Current Activity Manager State:
-------------------------------------------------------------------------------
DUMP OF SERVICE alarm:
Current Alarm Manager state:
Realtime alarms that are scheduled:
RTC #1:
Alarm{436358a0 type 1 android}
type=1 when=1272931200000 repeatInterval=0 count=0
operation=PendingIntent{43617020 target IntentSenderRecord{4359f4e0 android
broadcastIntent}}
RTC #0:
Alarm{43695080 type 1 android}
type=1 when=1272884280000 repeatInterval=0 count=0
operation=PendingIntent{4358e9d8 target IntentSenderRecord{435e56d8 android
broadcastIntent}}
Elapsed realtime wakeup alarms that are scheduled:
ELAPSED_REALTIME_WAKEUP #0:
Alarm{4361e8e8 type 2 android}
type=2 when=90877805 repeatInterval=0 count=0
operation=PendingIntent{435adc60 target IntentSenderRecord{435adb08 android
broadcastIntent}}
Broadcast ref count: 0
Alarm Stats:
android
4729ms running, 1 wakeups
1 alarms: Intent { action=android.content.syncmanager.SYNC_POLL_ALARM flags=
0x4 (has extras) }
28 alarms: Intent { action=android.intent.action.TIME_TICK flags=0x40000004
(has extras) }
-------------------------------------------------------------------------------
DUMP OF SERVICE appwidget:
Providers: (size=3)
[0] provder=ComponentInfo{com.android.alarmclock/com.android.alarmclock.Analog
AppWidgetProvider} min=(146x146) updatePeriodMillis=0 initialLayout=2130903043 z
ombie=false
[1] provder=ComponentInfo{com.android.camera/com.android.camera.PhotoAppWidget
Provider} min=(146x146) updatePeriodMillis=0 initialLayout=2130903052 zombie=fal
se
[2] provder=ComponentInfo{com.android.music/com.android.music.MediaAppWidgetPr
ovider} min=(294x72) updatePeriodMillis=0 initialLayout=2130903040 zombie=false
AppWidgetIds: (size=1)
[0] appWidgetId=1 host=1024/com.android.launcher provider=ComponentInfo{com.an
droid.alarmclock/com.android.alarmclock.AnalogAppWidgetProvider} host.callbacks=
com.android.internal.appwidget.IAppWidgetHost$Stub$Proxy@4363f610 views=android.
widget.RemoteViews@43731e90
Hosts: (size=1)
[0] packageName=com.android.launcher uid=10004 hostId=1024 callbacks=com.andro
id.internal.appwidget.IAppWidgetHost$Stub$Proxy@4363f610 instances.size=1 zombie
=false
-------------------------------------------------------------------------------
DUMP OF SERVICE audio:
C:\Users\xufan>adb shell ime list
com.android.inputmethod.latin/.LatinIME:
mId=com.android.inputmethod.latin/.LatinIME mSettingsActivityName=com.android.
inputmethod.latin.LatinIMESettings
mIsDefaultResId=0x7f060001
Service:
Filter: null
priority=0 preferredOrder=0 match=0x108000 specificIndex=-1 isDefault=false
labelRes=0x0 nonLocalizedLabel=null icon=0x0
ServiceInfo:
com.android.inputmethod.pinyin/.PinyinIME:
mId=com.android.inputmethod.pinyin/.PinyinIME mSettingsActivityName=com.androi
d.inputmethod.pinyin.SettingsActivity
mIsDefaultResId=0x7f060000
Service:
Filter: null
priority=0 preferredOrder=0 match=0x108000 specificIndex=-1 isDefault=false
labelRes=0x0 nonLocalizedLabel=null icon=0x0
ServiceInfo:
C:\Users\xufan>adb shell input
usage: input [text|keyevent]
input text <string>
input keyevent <event_code>
android ps 鍛戒護鎵ц瀹屽悗錛屼細鏈変笅鍒楀悇欏瑰鹼細“USER PID PPID VSIZE RSS WCHAN PC NAME”錛屼唬琛ㄧ殑鎰忔濆垎鍒槸錛?/p>
VSIZE錛氳繘紼嬬殑铏氭嫙鍐呭瓨澶у皬錛?br> RSS錛?nbsp; 榪涚▼鍒嗛厤鍒板緱鐗╃悊鍐呭瓨澶у皬錛?br> WCHAN錛歛ddress of the kernel function where the process is sleeping錛孯unning tasks will display (0) in this column.
鍏朵粬鐨勫啀璇淬?/p>
ContentResolver cr = getContentResolver();
Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
while(cursor.moveToNext()){
//get name
int nameFiledColumnIndex = cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME);
String contact = cursor.getString(nameFiledColumnIndex);
String[] PHONES_PROJECTION = new String[] { "_id","display_name","data1","data3"};//
String contactId = cursor.getString(cursor.getColumnIndex(PhoneLookup._ID));
Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, PHONES_PROJECTION,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId, null, null);
//name type ..
while(phone.moveToNext()) {
int i = phone.getInt(0);
String str = phone.getString(1);
str = phone.getString(2);
str = phone.getString(3);
}
phone.close();
//addr
Cursor addrCur = cr.query(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI ,
new String[]{"_id","data1","data2","data3"}, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId , null, null);
while(addrCur.moveToNext()) {
int i = addrCur.getInt(0);
String str = addrCur.getString(1);
str = addrCur.getString(2);
str = addrCur.getString(3);
}
addrCur.close();
//email
Cursor emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI ,
new String[]{"_id","data1","data2","data3"}, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId , null, null);
while(emailCur.moveToNext()) {
int i = emailCur.getInt(0);
String str = emailCur.getString(1);
str = emailCur.getString(2);
str = emailCur.getString(3);
}
emailCur.close();
}
cursor.close();
android涓幏鍙栭氳瘽璁板綍
String str = "";
int type;
long callTime;
Date date;
String time= "";
ContentResolver cr = getContentResolver();
final Cursor cursor = cr.query(CallLog.Calls.CONTENT_URI, new String[]{CallLog.Calls.NUMBER,CallLog.Calls.CACHED_NAME,CallLog.Calls.TYPE, CallLog.Calls.DATE}, null, null,CallLog.Calls.DEFAULT_SORT_ORDER);
for (int i = 0; i < cursor.getCount(); i++) {
cursor.moveToPosition(i);
str = cursor.getString(0);
str = cursor.getString(1);
type = cursor.getInt(2);
SimpleDateFormat sfd = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
date = new Date(Long.parseLong(cursor.getString(3)));
time = sfd.format(date);
}
| String | ADD_SHORTCUT_ACTION | 鍔ㄤ綔錛氬湪緋葷粺涓坊鍔犱竴涓揩鎹鋒柟寮忋? | "android.intent.action.ADD_SHORTCUT" |
| String | ALL_APPS_ACTION | 鍔ㄤ綔錛氬垪涓炬墍鏈夊彲鐢ㄧ殑搴旂敤銆?br>杈撳叆錛氭棤銆?/td> | "android.intent.action.ALL_APPS" |
| String | ALTERNATIVE_CATEGORY | 綾誨埆錛氳鏄?activity 鏄敤鎴鋒鍦ㄦ祻瑙堢殑鏁版嵁鐨勪竴涓彲閫夋搷浣溿?/td> | "android.intent.category.ALTERNATIVE" |
| String | ANSWER_ACTION | 鍔ㄤ綔錛氬鐞嗘嫧鍏ョ殑鐢佃瘽銆?/td> | "android.intent.action.ANSWER" |
| String | BATTERY_CHANGED_ACTION | 騫挎挱錛氬厖鐢電姸鎬侊紝鎴栬呯數姹犵殑鐢甸噺鍙戠敓鍙樺寲銆?/td> | "android.intent.action.BATTERY_CHANGED" |
| String | BOOT_COMPLETED_ACTION | 騫挎挱錛氬湪緋葷粺鍚姩鍚庯紝榪欎釜鍔ㄤ綔琚箍鎾竴嬈★紙鍙湁涓嬈★級銆?/td> | "android.intent.action.BOOT_COMPLETED" |
| String | BROWSABLE_CATEGORY | 綾誨埆錛氳兘澶熻嫻忚鍣ㄥ畨鍏ㄤ嬌鐢ㄧ殑 activities 蹇呴』鏀寔榪欎釜綾誨埆銆?/td> | "android.intent.category.BROWSABLE" |
| String | BUG_REPORT_ACTION | 鍔ㄤ綔錛氭樉紺?activity 鎶ュ憡閿欒銆?/td> | "android.intent.action.BUG_REPORT" |
| String | CALL_ACTION | 鍔ㄤ綔錛氭嫧鎵撶數璇濓紝琚懠鍙殑鑱旂郴浜哄湪鏁版嵁涓寚瀹氥?/td> | "android.intent.action.CALL" |
| String | CALL_FORWARDING_STATE_CHANGED_ACTION | 騫挎挱錛氳闊崇數璇濈殑鍛煎彨杞Щ鐘舵佸凡緇忔敼鍙樸?/td> | "android.intent.action.CFF" |
| String | CLEAR_CREDENTIALS_ACTION | 鍔ㄤ綔錛氭竻闄ょ櫥闄嗗嚟璇?(credential)銆?/td> | "android.intent.action.CLEAR_CREDENTIALS" |
| String | CONFIGURATION_CHANGED_ACTION | 騫挎挱錛氳澶囩殑閰嶇疆淇℃伅宸茬粡鏀瑰彉錛屽弬瑙?Resources.Configuration. | "android.intent.action.CONFIGURATION_CHANGED" |
| Creator | CREATOR | 鏃?/td> | 鏃?/td> |
| String | DATA_ACTIVITY_STATE_CHANGED_ACTION | 騫挎挱錛氱數璇濈殑鏁版嵁媧誨姩(data activity)鐘舵侊紙鍗蟲敹鍙戞暟鎹殑鐘舵侊級宸茬粡鏀瑰彉銆?/td> | "android.intent.action.DATA_ACTIVITY" |
| String | DATA_CONNECTION_STATE_CHANGED_ACTION | 騫挎挱錛氱數璇濈殑鏁版嵁榪炴帴鐘舵佸凡緇忔敼鍙樸?/td> | "android.intent.action.DATA_STATE" |
| String | DATE_CHANGED_ACTION | 騫挎挱錛氭棩鏈熻鏀瑰彉銆?/td> | "android.intent.action.DATE_CHANGED" |
| String | DEFAULT_ACTION | 鍔ㄤ綔錛氬拰 VIEW_ACTION 鐩稿悓錛屾槸鍦ㄦ暟鎹笂鎵ц鐨勬爣鍑嗗姩浣溿?/td> | "android.intent.action.VIEW" |
| String | DEFAULT_CATEGORY | 綾誨埆錛氬鏋?activity 鏄鏁版嵁鎵ц紜渷鍔ㄤ綔錛堢偣鍑? center press錛夌殑涓涓夐」錛岄渶瑕佽緗繖涓被鍒?/td> | "android.intent.category.DEFAULT" |
| String | DELETE_ACTION | 鍔ㄤ綔錛氫粠瀹瑰櫒涓垹闄ょ粰瀹氱殑鏁版嵁銆?/td> | "android.intent.action.DELETE" |
| String | DEVELOPMENT_PREFERENCE_CATEGORY | 綾誨埆錛氳鏄?activity 鏄竴涓緗潰鏉?(development preference panel). | "android.intent.category.DEVELOPMENT_PREFERENCE" |
| String | DIAL_ACTION | 鍔ㄤ綔錛氭嫧鎵撴暟鎹腑鎸囧畾鐨勭數璇濆彿鐮併?/td> | "android.intent.action.DIAL" |
| String | EDIT_ACTION | 鍔ㄤ綔錛氫負鍒跺畾鐨勬暟鎹樉紺哄彲緙栬緫鐣岄潰銆?/td> | "android.intent.action.EDIT" |
| String | EMBED_CATEGORY | 綾誨埆錛氳兘澶熷湪涓婄駭錛堢埗錛塧ctivity 涓繍琛屻?/td> | "android.intent.category.EMBED" |
| String | EMERGENCY_DIAL_ACTION | 鍔ㄤ綔錛氭嫧鎵撶揣鎬ョ數璇濆彿鐮併?/td> | "android.intent.action.EMERGENCY_DIAL" |
| int | FORWARD_RESULT_LAUNCH | 鍚姩鏍囪錛氬鏋滆繖涓爣璁拌璁劇疆錛岃屼笖琚竴涓凡緇忓瓨鍦ㄧ殑 activity 鐢ㄦ潵鍚姩鏂扮殑 activity錛屽凡鏈?activity 鐨勫洖澶嶇洰鏍?(reply target) 浼氳杞Щ緇欐柊鐨?activity銆?/td> | 16 0x00000010 |
| String | FOTA_CANCEL_ACTION | 騫挎挱錛氬彇娑堟墍鏈夎鎸傝搗鐨?(pending) 鏇存柊涓嬭澆銆?/td> | "android.server.checkin.FOTA_CANCEL" |
| String | FOTA_INSTALL_ACTION | 騫挎挱錛氭洿鏂板凡緇忚紜錛岄┈涓婂氨瑕佸紑濮嬪畨瑁呫?/td> | "android.server.checkin.FOTA_INSTALL" |
| String | FOTA_READY_ACTION | 騫挎挱錛氭洿鏂板凡緇忚涓嬭澆錛屽彲浠ュ紑濮嬪畨瑁呫?/td> | "android.server.checkin.FOTA_READY" |
| String | FOTA_RESTART_ACTION | 騫挎挱錛氭仮澶嶅凡緇忓仠姝㈢殑鏇存柊涓嬭澆銆?/td> | "android.server.checkin.FOTA_RESTART" |
| String | FOTA_UPDATE_ACTION | 騫挎挱錛氶氳繃 OTA 涓嬭澆騫跺畨瑁呮搷浣滅郴緇熸洿鏂般?/td> | "android.server.checkin.FOTA_UPDATE" |
| String | FRAMEWORK_INSTRUMENTATION_TEST_CATEGORY | 綾誨埆錛歍o be used as code under test for framework instrumentation tests. | "android.intent.category.FRAMEWORK_INSTRUMENTATION_TEST" |
| String | GADGET_CATEGORY | 綾誨埆錛氳繖涓?activity 鍙互琚祵鍏ュ涓?activity (activity that is hosting gadgets)銆?/td> | "android.intent.category.GADGET" |
| String | GET_CONTENT_ACTION | 鍔ㄤ綔錛氳鐢ㄦ埛閫夋嫨鏁版嵁騫惰繑鍥炪?/td> | "android.intent.action.GET_CONTENT" |
| String | HOME_CATEGORY | 綾誨埆錛氫富灞忓箷 (activity)錛岃澶囧惎鍔ㄥ悗鏄劇ず鐨勭涓涓?activity銆?/td> | "android.intent.category.HOME" |
| String | INSERT_ACTION | 鍔ㄤ綔錛氬湪瀹瑰櫒涓彃鍏ヤ竴涓┖欏?(item)銆?/td> | "android.intent.action.INSERT" |
| String | INTENT_EXTRA | 闄勫姞鏁版嵁錛氬拰 PICK_ACTIVITY_ACTION 涓璧蜂嬌鐢ㄦ椂錛岃鏄庣敤鎴烽夋嫨鐨勭敤鏉ユ樉紺虹殑 activity錛涘拰 ADD_SHORTCUT_ACTION 涓璧蜂嬌鐢ㄧ殑鏃跺欙紝鎻忚堪瑕佹坊鍔犵殑蹇嵎鏂瑰紡銆?/td> | "android.intent.extra.INTENT" |
| String | LABEL_EXTRA | 闄勫姞鏁版嵁錛氬ぇ鍐欏瓧姣嶅紑澶寸殑瀛楃鏍囩錛屽拰 ADD_SHORTCUT_ACTION 涓璧蜂嬌鐢ㄣ?/td> | "android.intent.extra.LABEL" |
| String | LAUNCHER_CATEGORY | 綾誨埆錛欰ctivity 搴旇琚樉紺哄湪欏剁駭鐨?launcher 涓?/td> | "android.intent.category.LAUNCHER" |
| String | LOGIN_ACTION | 鍔ㄤ綔錛氳幏鍙栫櫥褰曞嚟璇併?/td> | "android.intent.action.LOGIN" |
| String | MAIN_ACTION | 鍔ㄤ綔錛氫綔涓轟富鍏ュ彛鐐瑰惎鍔紝涓嶉渶瑕佹暟鎹?/td> | "android.intent.action.MAIN" |
| String | MEDIABUTTON_ACTION | 騫挎挱錛氱敤鎴鋒寜涓嬩簡“Media Button”銆?/td> | "android.intent.action.MEDIABUTTON" |
| String | MEDIA_BAD_REMOVAL_ACTION | 騫挎挱錛氭墿灞曚粙璐紙鎵╁睍鍗★級宸茬粡浠?SD 鍗℃彃妲芥嫈鍑猴紝浣嗘槸鎸傝澆鐐?(mount point) 榪樻病瑙i櫎 (unmount)銆?/td> | "android.intent.action.MEDIA_BAD_REMOVAL" |
| String | MEDIA_EJECT_ACTION | 騫挎挱錛氱敤鎴鋒兂瑕佺Щ闄ゆ墿灞曚粙璐紙鎷旀帀鎵╁睍鍗★級銆?/td> | "android.intent.action.MEDIA_EJECT" |
| String | MEDIA_MOUNTED_ACTION | 騫挎挱錛氭墿灞曚粙璐ㄨ鎻掑叆錛岃屼笖宸茬粡琚寕杞姐?/td> | "android.intent.action.MEDIA_MOUNTED" |
| String | MEDIA_REMOVED_ACTION | 騫挎挱錛氭墿灞曚粙璐ㄨ縐婚櫎銆?/td> | "android.intent.action.MEDIA_REMOVED" |
| String | MEDIA_SCANNER_FINISHED_ACTION | 騫挎挱錛氬凡緇忔壂鎻忓畬浠嬭川鐨勪竴涓洰褰曘?/td> | "android.intent.action.MEDIA_SCANNER_FINISHED" |
| String | MEDIA_SCANNER_STARTED_ACTION | 騫挎挱錛氬紑濮嬫壂鎻忎粙璐ㄧ殑涓涓洰褰曘?/td> | "android.intent.action.MEDIA_SCANNER_STARTED" |
| String | MEDIA_SHARED_ACTION | 騫挎挱錛氭墿灞曚粙璐ㄧ殑鎸傝澆琚В闄?(unmount)錛屽洜涓哄畠宸茬粡浣滀負 USB 澶у閲忓瓨鍌ㄨ鍏變韓銆?/td> | "android.intent.action.MEDIA_SHARED" |
| String | MEDIA_UNMOUNTED_ACTION | 騫挎挱錛氭墿灞曚粙璐ㄥ瓨鍦紝浣嗘槸榪樻病鏈夎鎸傝澆 (mount)銆?/td> | "android.intent.action.MEDIA_UNMOUNTED" |
| String | MESSAGE_WAITING_STATE_CHANGED_ACTION | 騫挎挱錛氱數璇濈殑娑堟伅絳夊緟錛堣闊抽偖浠訛級鐘舵佸凡緇忔敼鍙樸?/td> | "android.intent.action.MWI" |
| int | MULTIPLE_TASK_LAUNCH | 鍚姩鏍囪錛氬拰 NEW_TASK_LAUNCH 鑱斿悎浣跨敤錛岀姝㈠皢宸叉湁鐨勪換鍔℃敼鍙樹負鍓嶆櫙浠誨姟 (foreground)銆?/td> | 8 0x00000008 |
| String | NETWORK_TICKLE_RECEIVED_ACTION | 騫挎挱錛氳澶囨敹鍒頒簡鏂扮殑緗戠粶 "tickle" 閫氱煡銆?/td> | "android.intent.action.NETWORK_TICKLE_RECEIVED" |
| int | NEW_TASK_LAUNCH | 鍚姩鏍囪錛氳緗互鍚庯紝activity 灝嗘垚涓哄巻鍙插爢鏍堜腑鐨勭涓涓柊浠誨姟錛堟爤欏訛級銆?/td> | 4 0x00000004 |
| int | NO_HISTORY_LAUNCH | 鍚姩鏍囪錛氳緗互鍚庯紝鏂扮殑 activity 涓嶄細琚繚瀛樺湪鍘嗗彶鍫嗘爤涓?/td> | 1 0x00000001 |
| String | PACKAGE_ADDED_ACTION | 騫挎挱錛氳澶囦笂鏂板畨瑁呬簡涓涓簲鐢ㄧ▼搴忓寘銆?/td> | "android.intent.action.PACKAGE_ADDED" |
| String | PACKAGE_REMOVED_ACTION | 騫挎挱錛氳澶囦笂鍒犻櫎浜嗕竴涓簲鐢ㄧ▼搴忓寘銆?/td> | "android.intent.action.PACKAGE_REMOVED" |
| String | PHONE_STATE_CHANGED_ACTION | 騫挎挱錛氱數璇濈姸鎬佸凡緇忔敼鍙樸?/td> | "android.intent.action.PHONE_STATE" |
| String | PICK_ACTION | 鍔ㄤ綔錛氫粠鏁版嵁涓夋嫨涓涓」鐩?(item)錛屽皢琚変腑鐨勯」鐩繑鍥炪?/td> | "android.intent.action.PICK" |
| String | PICK_ACTIVITY_ACTION | 鍔ㄤ綔錛氶夋嫨涓涓?activity錛岃繑鍥炶閫夋嫨鐨?activity 鐨勭被錛堝悕錛夈?/td> | "android.intent.action.PICK_ACTIVITY" |
| String | PREFERENCE_CATEGORY | 綾誨埆錛歛ctivity鏄竴涓緗潰鏉?(preference panel)銆?/td> | "android.intent.category.PREFERENCE" |
| String | PROVIDER_CHANGED_ACTION | 騫挎挱錛氭洿鏂板皢瑕侊紙鐪熸錛夎瀹夎銆?/td> | "android.intent.action.PROVIDER_CHANGED" |
| String | PROVISIONING_CHECK_ACTION | 騫挎挱錛氳姹?polling of provisioning service 涓嬭澆鏈鏂扮殑璁劇疆銆?/td> | "android.intent.action.PROVISIONING_CHECK" |
| String | RUN_ACTION | 鍔ㄤ綔錛氳繍琛屾暟鎹紙鎸囧畾鐨勫簲鐢級錛屾棤璁哄畠錛堝簲鐢級鏄粈涔堛?/td> | "android.intent.action.RUN" |
| String | SAMPLE_CODE_CATEGORY | 綾誨埆錛歍o be used as an sample code example (not part of the normal user experience). | "android.intent.category.SAMPLE_CODE" |
| String | SCREEN_OFF_ACTION | 騫挎挱錛氬睆騫曡鍏抽棴銆?/td> | "android.intent.action.SCREEN_OFF" |
| String | SCREEN_ON_ACTION | 騫挎挱錛氬睆騫曞凡緇忚鎵撳紑銆?/td> | "android.intent.action.SCREEN_ON" |
| String | SELECTED_ALTERNATIVE_CATEGORY | 綾誨埆錛氬浜庤鐢ㄦ埛閫変腑鐨勬暟鎹紝activity 鏄畠鐨勪竴涓彲閫夋搷浣溿?/td> | "android.intent.category.SELECTED_ALTERNATIVE" |
| String | SENDTO_ACTION | 鍔ㄤ綔錛氬悜 data 鎸囧畾鐨勬帴鏀惰呭彂閫佷竴涓秷鎭?/td> | "android.intent.action.SENDTO" |
| String | SERVICE_STATE_CHANGED_ACTION | 騫挎挱錛氱數璇濇湇鍔$殑鐘舵佸凡緇忔敼鍙樸?/td> | "android.intent.action.SERVICE_STATE" |
| String | SETTINGS_ACTION | 鍔ㄤ綔錛氭樉紺虹郴緇熻緗傝緭鍏ワ細鏃犮?/td> | "android.intent.action.SETTINGS" |
| String | SIGNAL_STRENGTH_CHANGED_ACTION | 騫挎挱錛氱數璇濈殑淇″彿寮哄害宸茬粡鏀瑰彉銆?/td> | "android.intent.action.SIG_STR" |
| int | SINGLE_TOP_LAUNCH | 鍚姩鏍囪錛氳緗互鍚庯紝濡傛灉 activity 宸茬粡鍚姩錛岃屼笖浣嶄簬鍘嗗彶鍫嗘爤鐨勯《绔紝灝嗕笉鍐嶅惎鍔紙涓嶉噸鏂板惎鍔級 activity銆?/td> | 2 0x00000002 |
| String | STATISTICS_REPORT_ACTION | 騫挎挱錛氳姹?receivers 鎶ュ憡鑷繁鐨勭粺璁′俊鎭?/td> | "android.intent.action.STATISTICS_REPORT" |
| String | STATISTICS_STATE_CHANGED_ACTION | 騫挎挱錛氱粺璁′俊鎭湇鍔$殑鐘舵佸凡緇忔敼鍙樸?/td> | "android.intent.action.STATISTICS_STATE_CHANGED" |
| String | SYNC_ACTION | 鍔ㄤ綔錛氭墽琛屾暟鎹悓姝ャ?/td> | "android.intent.action.SYNC" |
| String | TAB_CATEGORY | 綾誨埆錛氳繖涓?activity 搴旇鍦?TabActivity 涓綔涓轟竴涓?tab 浣跨敤銆?/td> | "android.intent.category.TAB" |
| String | TEMPLATE_EXTRA | 闄勫姞鏁版嵁錛氭柊璁板綍鐨勫垵濮嬪寲妯℃澘銆?/td> | "android.intent.extra.TEMPLATE" |
| String | TEST_CATEGORY | 綾誨埆錛氫綔涓烘祴璇曠洰鐨勪嬌鐢紝涓嶆槸姝e父鐨勭敤鎴蜂綋楠岀殑涓閮ㄥ垎銆?/td> | "android.intent.category.TEST" |
| String | TIMEZONE_CHANGED_ACTION | 騫挎挱錛氭椂鍖哄凡緇忔敼鍙樸?/td> | "android.intent.action.TIMEZONE_CHANGED" |
| String | TIME_CHANGED_ACTION | 騫挎挱錛氭椂闂村凡緇忔敼鍙橈紙閲嶆柊璁劇疆錛夈?/td> | "android.intent.action.TIME_SET" |
| String | TIME_TICK_ACTION | 騫挎挱錛氬綋鍓嶆椂闂村凡緇忓彉鍖栵紙姝e父鐨勬椂闂存祦閫濓級銆?/td> | "android.intent.action.TIME_TICK" |
| String | UMS_CONNECTED_ACTION | 騫挎挱錛氳澶囪繘鍏?USB 澶у閲忓瓨鍌ㄦā寮忋?/td> | "android.intent.action.UMS_CONNECTED" |
| String | UMS_DISCONNECTED_ACTION | 騫挎挱錛氳澶囦粠 USB 澶у閲忓瓨鍌ㄦā寮忛鍑恒?/td> | "android.intent.action.UMS_DISCONNECTED" |
| String | UNIT_TEST_CATEGORY | 綾誨埆錛氬簲璇ヨ鐢ㄤ綔鍗曞厓嫻嬭瘯錛堥氳繃 test harness 榪愯錛夈?/td> | "android.intent.category.UNIT_TEST" |
| String | VIEW_ACTION | 鍔ㄤ綔錛氬悜鐢ㄦ埛鏄劇ず鏁版嵁銆?/td> | "android.intent.action.VIEW" |
| String | WALLPAPER_CATEGORY | 綾誨埆錛氳繖涓?activity 鑳借繃涓鴻澶囪緗綰搞?/td> | "android.intent.category.WALLPAPER" |
| String | WALLPAPER_CHANGED_ACTION | 騫挎挱錛氱郴緇熺殑澧欑焊宸茬粡鏀瑰彉銆?/td> | "android.intent.action.WALLPAPER_CHANGED" |
| String | WALLPAPER_SETTINGS_ACTION | 鍔ㄤ綔錛氭樉紺洪夋嫨澧欑焊鐨勮緗晫闈€傝緭鍏ワ細鏃犮?/td> | "android.intent.action.WALLPAPER_SETTINGS" |
| String | WEB_SEARCH_ACTION | 鍔ㄤ綔錛氭墽琛?web 鎼滅儲銆?/td> | "android.intent.action.WEB_SEARCH" |
| String | XMPP_CONNECTED_ACTION | 騫挎挱錛歑MPP 榪炴帴宸茬粡琚緩绔嬨?/td> | "android.intent.action.XMPP_CONNECTED" |
| String | XMPP_DISCONNECTED_ACTION | 騫挎挱錛歑MPP 榪炴帴宸茬粡琚柇寮銆?/td> |
鍘熸枃鍦板潃錛?/span>
鍦ㄧЩ鍔?UI 鏋舵瀯寮鍙戠殑娣鋒垬涓紝 Android 涓婂崌鍒伴浣嶃傚鏋滀綘鏈変竴浜涚Щ鍔ㄤ綋楠岋紝浣犱細鍙戠幇瀹冩槸涓涓?Java ME 鐨?Canvas / Screen 瀵硅薄鍜?BREW 鏋勫緩闃跺眰鐨勫畬緹庣粍鍚堬紝閫氳繃涓浜?XML 甯冨眬宸ュ叿鍚姩銆傛瘡欏規椿鍔ㄨ鏀劇疆鍦ㄥ睆騫曞爢鏍堬紝褰撳畠浠庢偍鐨勫簲鐢ㄧ▼搴忓惎鍔ㄣ?Android 鏄凡緇忚閰嶇疆澶勭悊鍏抽棴褰撳墠鐨勬椿鍔紝騫舵縺媧誨畠鐨勪笅涓涓椿鍔紝褰撲綘瑕佹眰鎴栧綋鐢ㄦ埛鎸変笅 Back 銆傛璁劇疆鍏佽鎮ㄨ涓烘瘡涓綔涓轟竴涓睆騫曞熀鍦版椿鍔ㄣ?
姣忎竴欏規椿鍔ㄩ兘鍙兘鍖呭惈涓嶅悓鐨勮鍥懼拰瑙嗗浘緇勫湪涓涓眰嬈℃爲銆備綘鍙互鎯沖儚榪欐牱涓涓甫鏈夎鍥劇粍鐨勬爲錛屽竷灞瀵硅薄浣滀負鏍戝共鍜屾爲鏋濓紙鍥犱負瑙嗗浘緇勫璞″彲浠ュ己鍒惰漿鎹㈡垚瀵硅薄錛夛紝灝嗚鍥炬垨閮ㄤ歡浣滀負鏍戝彾銆傚崟涓 view 錛屽湪鍏舵渶鍩烘湰鐨勫艦寮忥紝鏄竴涓彲浠ユ嫋鎷界殑鐭╁艦銆備竴涓鍥劇粍錛屽湪鍏舵渶鍩烘湰鐨勫艦寮忥紝鏄竴涓寘鍚竴涓垨澶氫釜瑙嗗浘鐨勫璞°傝繖涓璞″眰嬈$粨鏋勫厑璁告偍甯冪疆澶嶆潅鐨勭敤鎴風晫闈紝鑰屼笉蹇呯粡鍘嗚綆楄鍥劇煩褰㈠拰緇勫緩閲嶅彔鐨勯敊璇繃紼嬨傚鏋滐紝鍙︿竴縐嶆柟娉曪紝榪欑浜嬫槸浣犵殑琚嬪瓙錛?Android 灝嗛鍑虹殑鏂瑰紡錛岃鎮ㄥ憟鐜伴氳繃 Java ME 鏂規硶鎵嬬粯娓告垙鐢誨竷銆?
鍦ㄦ湰绔犱腑錛屼綘灝變細寮濮嬪熀鏈殑鍩轟簬 XML-based 灞忓箷甯冨眬錛岃漿縐誨埌鏇村鏉傜殑鑷畾涔夌敾甯冧笂緇樺埗銆備負浜嗘湰涔︼紝鎴戜細鍒嗚В騫惰璁鴻鍥句綔涓轟笁涓富瑕侀鐗╃兢錛?
Ø XML-defined widgets/views and view groups 錛?鑹ソ鐨勫熀鏈俊鎭樉紺哄拰鑿滃崟
Ø Android native views 錛?TextViews, LayoutGroups, ScrollBars, and text entry
Ø Custom views 錛?娓告垙紼嬪簭鍛樻渶濂界殑鏈嬪弸
鎮ㄥ皢寮濮嬩竴涓ず渚嬬櫥褰曞睆騫曪紝騫舵搷綰靛拰閾鴻縐誨姩鍑洪儴浠跺拰浠g爜鐨勬剰瑙侊紝鏈緇堜嬌涓涓氦浜掑紡鍔ㄧ敾涓庤嚜瀹氫箟瑙嗗浘銆?
鏂逛究銆佸揩閫熺殑 XML 甯冨眬
棣栧厛錛屼嬌鐢?XML 鐨勫竷灞寮濮嬬湅浼肩畝鍗曪紝浣嗗畠浼氬緢蹇彉寰楀鏉傘傛偍灝嗗紑濮嬩笌浣犵殑甯冨眬鍜屽伐浣滄柟寮忓埌鐨勫悇涓厓绱犮?
甯冪疆
澶у XML 灞忓箷灝嗚灝佽鍦ㄤ竴涓竷灞瀵硅薄銆傚竷灞瀵硅薄鏉ュ湪璁稿涓嶅悓鐨勫彛鍛籌紝姣忎竴涓綘鐪嬬湅瀹炲湪鏄お蹇紝鐒跺悗媯鏌ヤ簡浠ヤ笅鍑犺妭綆鍗曠殑渚嬪瓙浜嗐?
娉ㄦ剰錛氬湪緙栬瘧鏃訛紝榪欎簺 XML 閰嶇疆鏂囦歡瑙f瀽鍜?Android 鍖呰鎴愪竴涓揣鍑戠殑浜岃繘鍒舵牸寮忋傝繖鏍峰彲浠ヨ妭鐪佽В鏋愬彲鎬曠殑鍚姩鏃墮棿涓婄殑鏁伴銆備絾鏄紝瀹冩剰鍛崇潃 XML 鏂囦歡鏃犳硶閫?榪囨偍鐨勪唬鐮佸湪榪愯鏃舵敼鍙樸傛洿鍏蜂綋鍦拌錛屾偍鍙互鍦ㄦ墽琛岃繃紼嬩腑鏀瑰彉榪欎簺 XML 鏂囦歡錛屼絾瀹冧細瀹屽叏娌℃湁搴旂敤紼嬪簭鐨勫竷灞銆傛澶栵紝鎮ㄥ繀欏繪敮浠樺じ澶т竴涓鍥炬垨浠?XML 瑙?鍥劇粍涓灝忔ц兘浠鋒牸銆傛偍鐨勯噷紼嬪彲鑳戒細鏍規嵁 CPU 璐熻澆鍜岀敤鎴風晫闈㈢殑澶嶆潅鎬с?
LinearLayout
鎵鏈夊厓绱犺鎺掑垪鎴愰掑噺鐨勫垪錛屼互鍦ㄤ竴涓粠涓婂埌涓嬫垨浠庡乏鍒板彸鐨勬柟寮忋傛瘡涓厓绱犲彲浠ユ湁閲嶅姏鍜屼綋閲嶇殑灞炴ц錛岃緗浣曞姩鎬佸闀垮拰緙╁皬錛屼互濉ˉ絀洪棿銆傚厓绱犺嚜宸辨帓鍒楁垚琛屾垨鍒楃殑鏍囩ず鍩轟簬鍙傛暟錛?android:orientation 銆?For example (see Figure 3-1):
<LinearLayout xmlns:android=
"
android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Element One" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Element Two" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Element Three" /> </LinearLayout> RelativeLayout 姣忎釜瀛愬厓绱犵殑甯冨眬鏄笌瀛愬厓绱犳湁鍏崇殑銆傝繖縐嶅叧緋葷殑寤虹珛浣垮緱鍦ㄤ笂涓涓瓙鍏冪礌緇撴潫鐨勫湴鏂瑰厓绱犳墠寮濮嬨傚瓙鍏冪礌鍙互鍙秹鍙婇偅浜涙墍鍒楀唴瀹圭殑闈㈠墠銆傚洜姝わ紝寤虹珛浠?XML 鏂囦歡寮濮嬪埌緇撴潫鐨勪緷璧栥傝娉ㄦ剰錛?ID 鏄渶瑕佺殑錛屼互渚塊儴浠跺彲浠ヤ簰鐩稿紩鐢ㄣ備緥濡傦紙瑙佸浘 3-2 錛夛細 <RelativeLayout xmlns:android= "
android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/EL01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Element One" /> <TextView android:id="@+id/EL02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Element Two" android:layout_below="@id/EL01" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Element Three" android:layout_toRight="@id/EL02" /> </RelativeLayout> AbsoluteLayout 姣忎釜瀛╁瓙鏈変竴涓竴涓壒瀹氱殑浣嶇疆錛屽繀欏誨湪鐖舵瘝甯冨眬瀵硅薄鐨勮寖鍥村唴銆?AbsoluteLayout 瀵硅薄鍙兘鏄渶瀹規槗寤虹珛鍜屽彲瑙嗗寲錛屼絾鏈闅捐縼縐誨埌鏂扮殑璁懼鎴栧睆騫曞昂瀵鎬笂銆備緥濡傦紙瑙佸浘 3-3 錛夛細 <AbsoluteLayout xmlns:android= "
android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Element One" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Element Two" android:layout_x="30px" android:layout_y="30px" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Element Three" android:layout_x="50px" android:layout_y="50px" /> </AbsoluteLayout> TableLayout TableLayout 鏄竴涓竷灞瀵硅薄錛屽厑璁告偍鎸囧畾琛ㄤ腑鐨勮銆?Android 璇曞浘瀹夋帓榪涘叆姝g‘鐨勮鍜屽垪鐨勬瘡涓涓瓙鍏冪礌銆備緥濡傦紙瑙佸浘 3-4 錛夛細 <TableLayout xmlns:android= "
android:layout_width="fill_parent" android:layout_height="fill_parent"> <TableRow> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Element One A" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Element One B" /> </TableRow> <TableRow> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Element Two A" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Element Two B" /> </TableRow> </TableLayout> 榪欎簺鏄富瑕佸竷灞瀵硅薄錛屼綘灝嗘潵浼氶亣鍒般傛瘡涓緥瀛愭湁鍑犱釜綆鍗曠殑 TextView 鍏冪礌錛屼負姣忕甯冨眬綾誨瀷紺鴻寖甯冨眬鎬庢牱璧蜂綔鐢ㄧ殑錛屽悓鏃朵竴騫呭睆騫曟崟鑾鋒瘡涓?XML 鏂囦歡灝嗗憟鐜般備綘鍙互鍦?Android 鐨勬枃浠舵洿褰誨簳鐨勫疄渚?http://code.google.com/android/samples/ApiDemos/src/com/google/android/samples/view/ 銆? 鎺ヤ笅鏉ョ殑浠誨姟鏄壘鍒版墍鏈夋斁緗湪涓涓竷灞鍏冪礌錛岀浉鍏沖瓙鍏冪礌鐨勫垪琛ㄣ傝繖縐嶈祫婧愭槸鍙互鍦ㄧ悍綣佸 鏉傝〃鏍?http://code.google.com/android/reference/android/R.styleable.html 錛?Menu 銆? 浠庨偅閲岋紝浣犲彲浠ュ皾璇曠涓涓?UI 浠誨姟錛氬湪涓?“ 紺句氦 ” 搴旂敤紼嬪簭鐨勭櫥褰曞睆騫曘傝繖鐧誨綍灞忓箷灝嗘垚涓?getSplashy 紺轟緥搴旂敤紼嬪簭鐨勪竴閮ㄥ垎銆? 婊氬姩銆佹枃瀛楄緭鍏ャ佹寜閽紝浠ュ強鎵鏈夊湪鐢熸椿綆鍗曠殑浜嬫儏 鐜板湪鏄椂鍊欎嬌鐢ㄥ竷灞鐨勪竴涓被銆?XML 鐨勫竷灞鏄畬緹庣殑錛屽湪鐢ㄦ埛杈撳叆錛屼俊鎭紶閫掞紝浠ュ強鍑犱箮浠諱綍灞忓箷鐨勫唴瀹規槸鐩稿闈欐佸湴鏂廣傛偍灝嗘坊鍔犱竴涓畝鍗曠殑鐧誨綍灞忓箷鏄劇ず鍓嶉潰鎻愬埌鐨?“ 紺句氦 ” 鐢寵琛紙瑙佷唬鐮佹竻鍗?3-1 錛夈傜涓欏逛換鍔℃槸鏉ユ弿榪板睆騫曠湅璧鋒潵鐨勬牱瀛愬湪涓涓柊鐨勮鍥句腑銆傛偍鍙互浣跨敤綰挎у竷灞錛屼嬌鎮ㄥ彲浠ュ彧鍨傜洿鍦版坊鍔犲皬宸ュ叿銆傦紙璇鋒敞鎰忥紝榪欎釜 XML 闇瑕?general_bg 鍥劇墖鍜屽0鏄庡瓧絎︿覆琚畾涔夊湪 res 鏂囦歡澶逛腑銆備負姝わ紝浠庢湁鍏寵緇嗕俊鎭紝 Apress 緗戠珯涓嬭澆璇ラ」鐩殑涓绔犮傦級 Code Listing 3-1. /res/layout/login.xml <ScrollView xmlns:android= "
android:layout_width="fill_parent" android:layout_height="wrap_content" android:scrollbars="vertical"> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/general_bg" > <TextView android:text="Login Screen" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textAlign="center" /> <TextView android:text="Username:" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <EditText android:id="@+id/username" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TextView android:text="Password:" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <EditText android:id="@+id/password" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/loginbutton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Login" /> <TextView android:id="@+id/status" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textAlign="center" android:text="Enter Username and Password" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/disclaimer" /> </LinearLayout> </ScrollView> 鎴戝皢浠庡師鏉ョ殑鍒椾婦涓挙鍑轟竴浜涘叿浣撶殑綰挎潯騫朵笖瑙i噴浠栦滑鐨勪綔鐢ㄥ湪涓嬮潰閮ㄥ垎銆傛敞鎰忥紝浣犳病鏈夊畾涔夌粍鎴愯繖涓睆騫曞厓绱犵殑浠諱綍浣嶇疆銆備絾鏄紝鍥犱負鎮ㄤ嬌鐢ㄧ殑鏄?LinearLayout 瀵硅薄錛屾瘡涓繛緇殑鍏冪礌闄勫姞鍒頒互鍓嶇殑鍏冪礌鐨勫簳閮ㄣ? Scrolling 婊氬姩涓涓秴榪囦綘璁懼灞忓箷澶у皬鐨勮鍥撅紝浣犲彧鏄渶瑕佸湪 ScrollView 涓皝瑁呬綘鐨勫竷灞瀵硅薄銆備負浜嗕嬌鐢ㄥ瀭鐩存粴鍔ㄦ潯錛屼綘鐨?ScrollView 蹇呴』璁劇疆鍙傛暟 android:scrollbars="vertical" 錛屽綋浣犲悜涓嬬炕灞忔椂錛屽皢鏄劇ず涓涓粴鍔ㄦ潯銆備負浜嗕嬌瑙嗗浘瓚沖闀夸互璇存槑榪欎釜瀵硅薄錛屾垜宸茬粡娣誨姞 TextView 浣滀負鍋囧0鏄庡湪綰挎у竷灞緇撴潫澶勩備綘浼氬彂鐜幫紝濡傛灉浣犺緗師鏉ョ殑 XML 涓烘椿鍔ㄨ鍥撅紝閲嶇偣灝嗘槸鍚戜笅縐誨姩鐨勫璞★紝鐩村埌鍒拌揪鐨勬寜閽紝姝ゆ椂婊氬姩鏉″皢澶勭悊閿拰鍚戜笅縐誨姩鐢ㄦ埛鏂囨湰鐨勫簳閮ㄣ? 紿ユ帰 TextView 涓や釜涓昏 “ 鏋勪歡 ” 宸ヤ綔鍦ㄥ師鏉?XML. 娉ㄦ剰錛氬湪 Android 涓殑涓涓皬閮ㄤ歡鏄寚浠諱綍鐙珛瑙嗗浘瀵硅薄鐨勫瓙綾匯? 涓轟簡鏍囬鍜屾枃鏈緭鍏ユ爣絳撅紝浣跨敤 TextView 瀵硅薄銆傚浜庣敤鎴鋒帶鍒剁殑鏂囧瓧杈撳叆錛屼嬌鐢?EditText 瀵硅薄銆傛渶鏄劇潃鐨勶紝鍥犳錛岀壒鍒煎緱璇︾粏鎻忚堪鐨勬槸鏈鍚庣殑 “status” 鐨勬枃鏈細 <TextView android:id="@+id/status" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textAlign="center" android:text=”Enter Username and Password” /> 棣栧厛錛岀敱浜庢湰涔﹀唴瀹瑰皢琚慨鏀瑰湪鏌愪釜鏃跺欙紝閫氳繃浣犵殑浠g爜鍦ㄨ繍琛岀殑鏃跺欙紝鎵浠ヤ綘闇瑕佺粰瀹冧竴涓?ID 銆傝繖鍏佽鎮ㄤ嬌鐢?findViewById 鏂規硶鍚庤幏寰椼? @+id/status 灝嗘坊鍔犲埌鎮ㄧ殑 ID 鐘舵佸湪 R.java 錛屽鏋滄枃浠朵笉瀛樺湪浜嗐傝繖涓鐐癸紝浣犵殑 IDE 鍙兘浼氶敊璇綋鎮ㄥ湪浠g爜涓紩鐢ㄥ畠絎竴嬈°備笉瑕佹儳鎬曪紝浣嗗洜涓烘槸絎竴嬈$紪璇戯紝灝嗗叏閮ㄨВ鍐充簡銆? 鎺ヤ笅鏉ワ紝鎮ㄧ敤 TextView 璁劇疆鍏跺搴﹁揪鍒板叾鐖剁被鐨勫搴﹀湪榪欑鎯呭喌涓嬶紝 LinearLayout 瀵硅薄銆備綘鍛婅瘔瀹冭瀹冪殑楂樺害鏄敱鏂囧瓧澶у皬鑼冨洿鍐呬嬌鐢ㄧ殑 layout_height 鍙傛暟 wrap_content 銆傛偍甯屾湜鏂囧瓧灞呬綇鍦ㄥ睆騫曠殑涓績錛屽洜姝ゆ偍浣跨敤 textAlign 錛屽洜涓轟綘宸茬粡璁劇疆鍏跺搴︿負鏁翠釜灞忓箷銆傛渶鍚庯紝鎮ㄧ粰瀹冧竴浜涚畝鍗曠殑鏂囧瓧鏄劇ず鍦ㄦ椿鍔ㄥ紑濮嬩簡銆傚悗鏉ワ紝浣犱細鏀瑰彉榪欎竴妗堟枃浠ュ弽鏄犲綋鍓嶇殑鐘舵併? 鐪嬪埌榪欎釜鎵嬭壓鐨勭粨鏋滐紝鍙渶鍒涘緩媧誨姩錛屽茍璁劇疆榪欎釜 XML 鐨勫竷灞鏄富瑕佸唴瀹硅鍥俱傛偍搴旇鑳藉鐪嬪埌灞忓箷涓婏紝鍦ㄦ枃鏈緭鍏ュ瓧孌電殑綾誨瀷錛屽茍閫夋嫨妗嗐傝繖浜涜鍔紝浣嗘槸涓嶄細鏈変換浣曠粨鏋溿備負閰嶅悎璇ヨ鍒掑皢浠栦滑錛岃浠栦滑浜掑姩浣犲氨蹇呴』緇х畫闃呰銆? XML 鐨勫竷灞 鎴戜滑娣卞埢浣撲細浜?XML 鐨勫竷緗柟妗堟棦綆鍗曞張寮哄ぇ銆傚畠鎻愪緵浜嗕竴涓潪緙栫▼鎺ュ彛鐨勭Щ鍔ㄥ睆騫曞竷灞鍜岃璁°傚畠緇欏紑鍙戜漢鍛樻彁渚涗簡宸ュ叿鍘葷牬瑙f墦寮鍜屼慨鏀硅繍琛屾椂鐨勯琛岃繖浜涘鹼紝浣犱細鍋氭帰璁ㄥ浣曠浉浜掍綔鐢ㄧ幇鍦?Android 鐨勫唴緗儴浠躲? 鍞ら啋鏋勫緩 鎴戝凡緇忚鏄庝簡濡備綍浣跨敤 Android 鐨?TextView 錛?button 鍜?EditText 閮ㄤ歡銆備絾濡備綍鏈夌敤鐨勬槸涓涓枃鏈緭鍏ュ瓧孌碉紝濡傛灉浣犱笉鑳芥憚鍙栦綘鐨勭敤鎴峰凡緇忚繘鍏ワ紵 榪欐槸涓涓弽闂紝涓嶈鍥炵瓟錛屾垜涓嶈兘鍚綘錛堟垜甯屾湜錛夈傜瓟妗堟槸鏄捐屾槗瑙佺殑錛氭病鏈夌洰鐨勫拰緇撴灉鏂囨湰杈撳叆鏄病鏈夌敤澶勭殑銆傝璁塊棶鎮ㄧ殑 EditText 閮ㄤ歡鍏堝墠瀹氫箟鐨勫唴瀹癸紝浣犲氨蹇呴』鍋氫袱浠朵簨錛? 1 銆傝幏鍙栦竴涓偍鍦?XML 瀹氫箟閮ㄤ歡鐨勫璞″彞鏌勩? 2 銆傜洃鍚偣鍑繪垨閫夋嫨浜嬩歡鍦?Login 鎸夐挳閮ㄤ歡涓娿? 鑾峰彇鐨勪簨鎯呭彞鏌? 絎竴涓換鍔″氨鏄緱鍒頒竴涓湪鎮ㄧ殑 XML 閰嶇疆鏂囦歡涓畾涔夌殑鍏冪礌鎸囬拡銆傝鍋氬埌榪欎竴鐐癸紝浣犱細紜繚鎮ㄨ璁塊棶鐨勬瘡涓?XML 閮ㄤ歡鏈変竴涓?Android 錛?ID 鍙傛暟銆傛濡傚墠闈㈢畝鍗曟彁鍒幫紝浣跨敤絎﹀彿 @+id/-id_name_here- 灝嗙‘淇濇偍鐨?R.java 鏂囦歡鏈変綘闇瑕佺殑 ID 銆備互涓嬫槸濡備綍鑾峰緱涓涓鍥懼璞℃寚閽堬紝褰撴偍鐨勫簲鐢ㄧ▼搴忓惎鍔ㄦ椂銆傚湪鏂扮殑鐧誨綍媧誨姩涓紝榪欐槸 OnCreate 鏂規硶錛岃娣誨姞鍒?GetSplashy 紺轟緥搴旂敤紼嬪簭錛? Button btn = null; public void onCreate(Bundle args) { super .onCreate(args); setContentView(R.layout.login ); btn = (Button) findViewById(R.id.loginbutton ); } 鍦ㄨ繖閲岋紝鎮ㄥ凡緇忚幏寰椾簡鐧誨綍鎸夐挳鐨勬寚閽堬紝閫氳繃璋冪敤 findViewById 銆傝繖浣挎偍娣誨姞鍗曞嚮鐩戝惉錛屼細閫氱煡鎮ㄥ綋鎸夐挳琚変腑錛堝湪鎵嬪啓絎旇Е鎽稿睆錛夋垨閫夊畾涓績杞敭銆傛偍灝嗘墿灞?ClickListener 綾葷殑鍐呰仈鍑芥暟濡備笅錛? public class loginScreen extends Activity { private OnClickListener buttonListener = new OnClickListener() { public void onClick(View v) { grabEnteredText(); } }; ... } 褰撲竴涓夋嫨閫氱煡鍙戠敓錛屼互鍓嶇殑鍐呰仈鍑芥暟瀹氫箟璋冪敤 grabEnteredText 鏂規硶銆傜幇鍦ㄤ綘宸茬粡瀹氫箟鐨勭偣鍑諱睛鍚櫒錛屾偍鍙互浣跨敤 btn 瀵硅薄鍦?OnCreate 鏂規硶涓細 public void onCreate(Bundle args) { //... btn = (Button) findViewById(R.id.loginbutton ); btn.setOnClickListener(buttonListener); } 濡傛灉鎮ㄦ斁鏂偣鎮ㄧ殑鎸夐挳鐩戝惉鐨?onClick 鏂規硶涓紝鏂偣寮鐏綋鎮ㄧЩ鍔ㄧ劍鐐瑰茍閫夋嫨鐧誨綍鎸夐挳錛屽綋鎮ㄧ敤榧犳爣鐐瑰嚮瀹冨湪榪愯妯℃嫙鍣ㄤ腑銆? 緙笣鍦ㄦ枃鏈? 鐜板湪鍓╀笅瑕佸仛鐨勫氨鏄畾涔?grabEnteredText 鏉ュ仛鍒拌繖鐐癸紝姝e瀹冨悕瀛楃殑鍚箟銆傚湪鐧誨綍灞忓箷鐨勬渶緇堜駭鍝佺殑鐗堟湰錛屾偍瑕佹彁鍙栬緭鍏ョ殑鏂囨湰錛屽紑濮嬩竴涓綉緇滅櫥褰曠殑璋冪敤錛屽彂鍔ㄤ竴涓澆鍏ュ璇濇銆傜幇鍦紝浣犲彧鏄劇ず涓涓璇濇錛屽寘鍚湪鐧誨綍鍚嶅拰瀵嗙爜鍩熶腑杈撳叆鐨勫唴瀹廣備笅闈?grabEnteredTex 鐨勬牱瀛愬湪鏇存柊鐨勭櫥褰曟椿鍔細 public void grabEnteredText() { //Get a pointer to the status text TextView status = (TextView) findViewById(R.id.status ); //Grab handles to both text-entry fields EditText username = (EditText) findViewById(R.id.username ); EditText pwd = (EditText) findViewById(R.id.password ); //Extract Strings from the EditText objects // and format them in strings String usrTxt = username.getText().toString(); String pwdTxt = pwd.getText().toString(); //HTTP transaction would spin up a //new thread here status.setText("Login" + usrTxt + " : " + pwdTxt); //Show dialog box that would eventually turn into this .showAlert("Login Data", 0, "Login" + usrTxt + " : " + pwdTxt, "ok!", false ); } 棣栧厛錛屼嬌鐢?findViewById 錛屼負浜?status 銆?username 銆?password 閮ㄤ歡錛屾偍媯绱?TextView 鍜?EditText 鎸囬拡銆傛帴涓嬫潵錛屾偍鎻愬彇 Text-Entry 鏋勫緩鐨勫唴瀹歸氳繃媯绱?TextEntry 瀵硅薄錛屽茍灝嗗叾杞崲鎴?String 綾匯傛渶鍚庯紝浣犳妸涓や釜瀛楁鐨勫唴瀹瑰湪涓璧鳳紝浠栦滑閮藉姞鍏ュ埌鐘舵佹枃鏈璞★紝騫跺脊鍑轟竴涓璇濇榪樺寘鍚袱涓瓧絎︿覆銆? Java 鐨勯儴浠? 褰撲綘鐪嬪埌鎴戝啓鐨勪唬鐮佷駭鐢熷嵆浣挎槸寰堝皬鐨勯夋嫨鑿滃崟錛屼綘鍙兘浼氬儚鎴戯紝鏈夌偣鍚撳憜浜嗐傜瓑鍒扮啛鎮夌殑 XML 鐨勫睆騫曞竷灞錛岃瘯鍥捐嚜宸辯敤 java 鍔ㄦ墜瀹屾垚榪欎竴鍒囷紝浼氭劅瑙夊儚鏄敤涓瀵圭牬鎹熺殑淇濋緞鐞冩紨濂忓彜鍏擱煶涔愩傝璀﹀憡錛屽畠娑夊強璁稿鎵撳瓧錛屾垨璁鎬笉浠呬粎鏄竴鐐規尗鎶樸? 鍙︿竴鏂歸潰錛屽彲鑳芥湁涓涓敤鎴風晫闈㈠竷灞鐨勫叿浣撳厓绱狅紝浣犺鍔ㄦ佽皟鏁淬傚洜涓烘濡傛垜鍓嶉潰鎻愬埌鐨勶紝鎮ㄤ笉鑳藉湪搴旂敤紼嬪簭榪愯鏃剁紪杈?XML 鏂囦歡鐨勫竷灞錛屽畠蹇呴』鏈夐渶瑕佷慨鏀規瘡涓涓敤鎴風晫闈㈢殑浠g爜鍦ㄨ繍琛屾椂鍙兘鐗囨柇鐨勫伐鍏楓?Android 緇欎綘榪欎釜鍔ㄥ姏錛屽彧瑕佷綘鏄垝閫傜殑鎵撳瓧浠ユ儕浜洪熷害銆? 鐜板湪鎮ㄥ彲浠ュ湪寮曟搸鐩栦笅寮濮嬪皬灝忕殑淇ˉ錛岀敤鏈鍩烘湰銆佹渶鐩磋寮忕殑鏂規硶媯楠?Android 鐨勬瀯寤恒備綘宸茬粡浜嗚В涓涓牳蹇冮儴鍒嗙殑鍩烘湰澶栬錛屽叾涓澶氭槸鎮ㄥ湪 XML 褰㈠紡鎺㈣銆傛濡傚湪鍓嶉潰鐨勪緥瀛愪腑錛屼負浜嗚鏄庤搗瑙侊紝鎴戝皢淇濇寔榪欑鍩烘湰銆傛垜宸茬粡鍦ㄨ繖閲岃璁虹殑鐣岄潰甯冨眬錛屽畠搴旇寰堝鏄撳浠ヨ嚧搴旂敤鍒版洿澶嶆潅鐨勯棶棰樸傚湪鍚庢潵錛屾洿澶氱殑楂樼駭渚嬪瓙錛屼綘浼氳幏寰楁洿澶氱殑鍏朵粬 Android 閮ㄤ歡銆傚湪涓嬮潰鐨勪緥瀛愪腑錛屾垜灝嗗敖鍔涚‘淇濅嬌鐢ㄥ緢灝戜綘浠庡墠渚濊禆娌℃湁鐨?XML 鍏冪礌銆傚畠搴旇緇欎綘涓涓満浼氾紝鑾峰緱鑹ソ鐨勫鐞嗛潪 XML 甯冨眬錛屼絾瑕佽浣忥紝瀹為檯涓婏紝浣犲繀欏繪槸鐤媯鐨勫仛鎵鏈夌殑鐢ㄦ埛鐣岄潰錛岃繖縐嶆柟寮忋? 涓昏彍鍗? 鍑犱箮鎵鏈夌殑縐誨姩搴旂敤錛岃嚦灝戝湪鍙戣鏃訛紝棣栧厛鏄浘褰富鑿滃崟銆傝繖涓浘褰㈠睆騫曞紩瀵肩敤鎴鋒墽琛岀Щ鍔ㄥ簲鐢ㄧ殑鍚勭鍔熻兘銆傚洜涓?“ 涓昏彍鍗?” 鐨勬蹇墊槸濡傛鏅亶鐨勭Щ鍔ㄥ簲鐢ㄤ綋楠岋紝瀹冧嬌涓涓緢濂界殑鍜屽疄闄呯殑妗堜緥鐮旂┒銆傚湪榪欎釜渚嬪瓙涓紝浣犵殑鐩爣鏄皢涓涓畝鍗曞姛鑳戒富鑿滃崟鐨勬斁鍦ㄤ竴璧楓備負浜嗕究浜庢瘮杈冿紝浣犱細浣跨敤鍏朵粬鐨勭嚎鎬у竷灞錛?鎶婁竴鍒囪瀺鍚堝湪涓璧楓傝繖涓緥瀛愬皢寤虹珛鍦ㄤ笁涓富瑕侀樁孌碉細 1 銆傚竷灞錛氫綘浼氬湪灞忓箷涓婃紜湴瀹夋帓鎵鏈夌殑涓昏彍鍗曢」銆傚綋鐒訛紝榪欏皢鍙嬌鐢?Android 鐨勫ぇ灞忓箷鐗堥潰涓婄殑涓灝忛儴鍒嗐備絾鏄紝澶у鏁板簲鐢ㄧ▼搴忚彍鍗曞皢浣跨敤澶у瀷鍥懼艦錛屾壙鎷呯潃鏇村鐨勭┖闂淬? 2 銆傜劍鐐癸細鎮ㄩ渶瑕佸緩绔嬩竴涓劍鐐圭粨鏋勶紝浣跨敤鎴峰彲浠ラ氳繃鍏冪礌縐誨姩銆傚綋鐒︾偣縐誨姩鏃訛紝浣犲繀欏昏皟鏁存瘡涓彍鍗曞厓绱犵殑棰滆壊銆? 3 銆傞夋嫨媧誨姩錛氭渶鍚庯紝鎮ㄩ渶瑕佸緩绔嬩竴涓洃鍚紝浠ヤ究褰撲竴涓厓绱犺閫変腑鎴栧崟鍑伙紝浣犵煡鎯呭拰鍙互鍦ㄩ夊畾鐨勯」鐩熀紜涓婇噰鍙栭傚綋琛屽姩銆? 褰撴偍瀹屾垚鎵鏈夎繖浜涗換鍔$殑涓変釜錛屼綘搴旇鏈夊緩绔嬩富瑕佽緭鍏ュ睆騫曠殑妗嗘灦錛岃繖澶х害鍗犳暣涓Щ鍔ㄥ簲鐢ㄧ殑鐧懼垎涔?80 鐨勫伐浣溿傝櫧鐒朵笉瀹屽叏鐜板疄錛堝嵆錛屾垜宸茬粡瀹屽叏浣跨敤 XML 鐨勯浂錛夛紝瀹冩槸鏋佸ソ紺鴻寖錛屽浣曞仛浜嬫儏浠ヨ嚜瀹氫箟榪愯鏃剁殑椹卞姩鏂瑰紡銆傚綋鎮ㄦ坊鍔犳洿澶氱殑鍔熻兘鍦ㄤ綘鐨?“ 紺句氦 ” 搴旂敤紼嬪簭涓紝鎮ㄥ~鍐欐涓昏彍鍗曞皢鏇村姞瀹屽杽銆? 甯冨眬錛?Java 椋庢牸 鍦ㄧ畝鍗曚富鑿滃崟涓婄殑絎竴姝ユ槸寰楀埌鎵鏈夊湪灞忓箷涓婄殑鑿滃崟鍏冪礌銆傛濡傛垜鍒氭墠鎵璇達紝浣犲皢閲囩敤綰挎у竷灞瀹屾垚瀹冦傛偍闇瑕佸湪鐢寵鍓嶅仛榪欎竴鍒囨彁璇風涓嬈★紝鎵浠ュ氨蹇呴』鍦ㄦ柊鐨?MainMenu 媧誨姩鐨?OnCreate 鏂規硶涓?錛堣鍙傞槄絎?1 绔狅紝濡傛灉浣犲繕璁頒簡濡備綍鍒涘緩騫舵彃鍏ヤ竴涓柊鐨勬椿鍔ㄣ傦級浠g爜娓呭崟 3-2 鏄劇ず浜嗗畠鐨勫疄渚嬪寲鍜岄厤緗殑妯℃牱銆? LinearLayout layout = new LinearLayout(this ); layout.setBackground(R.drawable.general_bg ); layout.setOrientation(LinearLayout.VERTICAL ); layout.setLayoutParams( new LayoutParams(LayoutParams.FILL_PARENT , LayoutParams.FILL_PARENT )); setContentView(layout); 涔嬪悗錛屾偍閫氳繃浠涔堣縿浠婁負姝紝榪欏湪姒傚康涓婁技涔庡簲鐔熸倝銆傛偍鍙互璁劇疆鑳屾櫙浣跨敤鍦?/res/drawable/ 鏂囦歡澶逛腑鐨勫浘鐗囷紝璁劇疆綰挎у竷灞涓哄瀭鐩存柟鍚戯紝騫惰緗?LayoutParams 浠ュ~琛ョ埗浜詫紙鍦ㄨ繖縐嶆儏鍐典笅錛岀埗浜叉槸媧誨姩錛屾帶鍒跺叏灞忓箷錛夈傚竷灞鍙傛暟錛屽湪浠栦滑鐨勫熀鍦幫紝蹇呴』鐣屽畾瑙勫畾閮ㄤ歡鐨勯珮搴﹀拰瀹藉害銆傛濡傛偍鍚庢潵鍙兘浼氬彂鐜幫紝鍦ㄥ墠甯冨眬鍙傛暟璁劇疆涔嬪墠璇曞浘鏀懼叆涓涓儴浠跺湪 ViewGroup 閲岋紝灝嗘姏鍑轟竴涓紓甯搞備絾鏄紝鐜板湪浣犳湁涓涓竷灞瀵硅薄鏉ュ~鍏咃紝浣犲彲浠ュ紑濮嬪緩绔嬩簡灞忓箷銆? 娣誨姞鏍囬 鎺ヤ笅鏉ワ紝娣誨姞涓涓畝鍗曠殑鏍囬錛屽湪浣犵殑涓昏彍鍗曠敾闈笂鏂瑰皢涓烘湰銆備唬鐮佹竻鍗?3-3 鏄劇ず鐨勪唬鐮佸潡錛屾偍闇瑕佸畠銆? Code Listing 3-3. Adding the Title TextView title = new TextView(this ); title.setText(R.string.man_menu_title ); title.setLayoutParams( new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT , LayoutParams.WRAP_CONTENT )); title.setAlignment(Alignment.ALIGN_CENTER ); layout.addView(title); 鍒涘緩鏂囨湰瀵硅薄錛屽茍璁劇疆鏂囨湰鍦?/res/values/strings.xml 涓?銆傛垜鐭ラ亾鎴戣鎴戜笉浼氱敤浠諱綍 XML 錛屼絾鎴戞亹鎬曟垜浼氬姝ゆ湁浜涙拻璋庛傚湪寮鍙戜腑錛屾偍闇瑕佸皢鎵鏈夌殑瀛楃涓茬Щ鍒拌繖涓綅緗紝鑰屼笉鏄湪浠g爜涓畾涔夈傚鏋滀綘鐨勫鎴鋒槸鍍忔垜榪欐牱錛屼綘灝變笉浼氭兂鎷変綘鐨勬簮浠g爜緙栬緫鍣ㄥ茍閲嶆柊緙栬瘧姣忔浠栦滑鎯蟲敼鍙樺 screens.Now 涔嬩竴鐨勬帾璇嶏紝浣犳湁涓涓爣棰橈紝鏄椂鍊欐坊 鍔犳洿澶氭湁瓚g殑鍜岀Н鏋佺殑鑿滃崟鍏冪礌銆? Code Listing 3-4. Adding a Menu Item TextView ItemOne = new TextView(this ); ItemOne.setFocusable(true ); ItemOne.setText("Login Screen"); ItemOne.setTextColor(Color.WHITE ); ItemOne.setLayoutParams( new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT , LayoutParams.WRAP_CONTENT )); //Give the menu item an ID for tracking reasons. //The ID is a static int defined locally to the class ItemOne.setId(IdOne ); //Add it to our linear layout layout.addView(ItemOne); 澶╁摢錛屼綘鍙兘璁や負鍦ㄤ粩緇嗛槄璇諱唬鐮侊紝榪欑湅璧鋒潵灝卞儚浣犲凡緇忔坊鍔犳爣棰樸備綘瀹屽叏姝g‘錛屽涔堣仾鏄庣殑 you.The 鐨勪竴涓璞℃椂琛ㄦ槑鐨勭劍鐐規槸錛屽綋瀹冭閫変腑綣侀噸榪樻病鏈夊埌錛屾墍浠ヤ笉瑕佸お鑷ぇ榪樸備笅闈㈡槸涓庝互鍓嶇殑鑿滃崟欏癸紝涓婇潰鍒楀嚭鐨勬爣棰樻枃瀛楁湁宸埆錛? Ø 浣犻渶瑕佸憡璇?TextView 瀹冨彲浠ユ帴鍙楃殑鏂規硶璋冪敤 setFocusable 鐒︾偣銆? Ø 鑿滃崟涓婂競欏圭洰灝嗛渶瑕佽韓浠借瘉錛屽洜姝ゆ偍鍙互鍖哄埆寮鏉ワ紝鍦ㄩ夋嫨澶勭悊紼嬪簭鑿滃崟鍏冪礌鐨勫叾浣欓儴鍒嗐? 姝?濡傛垜鍒氭墠綆鍗曪紝鍙澧炲姞涓涓皬閮ㄤ歡鍒?ViewGroup 鐨?LayoutParams 瀵硅薄蹇呴』鏄庣‘榪欎竴瑙傜偣鍐呯粍瀹氫箟鐨勫璞°備緥濡傦紝鍦ㄨ繃鍘?setLayoutParams 鏂規硶璋冪敤錛屼綘蹇呴』閫氳繃鍦?LinearLayout.LayoutParams 瀵硅薄銆備綘蹇呴』閫氳繃姝g‘鐨勫瓙綾葷殑甯冨眬鍙傛暟錛屾垨鏈?鍣ㄤ漢灝嗕綘鎵斿湪榪愯鏃跺紓甯搞? 姝e鎴戜互鍓嶈榪囷紝涓轟簡浣胯彍鍗曪紝鎴戝皢娣誨姞涓や釜鏂囨湰鍏冪礌鍑犱箮瀹屽叏涓鏍鳳紝浠ュ墠涓婂競銆備負璐柟渚匡紝鎴戜笉浼氬湪榪欓噷涓涓鍒椾婦銆備竴瀹氳鍙傜収鏁翠釜欏圭洰錛屼互婊¤凍浣犵殑濂藉蹇冦傜幇鍦紝浣犳妸鎵鏈夌殑鑿滃崟欏瑰埌浣嶏紝鏄椂鍊欏鍏惰繘琛屼慨鏀規椂錛屾帴鏀舵垨澶卞幓鐒︾偣 鐒︾偣騫磋交鐨勮崏铚?... 銆? Code Listing 3-5. Creating a Focus Listener OnFocusChangeListener focusListener = new OnFocusChangeListener() { public void onFocusChanged(View v, boolean hasFocus) { adjustTextColor(v, hasFocus); } }; private void adjustTextColor(View v, boolean hasFocus) { //Dangerous cast. Be sure you are //listening only to TextView focus changes // or this could go horribly wrong. TextView t = (TextView)v; if (hasFocus) t.setTextColor(Color.RED ); else t.setTextColor(Color.WHITE ); } 姝ゅ錛屾偍蹇呴』娣誨姞浠ヤ笅琛屽搴斾簬姣忎釜鑿滃崟涓夋嫨鍏冪礌闄勫姞鐒︾偣鏇存敼渚﹀惉鍣ㄥ璞★細 ItemOne.setOnFocusChangeListener(focusListener); 闅?鐫鍦版柟鍚紬錛屾偍鐜板湪姣忔閫氱煡涓涓彍鍗曡绱犳敹鐩婃垨澶卞幓鐒︾偣銆傚湪鏇村厛榪涚殑涓昏彍鍗曪紝榪欎釜鏂規硶鍙互澧炲姞鍦版柟鐨勫艦璞¤漿鍙橈紝鍔ㄧ敾錛屼笁緇寸垎鐐告垨鍏朵粬濂囨墠閭﹀浘褰㈡晥鏋溿傚湪榪?涓緥瀛愪腑錛屾偍灝嗕笉寰椾笉婊¤凍浜庝粎浠呮敼鍙樻枃瀛楃殑棰滆壊銆傜幇鍦紝鐢ㄦ埛鍙互鍛婅瘔閫氳繃棰滆壊鐨勫彉鍖栵紝鍏朵腑鑿滃崟欏癸紝紿佸嚭鏄劇ず錛屾偍闇瑕佺殑鏃跺欎綔鍑哄弽搴旓紝浠栦滑鎸変腑蹇冮敭閫夋嫨涓涓?欏圭洰銆? 鎻愮ず錛氬畠鍙兘閫氳繃浣跨敤 setTextColor 錛?ColorStateList 棰滆壊錛夋柟娉曪紝璇ユ柟娉曟槸璐交钀藉疄鏂囨湰綆鍗曠殑鏂瑰紡涓哄熀紜鐨勪富瑕?menu.There 涓涓?TextView 閲嶇偣錛屾病鏈夐噸鐐癸紝騫墮夊畾棰滆壊鎬繪槸寰堝鏂規硶鍙互瀹炵幇涓涓洰鏍囷紝涓涓緢濂界殑 IDE 涓紝鎴戝彧鏄夋嫨浜嗘洿閫氱敤鐨勶紙鍥犱負鎴?甯屾湜浣犵殑搴旂敤瓚呰秺鏂囨湰鑿滃崟錛夈傛湁鍏充嬌鐢?setTextColor 淇℃伅錛岃鍙傞槄鏂囦歡 Android 鍦?http://code.google.com/android /reference/android/widget/TextView.html 錛?setTextColor 錛堟暣鍨嬶級銆? 鍗曞嚮騫墮夋嫨媧誨姩 Code Listing 3-6. Adding a Selection Listener OnClickListener clickListener = new OnClickListener() { public void onClick(View v) { String text = "You selected Item: "; switch (v.getId()) { case IdOne : text += "1"; startActivity( new Intent(MainMenu.this, Login.class)); break; case IdTwo : text += "2"; startActivity( new Intent( "com.apress.example.CUSTOM_VIEW")); break; case IdThree : text += "3"; break; } //We'll get to the following line in a bit status.setText(text); } }; 浠ュ墠鐨?switch 璇彞鏄皟鐢?setID 鍥炴潵鐨勫師鍥犲綋鎮ㄦ渶鍒濆垱寤哄茍閾鴻 TextView 閮ㄤ歡銆傚綋涓涓彍鍗曢」琚変腑鎴栨寚閽堢偣鍑伙紝鐨?onClick 鍑芥暟琚皟 鐢紝騫墮氳繃鐩稿簲鐨勮鍥炬槸浣滀負鍙傛暟銆傛偍灝嗚礋璐e鏌ワ紝浠ョ‘瀹氬摢浜涜彍鍗曢」琚変負閫氳繃瑙嗗浘 ID 銆傝繖浣挎偍鍙互閲囧彇鐨勮彍鍗曚腑閫夋嫨閫傚綋鐨勮鍔ㄣ傞氳繃榪欑鏂瑰紡錛屾偍鍙互鍒囨崲 鍒板厛鍓嶅畾涔夌殑鐧誨綍灞忓箷錛屼綘鍗沖皢浼氫笌 startActivity 鏂規硶璋冪敤鍐欏叆鑷畾涔夎鍥俱? 榪樻槸鏈夌暀涓嬬殑涓灝忔錛屽鏋滀綘鍦ㄧず渚嬩唬鐮佷腑鐨?onCreatefuction 鐨勫簳閮紝浣犱細鐐瑰畠銆備綘闇瑕佹坊鍔犱竴涓偣鍑葷洃鍚埌瑙嗗浘銆備笅闈㈡槸搴旇榪愯鍦ㄤ綘寤虹珛鐨勯儴浠舵竻鍗曡錛? ItemOne.setOnClickListener(clickListener); 鍥為【 鑷畾涔夌敤鎴風晫闈㈡覆鏌撶殑鐢誨竷 榪?鏄綘鍑鴻娊閮ㄥ垎娓告垙寮鍙戝晢涓鐩村湪絳夊緟 for.Android 鍏佽浣犲畾涔変竴涓嚜瀹氫箟瑙嗗浘瀵硅薄鍙槸閫氳繃鎵╁睍瑙嗗浘綾誨拰鎵ц OnDraw 鏂規硶銆備負浜嗘紨紺鴻嚜瀹氫箟瑙嗗浘鍦?鍔ㄧ敾寰幆涓繍琛岋紝鎴戝凡緇忎粠鏃ч噾灞卞競鐨勬帰绱㈠睍紺轟竴浜涘惎紺烘垜浠浣曠湅寰呭姩鐢誨拰澹伴煶銆傛偍鍙互鍦?http://www.exploratorium.edu /listen/index.php 鏇村鍏充簬鍗氱墿棣嗗拰鏈夊叧鐨勫睍瑙堛備綘鍙互璐拱 http://www.nature.com/neuro/journal /v7/n7/full/nn1268.html 縐戝鐧界毊涔︺? Ø 瀹炴柦鎰忚鐨?Android Ø 緇樺埗鍒板睆騫曚笂浣跨敤 Canvas 瀵硅薄 Ø 鍒涘緩鍔ㄧ敾寰幆 Ø 淇敼錛屽茍浠庢椿鍔ㄨ嚜瀹氫箟瑙嗗浘浜や簰 鑷畾涔夎鍥? Code Listing 3-7. Simple Custom View Declared in the CanvasExample Activity protected class CustomView extends View { public void onDraw(Canvas canvas) { Paint p = new Paint(); p.setColor(Color.WHITE ); canvas.drawText("Yo!", 0, 25, p); } } 紲濊春錛佽緭鍏ユ枃瀛楄繖鍑犲彞錛屼綘鐜板湪鏄嚜宸辯殑鑷畾涔夐儴浠墮獎鍌茬殑鎵鏈夎呫傚綋鐒訛紝瀹冨彧鏄墦鎷涘懠錛屽儚鎴?17 宀佹湅鍏嬭〃濡癸紝浣嗘垜鎯充綘蹇呴』浠庢煇涓湴鏂瑰紑濮嬨傚浜庨偅浜涗綘鍦ㄤ笌 GameCanvas 鐨勭粡楠屽璞$殑 Java ME 錛岃繖搴旇寰堢啛鎮夈傝鎺ユ敹 OnDraw 涓懠鍙紝鎮ㄩ渶瑕佽緗綔涓烘牱鏈椿鍔ㄧ殑涓昏鍐呭鏌ョ湅銆備綘蹇呴』浠紡浠g爜錛屽皢瀹炰緥鍖栵紝騫朵嬌鍏舵垚涓哄綋鍓嶈鍥俱備唬鐮佹竻鍗?3-8 鏄劇ず浜?CanvasExample 媧誨姩鐨勫瑙傘? Code Listing 3-8. Activating a Custom View CustomView vw = null; public void onCreate(Bundle args) { super .onCreate(args); vw = new CustomView(this ); setTitle("Bounce or Pass, sounds changes everything"); setContentView(vw); } 浣犱負浣犵殑鏍峰搧媧誨姩鐨勫悕縐幫紝鍥犱負浣犳病鏈夌粰瀹冧竴涓簲鐢ㄧ▼搴忕殑鍚嶇О銆傜劧鍚庯紝瀹冨彧鏄竴涓垱寤烘柊 CustomView 瀵硅薄錛屽茍璁劇疆瀹冧負褰撳墠鍐呭瑙嗗浘鐨勯棶棰樸傝繖灝嗚皟鐢?鎮ㄧ殑鑷畾涔夐儴浠跺唴鐨?OnDraw 鏂規硶錛屽茍鏄劇ず鎮ㄧ殑鏈夌偣涓嶅悎甯歌鐨勯棶鍊欍傛偍鐜板湪鏈変竴涓帉鎻″湪闈炲父鍩烘湰鐨勭粯鐢繪柟寮忓埌灞忓箷涓娿傛偍鐜板湪搴旇鍙互榪涘叆鏇村鏉傜殑娓叉煋鍜?鍔ㄧ敾鐨勫驚鐜紑濮嬨? 娉?鎰忥細濡傛灉浣犳兂瀹炵幇鑷繁浠ュ鐨勬祻瑙堣嚜宸辯殑鍔ㄧ敾寰幆 / ViewGroup 灞傛錛屽茍寤虹珛涓?SurfaceView 寰幆鐮旂┒瀵硅薄銆備綘鍙互鎵懼埌榪欎竴 http://code.google.com/android /reference/android/view/SurfaceView.html 瀵硅薄鏂囦歡銆? 鍔犺澆闊抽鍜屽浘鍍? Code Listing 3-9. Initializing the CustomView protected class CustomView extends View { Context ctx; Paint lPaint = new Paint(); int x_1=0,y_1=0; MediaPlayer player = null; Bitmap ball = null ; boolean running = true ; CustomView(Context c) { super(c); player = MediaPlayer.create (c, R.raw.bounce ); BitmapDrawable d = (BitmapDrawable) getResources().getDrawable(R.drawable.theball ); ball = d.getBitmap(); ctx = c; } ... } 鍦ㄦ瀯閫犲嚱鏁頒腑錛屼綘閫氳繃 R.java 瑁呰澆甯告暟鐨勫弽寮瑰獟浣撹祫婧愪粠 / 姘村簱 / 鍘熷浣嶇疆鐨勬枃浠躲傚洜涓轟綘鍋氫簡鍑犱釜鍏朵粬璧勬簮綾誨瀷姝や箣鍓嶏紝浣犲簲璇ユ槸涓涓佹墜浜嗐傛偍榪橀渶瑕佸姞 杞戒竴涓紝灝嗕綔涓?“ 鐞冨緱鍑虹殑褰㈣薄銆?” 浣犺繖鏍峰仛鐨勮祫婧愮鐞嗗櫒浣跨敤瀵硅薄錛岃繖鏄粠涓婁笅鏂囧璞?etrieved 銆傝櫧鐒朵綘娌℃湁鏄庣‘浠庤祫婧愬姞杞戒綅緗箣鍓嶇殑褰㈣薄錛岃繖濂藉儚鍑?涔庝換浣曞叾浠栬祫婧愯礋杞界殑浠g爜銆? 瀹炴柦鐜紝瀹炴柦寰幆錛屽疄鏂?... Code Listing 3-10. The Core of the Animation Loop public void onDraw(Canvas canvas) { //Draw the white background Rect rct = new Rect(); rct.set(0, 0, canvas.getBitmapWidth(), canvas.getBitmapHeight()); Paint pnt = new Paint(); pnt.setStyle(Paint.Style.FILL ); pnt.setColor(Color.WHITE ); canvas.drawRect(rct, pnt); //Increment the X and Y value for the sprites x_1+=2; y_1+=2; //Reset the loop when the balls drift offscreen. if (x_1 >= canvas.getBitmapWidth()) { x_1 = 0; y_1 = 0; } //Draw ball 1 drawSprint(x_1, y_1, canvas); //Draw ball 2 drawSprint(canvas.getBitmapWidth() - x_1, y_1, canvas); if (running) invalidate(); } 浠庨《閮ㄥ紑濮嬶紝鎮ㄧ殑絎竴涓櫧鑹茬殑鑳屾櫙浣跨敤 paintstyle 瀵硅薄鍜岃皟鐢?canvas.drawRect 銆傛補婕嗗璞★紝緇撳悎 Rectangle 瀵硅薄錛屽皢鍛婅瘔鐢?甯冪敾涓涓櫧鑹茬洅瀛愶紝瑕嗙洊鏁翠釜灞忓箷銆傛帴涓嬫潵錛屾偍灝嗛掑 x 鍜屼綘鐨勭悆 Sprite 鐨?y 鍊箋傜劧鍚庯紝鎮ㄩ渶瑕侀噸鏂拌緗粬浠紝濡傛灉浠栦滑宸茬粡婕傝繃鍘誨睆騫曠殑鑼冨洿錛屽茍鏈緇堢粯鍒?鐢ㄨ嚜宸辯殑 drawSprite 緇欎粬浠墦鐢佃瘽銆備唬鐮佹竻鍗?3-11 鏄劇ず浜嗚鍑芥暟鐨勫唴瀹廣? Code Listing 3-11. Drawing a Bitmap protected void drawSprint(int x, int y, Canvas canvas) { canvas.drawBitmap(ball, x, y, lPaint); } 榪欎釜鍔熻兘錛岀幇鍦紝鍙槸涓涓畝鍗曠殑璋冪敤 drawBitmap 鏂規硶銆傛垜宸茬粡鍒嗙鍑烘潵錛岃繖縐嶆柟娉曞彧鏄洜涓虹粯鍒跺湪鍙︿竴鍦哄悎闆ⅶ鍙兘闇瑕佹瘮榪欎釜綆鍗曠殑渚嬪瓙鍔熻兘銆傛渶 鍚庯紝鍥炲埌 OnDraw 鍑芥暟錛屼綘浼氭墦鐢佃瘽緇欎綘鐨勫彧鏈夋棤鏁堣繍琛屾爣蹇楁槸鐪熷疄鐨勩傝皟鐢ㄦ棤鏁堢殑鐪嬫硶鏄?Android 鐨勫己榪噸緇樼殑棣栭夋柟寮忋傚湪榪欑鎯呭喌涓嬶紝鎮ㄨ嚜宸辨棤鏁堬紝榪欏皢璋?鐢?OnDraw 涓紝鏁翠釜榪囩▼涓紝鍐嶅害寮濮嬨傚鏋滀綘綆鍗曞湴璁劇疆榪愯鐨勬爣蹇楄櫄鍋囨殏鍋滄垨閫鍑哄拰鏃犳晥鏃跺啀鎭㈠瀹冪殑鍔ㄧ敾搴旇鐣欏湪鍚屽叾姣嶅叕鍙告椿鍔ㄧ殑閲嶇偣姝ラ銆? 娣誨姞鍜屾帶鍒跺0闊? Code Listing 3-12. Playing and Reloading Audio if (playSound && canvas.getBitmapWidth() - x_1 -16 == x_1 + 16) player.start(); if (x_1 >= canvas.getBitmapWidth()) { x_1 = 0; y_1 = 0; player.stop(); player.release(); player = MediaPlayer.create (ctx, R.raw.bounce ); } 姝e鎮ㄥ彲鑳藉凡緇忔敞鎰忓埌錛屼綘寮濮嬮煶棰戞挱鏀炬椂錛屽皬綺劇伒錛?16 鍍忕礌榪滅瀵規柟銆傝繖鏄竴涓病鏈夎璐跨殑鏃墮棿錛岃闊抽寮濮嬨傛垜瑕佹寚鍑猴紝榪欐洿鍔犺瘉鏄庢垜涓嶈兘緙栬緫闊抽鏂囦歡鑰屼笉 鏄拡瀵逛竴涓己涔忔晥鐜囩殑闊抽璐熻嵎鍜?Android 鎾斁鏃墮棿銆傛偍榪樺繀欏葷‘淇濅互鎾斁闊抽鍙湁 playSound 甯冨皵鏄湡瀹炵殑銆傝繖涓彉閲忔槸涓綾葷殑媧誨姩鍦ㄥ叾涓嚜瀹氫箟瑙嗗浘瀹氫箟 鐨勬垚鍛樸備嬌鐢ㄦ甯冨皵錛屼綘浼氬緱鍒頒簡鏉ヨ嚜鍐呴儴鐨勫睆騫曟椿鍔ㄨ嚜瀹氫箟瑙嗗浘綾葷殑鎺у埗銆傝鎵撳紑鍜屽叧闂煶棰戯紝鎮ㄧ幇鍦ㄥ彧闇瀹炴柦 Code Listing 3-13. Reacting to Key Events public boolean onKeyDown(int key, KeyEvent kc) { if (key == KeyEvent.KEYCODE_DPAD_CENTER ) { playSound = !playSound; return true; } return super.onKeyDown(key, kc); } 姝や唬鐮佸簲綾諱技浜庝綘濡備綍椹沖洖浜嗗湪絎?2 绔犳伓浣滃墽鐨勫簲鐢ㄣ? 鎶婂畠鍚屽湪涓璧? 鎻愮ず錛氫嬌鐢ㄦ墍鏈変綘瀛﹀埌浜嗗湪鏈珷涓紝寤虹珛榪欑騫繪兂錛屽畠鍖呭惈浜嗕竴浜涜鏄庢枃瀛楋紝浠ュ強杈圭晫浣跨敤 XML.When 媧誨姩寮濮嬩簡涓涓鏋訛紝浣嗗憟鐜扮殑 XML 鎻掑叆鍒伴傚綋鐨勪綅緗嚜瀹氫箟瑙嗗浘銆傚浜庤繖欏逛換鍔★紝鎴戝緩璁嬌鐢ㄧ殑瑙i噴錛屽茍涓鴻竟澧冪煩褰㈢浉瀵瑰竷灞錛?TextView 銆?
娉ㄦ剰錛氬鏋滄偍鏄Щ鍔ㄥ紑鍙戞柟闈㈢殑鏂版墜錛屽綋鍐沖畾濡備綍甯冪疆鎮ㄧ殑搴旂敤紼嬪簭鏃訛紝鎮ㄥ繀欏婚噸澶嶄綘鐨勫ご涓涓駭鍙抽摥錛?“ 縐繪錛岀Щ妞嶏紝縐繪銆?” 鐞嗘兂鎯呭喌涓嬶紝涓涓竷灞鐨勮璁″皢鎵鏈夊彲鑳界殑宸ヤ綔璁懼銆備簨瀹炰笂錛岃繖姘歌繙涓嶄細濂忔晥銆傚鏋滀綘榪愯搴旂敤鍦ㄥ涓數璇濅笂錛堝澶у鏁拌繍钀ュ晢瑕佹眰鎮ㄨ繖鏍峰仛錛夛紝灝嗛噸鐐規斁鍦ㄥ姩鎬佺殑錛岀浉瀵圭殑甯冨眬緇撴瀯銆傛垜淇濊瘉錛屼綘鐨勫睆騫曞ぇ灝忎粖鍚庡皢浠ヤ竴縐嶆垙鍓фх殑鏂瑰紡鍙樺寲銆傚噺灝戠粷瀵瑰?X/ Y 鐨勬暟閲忥紝騫朵繚鐣欓偅浜涗綘鍦ㄦ柟渚夸嬌鐢ㄦ壘鍒扮殑浣嶇疆 .
榪欏氨鏄畠 鈥斺?鐜板湪鍏佽鐢ㄦ埛杈撳叆鏂囧瓧錛屼綘鑾峰彇銆佹搷綰碉紝鐢氳嚦鏄劇ず涓涓璇濇鍖呭惈浜嗚淇℃伅銆傚共寰楀ソ錛佽姳涓縐掗挓杞繪媿鑷繁鍦ㄨ儗鍚庯紝鎴栦換浣曡兂鑶婂彲浠ユ嫎鐫鐨勫湴鏂廣?
鍒扮洰鍓嶄負姝紝鎮ㄦ帰璁ㄥ浣曚嬌鐢?XML 鏉ュ仛灞忓箷璁捐錛屼粎浠呬嬌鐢?“ 紺句氦 ” 鐢婚潰灞忓箷銆傛鏃訛紝浣犲凡緇忓浼氫簡濡備綍浣跨敤涓や釜鐨勬販鍚堜綋鍦ㄦ偍鐨勭櫥褰曞睆騫曘傛渶鍚庝竴绔欏叧浜?Android 閮ㄤ歡琛ㄨ揪錛屽氨闇瑕佸崟鐙嬌鐢ㄤ唬鐮佸緩绔嬪睆騫曞竷灞鐨勩?
寮曟搸鐩栦笅浣跨敤
閾鴻鑿滃崟欏?
鐜板湪鎮ㄥ彲浠ユ坊鍔犲崟涓彍鍗曞厓绱犮傚洜涓鴻繖灝嗘槸絎竴涓湪鐩稿綋閲嶅錛屾垜灝嗘彃鍏ュ拰瑙i噴鐨勭涓涓厓绱狅紝浣嗗叾浣欑殑鐣欑粰浣犵殑浣犺嚜宸辯殑璁懼銆傞殢鎰忔姄鍙栧湪 Apress 緗戠珯鐨勫畬鏁撮」鐩紝鐪嬪埌鑿滃崟欏逛紤鎭傚悓鏍峰湴錛屼綘浼氬~琛ヤ粬浠洿涓烘偍閫氳繃 Android 瑕佺礌鍚勫湴鐨勫彂灞曘?
浠g爜娓呭崟 3-4 鏄劇ず鐨勪唬鐮佹坊鍔犲崟涓彍鍗曢」銆?
涓轟簡澶勭悊鐒︾偣鏀瑰彉浜嬩歡錛屼綘蹇呴』鍒涘緩涓涓?OnFocusChangeListener 鎶借薄綾葷殑瀹炵幇銆傝紺轟緥鐨勭増鏈紝鍦ㄤ富鑿滃崟鍐呭畾涔夌被鐨勬椿鍔ㄥ湪褰撳湴錛屽皢綾諱技浜庝唬鐮?3-5 銆?
浣犲凡緇忕湅鍒板浣曠櫥璁板湪 oginscreen onClick 浜嬩歡錛屾墍浠ヤ綘搴旇鑳藉閫氳繃榪欎竴鑺?withouttrouble 鐨勫井椋庛備唬鐮佹竻鍗?3 鏈?6 鏃?鏄劇ず浜嗙ず渚嬩唬鐮佽幏鍙栭夋嫨鐨勪簨浠躲?
鍥為【 Java 椹卞姩鐨勪富鑿滃崟錛屼綘鍋氬埌浜嗗嚑涓噸瑕?things.First 錛屾偍鎵ц鍔熻兘浠ュ墠鍙兘閫氳繃 XML 鏂囦歡鐨勫竷灞銆傝櫧鐒朵笉瀹屽叏鍒囧悎瀹為檯鐨勫仛涓鏂歸潰錛屽畠浼氱粰浣犺凍澶熺殑宸ュ叿鏉ユ敼鍙樺拰瀹氬埗搴旂敤紼嬪簭鐨勫悓鏃惰繍琛?XML 瑙嗗浘銆?
絎簩錛屼綘娉ㄥ唽涓烘偍鐨勬墍鏈夎彍鍗曢」鐨勭劍鐐規敼鍙樹簨浠躲傚綋鐒︾偣鏇存敼渚﹀惉鍙紝浣犳敼鍙樹簡閲嶇偣欏圭洰錛屼互紿佸嚭鏄劇ず瀹冪殑棰滆壊銆傚湪瀹為檯搴旂敤涓紝瑕佽揪鍒板悓鏍風殑浜嬫儏鏇存湁鏁堢殑鏂規硶錛屼絾鎴戝亣璁句綘鎯蟲敼鍙樼殑涓滆タ浠f浛鏂囨湰棰滆壊澶氾紝鍙互璇達紝濂㈠崕銆?
絎?涓夛紝浣犲浼氫簡濡備綍鍊懼惉鍜屼綔鍑哄弽搴旂殑閫夋嫨浜嬩歡錛屾礊鎮夐」鐩変腑錛屽茍閲囧彇閫傚綋鐨勮鍔ㄦ槸 selection.Again 鍩虹涓婏紝瀵規墍鏈夐渶瑕佸皢閲嶇偣鏀懼湪鎵嬪睆騫曞皬閮ㄤ歡 鍑轟唬鐮侊紝寰寰鏄浉褰撴槀璐碉紝浣嗘槸浣跨敤浣犲垰鍒氬鍒扮殑宸ュ叿錛屼綘鍙互淇敼錛屽鍔狅紝浠ュ強鑷畾涔夎彍鍗曟垨宸ョ▼娓呭崟鏁版嵁鍜岀敤鎴峰亸濂戒負鍩虹錛屽悓鏃跺簲鐢ㄧ▼搴忔鍦ㄨ繍琛屻備絾鏄紝濡?鏋滄偍闇瑕佽幏寰楁洿澶氱殑涓撲笟濡備綍緇樺埗鍒板睆騫曚笂錛屼綘闇瑕佽緝灝戝井濡欏拰鏇翠唬鐮侀噸鐨勬柟娉曘?
榪欎釜渚嬪瓙灝嗗姩鐢諱袱涓悆瀵瑰鏂規梾娓革紝鐒跺悗鎴栬呮垨寮硅煩鍜岀Щ鍔ㄨ窛紱婚氳繃銆傝繖涓緥瀛愭槸涓轟簡琛ㄦ槑鍙嶅脊澹伴煶鍙互鐪嬪埌涔嬮棿鐨勪紶閫掑璞★紝鐪嬩粬浠浉浜掑脊鐞冧漢鐨勫尯鍒備唬鐮佹柟闈紝鎴戝皢婕旂ず浜嗕竴涓嚜瀹氫箟瑙嗗浘鍑犱釜閲嶈鏂歸潰錛?
鎮?鍙互鑷畾涔夊湪涓や釜鏂歸潰瑙嗗浘紿楀彛銆傜涓錛屾槸灝?View 綾匯傝繖浣挎偍鍙互閫氳繃婊氬姩鑷繁鍒涢犱竴涓?android.View 鍙鐨勫瓙綾葷殑 “ 宸ュ叿 ” 銆傚彟涓縐嶆柟娉曪紝鎮ㄥ氨 蹇呴』瀵硅嚜宸辯殑鎺㈢儲錛屾槸瀛愮被錛屽 TextView 錛岃繘搴︽潯錛屾垨 ImageView 鍜屼慨鏀瑰叾琛屼負鍙椾繚鎶ょ殑鏂規硶浣跨敤鐜版湁鐨勯儴浠躲傝繖涓緥瀛愭樉紺轟簡絎竴涓夋嫨錛屽洜涓?瀹冪殑鑼冨洿騫挎硾錛屾瘮杈冨鏄撶悊瑙c?
鍦ㄦ渶鍩烘湰鐨勫眰闈紝涓涓嚜瀹氫箟閮ㄤ歡閲嶅啓淇濇姢 OnDraw 鏂規硶銆備唬鐮佹竻鍗?3-7 鏄劇ず浜嗚繖鏍蜂竴涓柟娉曠殑涓涓ず渚嬨?
鍒涘緩娓告垙寰幆
鐢變簬鎵鏈夋父鎴忕▼搴忓憳浼氬憡璇変綘錛屽ぇ澶氭暟娓告垙錛屽叾鏍稿績錛屼竴涓笉鏂驚鐜?onsist 銆傜敤鎴瘋緭鍏ョ殑寰幆媯鏌ワ紝騫?鍦ㄦ杈撳叆鍜屼換浣曞叾浠栨父鎴忚鍔紝灞婃椂灝嗗埗璁㈡柊鐨勬鏋?/ 甯у湪鎮ㄧ殑紺轟緥搴旂敤紼嬪簭 screen.The 寰幆灝嗕笉浼氳耽寰楃殑澶嶆潅鎬у拰鐙垱鎬х殑浠諱綍濂栭」錛屼絾瀹冧細寰楀埌浣犲紑 濮嬭嚜宸辯殑 amerendering 寰幆銆?
鍦ㄦ偍灝嗙粯鍥?CustomView 寰楀埌錛屾偍闇瑕佸姞杞藉垵濮嬪寲紼嶅悗灝嗙敤浜庝竴浜涜祫婧愩備唬鐮佹竻鍗?3-9 鏄劇ず浜嗘柊鐨勬瀯閫?CustomView 鍖呮嫭灞閮ㄧ被鍙橀噺澹版槑銆?
浜嬩笉瀹滆繜錛屼唬鐮佹竻鍗?3-10 鏄劇ず浜?CustomView 瀵硅薄鐨?OnDraw 鏂規硶鏍峰瓙銆?
鐢變簬鍚閿欒闇瑕佽兘澶熸墦寮鍜屽叧闂袱涓弽寮逛簰鐩稿璞″0闊籌紝鎮ㄩ渶瑕佽緗煶棰戞瘮璧涳紝浠栦滑鎵擄紝鐒跺悗涓虹敤鎴峰緩绔嬩竴涓満鍒訛紝鎶婅繖涓澹伴煶鐨勫拰鍏抽棴銆?
瑕?鎾斁鐨勯煶棰戯紝鍦ㄤ唬鐮佷腑娣誨姞浠g爜娓呭崟 3 鏈?12 鏃?鍒頒互鍓嶇殑 OnDraw 鍑芥暟錛屽洜涓哄畠涔熷疄闄呬笂錛屾父鎴忔帶鍒跺洖璺傚綋鎴戣 “ 娓告垙寰幆錛?” 鎴戞寚鐨勬槸鏃犳晥鍛煎彨鍦?OnDraw 涓粨鏉燂紝灝嗚绔嬩竴涓噸緇?Android 鐨?UI 浜嬩歡寰幆銆傝璁頒綇錛?playSound 鏄竴涓竷灝斿甯?326-7524 鑷畾涔夎鍥俱?
鍦ㄤ唬鐮佺殑鏂規硶錛屽湪媧誨姩娓呭崟 3-13 銆?
濡傛灉鎮ㄥ凡緇忔寜鐓т竴鐩村瘑鍒囷紙鎴栨楠楋紝鍙槸涓嬭澆瀹屾垚鐨勯」鐩級錛屾偍搴旇鑳藉榪愯搴旂敤紼嬪簭錛岀湅鐨勫夠瑙夈傛柊闂諱腑蹇冩柟鍚戦敭鎵撳紑鍜屽叧闂煶棰戙備笌闊抽 璧烽錛屽畠搴旇鍍忎粬浠氳繃浜掔浉榪涜琛ㄥ喅錛岀湅璧鋒潵浠栦滑鍙嶅脊錛屽嵆璧板悇鐨勮礬銆傚湪榪欎釜渚嬪瓙涓紝鎴戞紨紺轟簡濡備綍鍒涘緩鑷繁鐨勮鍥劇被錛屽浣曠敤瀹冩潵鐢誨湪灞忓箷涓婏紝濡備綍寤虹珛涓涓父 鎴忔覆鏌撳驚鐜紝浠ュ強濡備綍鎺у埗錛岀畝鍗曠殑寰幆鍒╃敤鍏抽敭浜嬩歡銆?
浣跨敤鐢ㄦ埛鐣岄潰
鍦ㄦ湰绔犱腑錛屾偍宸茬粡浜嗚В錛岃緇嗭紝濡備綍甯冨眬灞忓箷浣跨敤 Android 鐨?XML 鏋舵瀯錛屼互鍙婂浣曠浉浜掍綔鐢ㄥ拰淇敼浜嗕竴浜?Java 鐨?code.Next 榪愯鐨勬ā寮忥紝瀛︿範浜嗗浣?UI 閮ㄤ歡甯冨眬鍜岃鍥劇粍浣跨敤婧愮爜鍗曘傝繖鏄竴涓笉閭d箞瀹為檯搴旂敤 鐨?Android 鐢ㄦ埛鐣岄潰宸ュ叿錛屼絾閲嶈鐨勬槸鍘葷悊瑙g殑浣嗕負浜嗛氳繃銆傛渶鍚庯紝鎮ㄦ帰绱㈠緩璁?gamerendering 寰幆鐨勯噸瑕佸伐鍏楓傛偍鍔犲叆鍒版妸涓浜涚畝鍗曠殑澶氬獟浣撳拰鐢ㄦ埛鎺?鍒訛紝鍒涘緩浜嗕竴涓畝鍗曠殑鍚騫繪兂錛屽簲璇ヨ yourvery 璁ㄥ帉楝肩殑鏈嬪弸銆?
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/lihaifeng555/archive/2009/11/02/4757323.aspx
]]>
Activity: Android 搴旂敤紼嬪簭鐨刄I(User Interface)鍩烘湰緇勪歡銆?
Intent receiver: 鍙殢鏃惰鍚姩鏉ュ鐞咺ntent錛屽茍鎵ц鍏朵換鍔°?/p>
Service: 闈濽I鍔熻兘鐨勫悗鍙板鐞嗙粍浠躲?/p>
Content provider: 璺ㄧ▼搴忕殑鍏變韓璧勬枡涔嬪瓨鍌ㄨ呫?/p>
Android vs. Java ME vs. BREW
涓涓狟REW搴旂敤紼嬪簭錛屽湪鎵鏈夌粷澶у鏁版儏鍐典笅錛屾槸鐢變竴涓崟鐙殑灝忕▼搴忕粍鎴愶紝榪欎釜灝忕▼搴忔槸閫氳繃鎺ユ敹鍜屽彂閫佹椿鍔ㄤ笌鎵嬫満鐨勫叾浠栭儴鍒嗛氫俊鐨勩傚彟涓鏂歸潰錛屼綘鍙互灝嗕竴涓狫ava ME搴旂敤鐪嬪仛Midlet綾葷殑鎵╁睍銆傝繖涓狹idlet鏈夊惎鍔ㄣ佸仠姝€佹殏鍋溿侀敭澶勭悊錛坘ey handling錛夌殑鍔熻兘錛屽茍涓斿彲浠ュ畬鎴愪換浣曟墜鏈哄拰搴旂敤鐨勪氦浜掋備竴涓狫ava ME搴旂敤紼嬪簭閫氬父鐢變竴涓崟鐙殑Midlet緇勬垚銆?/p>
Android搴旂敤紼嬪簭鏈夎澶氭椿鍔紝閫氳繃AndroidManifest.xml鏂囦歡錛岃繖浜涙椿鍔ㄥ彲浠ヨ娉ㄥ唽鍦ㄦ墜鏈轟腑銆?鍦ㄩ潰鍚慉ndroid鐨勫紑鍙戜笌闈㈠悜鍏朵粬鎵嬫満寮鍙戝伐鍏峰寘鐨勫紑鍙戜箣闂達紝Android鐨刴ultiactivity鏋舵瀯鎴栬鏄殑浠栦滑涔嬮棿涓昏鐨勫尯鍒傛鏄繖涓簨瀹炰嬌緙栧啓妯″潡鍖栥佸垎鍓茬殑浠g爜錛坢odular, compartmentalized code錛夋洿瀹規槗銆傚湪BREW鍜孞ava ME涓紝寮鍙戜漢鍛樺彲浠ユ墽琛屽湪Midlet鎴栧皬紼嬪簭鑼冨洿鍐呯殑澶ч儴鍒嗗姛鑳姐傚湪Android涓紝浣犲彲浠ュ啓涓涓椿鍔ㄣ佸唴瀹瑰鐞嗙▼搴忥紙content handler錛夈佹剰鍥炬帴鏀跺櫒錛坕ntent receiver錛夈佹垨鏈嶅姟浠ュ簲瀵瑰嚑涔庝換浣曚笢瑗褲備竴鏃︿綘緙栧啓浜嗙紪杈戞枃鏈枃浠剁殑媧誨姩錛岄氳繃鍙戦佸拰鎺ユ敹鎰忓悜鐨勮鍔紝鎮ㄥ彲浠ュ紩鐢ㄨ繖涓椿鍔ㄥ湪鎮ㄥ皢鏉ユ墍鏈夌紪鍐欑殑搴旂敤涓傝繖涓繖騫朵笉鏄錛岃繖縐嶆灦鏋勫湪BREW鎴朖ava ME涓槸涓嶈兘瀹炵幇鐨勶紝浠栦滑鍙槸蹇呴』鍦↗ava鍜孋鎴朇++緙栫▼鐨勫熀紜涓婏紝鎴栧湪BREW涓氳繃綣佺悙鐨勬墿灞曞疄鐜幫紝鑰屼笉鏄騫蟲粦鍦伴泦鎴愬埌搴旂敤妗嗘灦涓?/p>
Functionality
灝卞儚Midlet錛屾椿鍔ㄤ嬌鐢ㄤ簡涓緋誨垪鐨勫姛鑳戒笌澶栭潰鐨勪笘鐣岃繘琛屼氦鎹€傚湪浠栫殑鍩虹涓婏紝浣犵紪鍐欑殑媧誨姩蹇呴』閲嶅啓鏂規硶OnCreate錛屼綘榪樿閲嶅啓鍏朵粬鍔熻兘錛屽寘鎷細onStop銆乷nPause銆乷nResume鍜宱nKeyDown銆傝繖鍑犱釜鍔熻兘鍙互璁╂渶澶ч檺搴﹀湴灝嗕綘寮鍙戠殑媧誨姩緇戝畾鍒癆ndroid鎵嬫満涓傚湪榛樿鎯呭喌涓嬶紝鍦‥clipse涓垱寤烘柊鐨凙ndroid搴旂敤紼嬪簭灝嗘墽琛屼竴涓?#8220;Hello錛學orld”搴旂敤紼嬪簭銆傛垜浼氬憡璇変綘濡備綍浠庤繖涓熀鏈簲鐢ㄥ埌鍔熻兘榻愬叏鐨勭敾闈€?/p>
濡備綍娣誨姞鍥劇墖(Image)璧勬簮
棣栧厛灝嗗浘鐗囪祫婧?渚嬪menu_background.jpg)鐩存帴鎷瘋礉鍒?res/drawable鏂囦歡澶逛腑銆傛鏃訛紝Eclipse鐨凙ndroid鎻掍歡(Android Plug-In)浼氳嚜鍔ㄥ皢涓涓柊鐨処D鍊兼坊鍔犲埌R.java閲屻傛墍浠.java鏂囨。涓細澶氬姞浜嗕竴琛屾寚浠ゅ涓嬶細
public static final int menu_background=0x7f020001;
鍦ㄥ簲鐢ㄧ▼搴忓皢灝辯敤姝D鍊兼潵鍙栧緱榪欎釜鍥炬爣鏂囦歡錛屽茍鏄劇ず鎴栧鐞嗗畠銆?/p>
濡備綍瀹氫箟XML甯冨眬 (Layout) 鏂囦歡
鍒氭墠宸茬粡鏂板浜嗕竴涓浘鐗囪祫婧愭枃浠躲傛鏃訛紝鍦ㄥ畾涔夊竷灞XML鏂囦歡涓紝灝卞彲浠ュ紩鐢ㄦ鍥劇墖銆傝繖浜涘竷灞XML鏂囦歡閮芥斁鍦ㄥ湪/res/layout鏂囦歡澶逛腑錛屽叾涓璄clipse鐨凙ndroid鎻掍歡宸茬粡鐢熸垚浜嗕竴涓猰ain.xml鏂囦歡銆傜幇鍦紝浣犲彲鍒╃敤Eclipse鐨?File>New>File鑿滃崟閫夐」鏉ョ敓鎴愭柊甯冨眬XML鏂囦歡錛屼緥濡傦細splash.xml銆傜劧鍚庯紝浠ain.xml鍏у涓烘ā鏉匡紝灝嗕箣鎷瘋礉鍒版柊鐨剆plash.xml閲岋紝涓嬩竴姝ョЩ鍔?lt;TextView>騫朵笖澧炲姞<ImageView>錛屽唴瀹瑰涓嬶細
<ImageView android:src="@drawable/menu_background"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</ImageView>
鍦ˋndroid鐨刋ML甯冨眬鏂囦歡閲岋紝浣跨敤@drawable/灝辮兘杞繪澗鍦板紩鐢?res鏂囦歡澶逛腑鐨勮祫婧愶紝渚嬪涓婇潰鐨勭殑android:src="@drawable/menu_background"銆傛澶栵紝layout_width鍜宭ayout_height 鍒欒鏄庤繖涓狪mageButton鏄劇ず鍑轟締鐨勫ぇ灝?Size)銆俿plash.xml涔熸垚鐐轟竴闋呮柊鐨勮硣婧愩傛墍浠ュ湪R.java瑁′篃鏈冭嚜鍕曠敘鐢熸柊鐨勪竴琛岋紝濡備笅錛?/p>
public static final int splash=0x7f030001;
緇樺埗鍚姩鐢婚潰
鐜板湪錛屼綘鐨勫垵濮嬬敾闈㈣瀹氫箟瀹屾垚錛屽彲浠ユ縺媧誨拰鏄劇ず銆備綘鐜版湁鐨凙ndroid媧誨姩宸插埗瀹氫簡main.xml錛屾墍浠ヤ綘瑕佽漿縐誨埌鏂扮殑鍒濆甯冨眬銆備負浜嗗垏鎹紝鏇存敼OnCreate鏂規硶涓殑浠g爜錛?
setContentView錛圧.layout.main錛夛紱
涓?
setContentView錛圧.layout.splash錛夛紱
榪愯搴旂敤紼嬪簭錛岀湅鐫浣犳柊鍒涘緩鐨勫惎鍔ㄧ敾闈€傚埌鐩墠涓烘錛屽鏋滀綘寰楀埌浜嗛敊璇俊鎭紝媯鏌ヤ互紜浣犵殑鍚嶅瓧鏄惁鍖歸厤銆傚鏋滃浘鐗囨病鏈夋樉紺猴紝紜繚瀹冭姝g‘鍦版斁緗湪res/rawable鏂囦歡澶癸紝騫秙plash.xml搴旂敤浜嗘紜殑鍚嶇О鍜屾枃浠躲?
鏃墮棿鍙互瑙e喅浠諱綍闂
鍚姩灞忓箷寮濮嬪睍鐜幫紝浣嗗惎鍔ㄧ敾闈㈠崟鐙綔鏃犺亰鐨勫簲鐢ㄧ▼搴忥紝鎵浠ヤ綘闇瑕佽繘鍏ヤ富鑿滃崟銆備綘浼氫嬌鐢ㄧ畝鍗曠殑鍐呭祵瀹氫箟綰跨▼鏉ュ畬鎴愮殑瀹氭椂鍣紝鏈変竴浜涘父鏁伴渶瑕佸湪瀹氫箟綰跨▼鍓嶅垵濮嬪寲銆備負浜嗙湅涓婂幓瀹屾暣錛屾垜灝嗗寘鎷叏閮ㄧ殑OnCreate鏂規硶銆備唬鐮佸涓嬨?
Code Listing 2-1. Timing the Splash Screen
long m_dwSplashTime = 3000;
boolean m_bPaused = false ;
boolean m_bSplashActive = true ;
public void onCreate(Bundle icicle)
{
super .onCreate(icicle);
//Draw the splash screen
setContentView(R.layout.splash);
//Very simple timer thread
Thread splashTimer = new Thread()
{
public void run()
{
try
{
//Wait loop
long ms = 0;
while (m_bSplashActive && ms < m_dwSplashTime)
{
sleep(100);
//Advance the timer only if we're running.
if (!m_bPaused)
ms += 100;
}
//Advance to the next screen.
startActivity(new Intent(
"com.google.app.splashy.CLEARSPLASH"));
}
catch (Exception e)
{
Log.e("Splash", e.toString());
}
finally
{
finish();
}
}
};
splashTimer.start();
}
鍒扮幇鍦?錛?浣犳墠寮濮嬬湅鍒頒竴浜?Java 浠g爜銆傝繖涓畝鍗曠殑綰跨▼鐩村埌榪愯鏃墮棿璁℃暟鍣ㄨ秴榪?m_dwSplashTime 鎵嶅仠姝€傝櫧鐒舵湁瀹炵幇涓涓鏃跺櫒澶氱鏂瑰紡錛岄夋嫨榪欑鏂瑰紡鏈変袱涓師鍥狅細
姝よ鏁板櫒鍙互鏆傚仠銆傝璁℃椂鍣ㄥ彧鏈塵_bPaused鏍囧織涓篺alse鏃舵墠鎺ㄥ姩銆傛濡備綘灝嗙湅鍒板湪涓鍒嗛挓鍐咃紝濡傛灉浣犺皟鐢ㄦ椿鍔ㄧ殑OnPause鏂規硶錛屽彲浠ユ柟渚挎殏鍋滆鏃跺櫒銆傝繖騫朵笉鎬繪槸瀵瑰惎鍔ㄧ敾闈㈢殑闇姹傦紝榪欏鍏朵粬浠ユ椂闂翠負鍩虹鐨勪笟鍔℃槸閲嶈鐨勩?
縐誨姩鍒頒笅涓涓睆騫曞緢綆鍗曪紝鍙鏀瑰彉鐨刴_bSplashActive鏍囪涓篺alse銆傛帹榪涘埌涓嬩竴涓睆騫曪紝濡傛灉浣犳墽琛岃繖鍦ㄦ椂灝氾紝涓嶈姹備綘浣滃嚭鐨勮鍔紝鐒跺悗鍙栨秷鏇翠紶緇熺殑璁℃椂鍣ㄣ?
鏈変簡榪欎釜浠g爜錛屽彧瑕佷綘浠ユ縐掍負鍗曚綅璁劇疆m_dwSplashTime錛屼綘搴旇鐪嬪埌鍚姩鐢婚潰銆傚綋鏃墮棿鍒頒簡鎴栫敤鎴蜂嬌鐢ㄦ寜閿腑鏂簡鍚姩鐢婚潰錛宻tartActivity灝嗚璋冪敤銆俧inish鍙互鍏抽棴鍚姩媧誨姩錛屼嬌鐢ㄦ埛涓嶅繀閫氳繃浠庝富鑿滃崟涓婇夋嫨Back榪斿洖銆備綘闇瑕佹墽琛屼竴欏規椿鍔紝鎺ュ彈CLEARSPLASH鎰忓浘鐨勮鍔ㄣ備笌姝ゅ悓鏃訛紝璁╂垜浠洖欏句竴浜涘叾浠栭噸瑕佹椿鍔ㄧ殑鏂規硶浣犻渶瑕侀噸鍐欍?
鏆傚仠錛屾仮澶嶏紝鍐叉礂錛岄噸澶?
鐢變簬鍛煎叆鐢佃瘽錛岀煭淇℃垨鍏朵粬涓柇錛屼綘鐨勬椿鍔ㄨ鎸傝搗鏃訛紝鏆傚仠鍚姩璁℃椂鍣紝濡備笅錛?
protected void onPause()
{
super.onPause();
m_bPaused = true;
}
瀵逛簬榪欎簺澶ч儴鍒嗚鐩栫殑鏂規硶 錛?鍦ㄥ仛浠諱綍浜嬫儏涔嬪墠 錛?浣犻渶瑕佽皟鐢ㄨ秴綾匯傚鏋滀綘鏌ョ湅璁℃椂鍣ㄧ嚎紼嬶紝濡傛灉m_bPaused鏄痶rue錛屼綘浼氱湅鍒拌礋璐h窡韙椂闂寸殑MS璁℃暟鍣ㄤ繚鎸佹椂闂存病鏈夊墠榪涖傚湪榪欎竴鐐逛笂錛屾垜鐩鎬俊浣犲彲浠ョ寽嫻媜nResume鐨勬牱瀛愶細
protected void onResume()
{
super.onResume();
m_bPaused = false;
}
褰撲綘鐨勫簲鐢ㄧ▼搴忔仮澶嶏紝璁℃椂鍣ㄧ嚎紼嬫坊鍔犳椂闂存仮澶嶅埌MS璁℃暟鍣ㄣ?
鍩虹鐨?Key Handling
鍦ㄦ椿鍔ㄥ唴錛孠ey Handling鏄鐞嗚鐩杘nKeyDown鏂規硶銆傛垜浠皢浣跨敤姝ゅ姛鑳藉厑璁哥敤鎴峰彇娑堜綘涓嶅畬緹庣殑鍚姩鐢婚潰銆傛濡傚湪鏈妭寮濮嬩綘鐪嬪埌鐨勮鏃跺櫒綰跨▼錛岄氳繃m_bSplashActive璁劇疆錛屼綘鍦ㄨ鏃跺櫒寰幆涓簡寮傚父璇彞銆備負浜嗗紓甯稿鐞嗭紝浣犲彧闇瑕侀噸鍐檕nKeyDown鏂規硶浣夸箣鍒囨崲鍚姩鏍囪涓篺alse銆備笅闈㈢殑浠g爜闇瑕佹坊鍔狅細
public boolean onKeyDown(int keyCode, KeyEvent event)
{
//if we get any key, clear the splash screen
super .onKeyDown(keyCode, event);
m_bSplashActive = false ;
return true;
}
鐜板湪 錛?褰撶敤鎴鋒寜涓嬩換鎰忛敭 錛?灞忓箷灝嗚鎺ㄨ繘鍒頒笅涓涓礬紼嬮氳繃璁℃椂鍣ㄥ驚鐜?
Clear intent
鏈変竴浠朵簨浣犻渶瑕佸湪鍚姩鐢婚潰涔嬪墠鍋?錛?鎴戠浉淇′綘鎯崇煡閬撴湁鍏?startActivity 鏂規硶璋冪敤銆傝繖閲屽簲璇ョ畝鍗曚粙緇嶄竴涓媔ntent銆侷ntent鏄竴涓璞★紝鍦ㄤ袱涓垨涓や釜浠ヤ笂媧誨姩銆佸唴瀹瑰鐞嗭紙content handlers錛夈佹剰鍥炬帴鏀跺櫒錛坕ntent receiver錛夈佹垨鏈嶅姟涔嬮棿錛屽彲浠ヤ綔涓轟竴涓氳浜嬩歡銆備綘浼氫嬌鐢╟om.google.app.splashy.CLEARSPLASH璋冪敤 startActivity 銆傚綋startActivity琚皟鐢ㄦ椂錛孉ndroid鎼滅儲鎵鏈夐厤緗竻鍗曟枃浠訛紝瀵繪壘宸叉敞鍐屼負CLEARSPLASH Intent action鑺傜偣銆?
浣犺澧炲姞涓涓柊綾籑ainMenu錛屽叾浣滀負涓昏彍鍗昦ctivity銆傚畠瑕佺戶鎵緼ctivity綾伙紝瀹炵幇OnCreate鏂規硶錛屽湪R.layout.main涓皟鐢╯etContentView鏂規硶銆備綘瑕佹墦寮鐨凙ndroidManifest.xml騫跺鍔犳柊鐨?activity 鍏冪礌銆傚湪 </activity> 緇撴潫絎︿箣鍚庯紝 浣犲簲璇ユ彃鍏ヤ互涓嬪唴瀹癸細
<activity android:name=".MainMenu"
android:label="@string/app_name">
<intent-filter>
<action android:name=
"com.google.app.splashy.CLEARSPLASH"/>
<category android:name=
"android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
紜畾媧誨姩鐨勫悕縐頒負 .MainMenu 銆傝繖浼氬憡璇?Android 鍔犺澆鍜岃繍琛?Java 綾匯傚湪 Intent filer 鏍囩涓?錛?娉ㄥ唽涓?com.apress.splash.CLEARSPLASH 鐨?Intent Action 銆傚湪鐜板疄涓紝鍚嶇О鎰忓浘鍙兘鏄痓eef.funkporium.swizzle錛屽彧瑕佸悕縐板湪startActivity璋冪敤鍜屽墠闈㈢殑Android閰嶇疆娓呭崟涓竴鑷達紝鎵鏈夋紜殑浜嬫儏搴旂戶緇彂鐢熴?
涓欏規椿鍔ㄧ殑鐢熷懡鍛ㄦ湡
Activity鐨勭敓鍛藉懆鏈熻鍖呮嫭鍦℅oogle鐨勬枃妗d腑銆備絾鏄紝濡傛灉浣犲厛浠旂粏鑰冭檻鐢熶駭Activity鐨勫簳灞傚師鐞嗭紝浣犱笉鑳介敊榪囪繖涓噸瑕佺殑淇℃伅銆傚湪榪欎竴鐐癸紝浣犵殑鍚姩鐢婚潰錛屼綘搴旇鍑嗗濂芥帹鍑恒?
涓轟簡璇存槑錛屾垜榪樺鍔犱簡浠ュ姛鑳藉湪鍚姩鐢婚潰媧誨姩涓細
protected void onStop()
{
super.onStop();
}
protected void onDestroy()
{
super.onDestroy();
}
濡傛灉浣犳柟鏂偣鍦ㄤ笂闈㈡椿鍔ㄧ殑鎵鏈夊姛鑳斤紝鍦ㄨ皟璇曟ā寮忎笅榪愯瀹冿紝浣犱細鐪嬪埌鏂偣涓庝笅闈㈤『搴忎竴鑷?
1. onCreate
2. onStart
3. onResume
4. 鍦ㄨ繖涓鐐逛笂錛屼綘鐨勬椿鍔ㄧ洰鍓嶅凡緇忚繍琛屻傚湪涓夌閽熷唴錛岃鏃跺櫒綰跨▼灝嗚揪鍒扮粨鏉燂紝騫惰皟鐢╯tartActivity緇撶畻鐨勬剰鍥俱備笅涓姝ワ紝瀹冨皢璋冪敤finish錛屽畠鍛婅瘔Android鍏抽棴鍚姩鐢婚潰媧誨姩銆?
5. onPause
6. onStop
7. onDestroy
5. onPause
6. onStop
7. onDestroy
浠庡紑濮嬪埌緇撴潫 Activity 錛?榪欐槸涓鑸殑鐢熷懡鍛ㄦ湡鏉ャ備綘鍙互鎵懼埌瀵圭敓鍛藉拰鏃朵唬鐨?Android 媧誨姩鏇村叏闈㈠湴鎶湶 錛?鍦ㄨ胺姝岀殑鏂囨。媧誨姩涓?http://code.google.com/android/reference/android/app/ Activity.html 銆備綘鐢氳嚦鍙互鎵懼埌婕備寒鍥懼艦銆備粠鏈川涓婅錛屾墜鏈轟嬌鐢ㄤ簡浠ュ墠鐨勭粍鍚堝姛鑳芥彁閱掍綘鐨勪富瑕佷簨浠跺彲浠ュ彂鐢熷湪浣犵殑搴旂敤紼嬪簭錛氬惎鍔紝鍏抽棴錛屾殏鍋滃拰鎭㈠銆傛垜宸茬粡璁ㄨ榪囷紝Activity灝嗚鎴愪負浠諱綍浼犵粺搴旂敤鐨勭殑鏍稿績緇勪歡錛涗粬浠粰浣犳帶鍒朵簡灞忓箷錛岃兘澶熸帴鏀剁敤鎴瘋緭鍏ャ?
鎬葷粨
鍒扮洰鍓嶄負姝紝鎴戝凡緇忔帰璁ㄤ簡媧誨姩濡備綍鎴愬湪鎵嬫満涓紝浠栦滑濡備綍鍚姩鍜屽仠姝紝浠ュ強浠栦滑濡備綍涓庡熀紜灞傛矡閫氥傛垜婕旂ず浜嗗浣曟樉紺轟竴涓畝鍗曠殑XML瑙嗗浘灞忓箷錛屼互鍙婂浣曟椿鎬т箣闂村垏鎹袱涓弽搴旈兘鍦ㄤ竴涓叧閿殑浜嬩歡鍜岀粨鏉熸椂鐨勪竴涓寚瀹氱殑鏃墮棿閲忋傚湪鐭湡鍐咃紝浣犻渶瑕佷簡瑙f洿澶氭湁Android濡備綍浣跨敤鎰忓悜錛屾剰鍥炬帴鏀跺櫒錛岃繃婊ゅ櫒鍜屾剰鍥炬矡閫氥傝鍋氬埌榪欎竴鐐癸紝浣犻渶瑕佷竴涓ず渚嬪簲鐢ㄧ▼搴忋?
鍒涘緩涓涓狪ntent Receiver
Intent Receiver鏄疉ndroid閲嶈鐨勭粍鎴愰儴鍒嗭紝浠庡畠鐨勫悕瀛楀彲浠ョ湅鍑哄叾浣滅敤銆傚畠鐨勪綔鐢ㄦ槸絳夊緟鎺ユ敹娉ㄥ唽鐨処ntent Action錛孉ndroid鏄寜鐓REW鐨勯氱煡妯″紡瀹炵幇鐨勩傛垜浠皢浣跨敤涓涓畝鍗曠殑搴旂敤錛屽睍鐜頒竴涓鏉傜殑Intent Receiver浠誨姟錛氳緭鍏ユ枃鏈秷鎭殑鎺ユ敹鍜屽搷搴斻?
浜嬫儏鐨勮搗鍥?
鎴戜滑寮濮嬭鎯寵繖鏍蜂竴騫呯敾闈細涓澶╀笅鍗堬紝褰撲綘鍥炲埌浣犵殑鍔炲叕妗岋紝浣犲彂鐜頒綘鐨勫姙鍏錛屼粠鍦版鍒板ぉ鑺辨澘涓庡彲鐖辯殑綺夌孩鑹茬殑鍥劇墖錛岄摵婊℃渶浠や漢璁ㄥ帉鐨勫浘鐢匯備綘鐭ラ亾榪欐槸璋佸湪鍋氾紝鐜板湪鏄綘鎶ュ鐨勬椂鍊欎簡銆備綘涔熺煡閬撲綘鐨勫伐紼嬮儴鍓昏鏈鍘屾伓涓棣栫壒孌婄殑姝屻傝繖棣栨瓕鏄?“ La Bamba “ 銆傝浣犲喅瀹氶氳繃涓涓紤鐪犵▼搴忔搷綰典綘鍚屼簨鐨凙ndroid鎵嬫満銆傛垜浼氬憡璇変綘濡備綍鍒朵綔涓涓狝ndroid搴旂敤紼嬪簭錛屾敹鍒扮壒瀹氱殑鐭俊鍚庯紝鎾斁榪欑鑰昏頸鏁堝簲鐨勯煶棰戞枃浠躲傝繖浼氫嬌浣犵殑鍓誨浣犵殑鏂版晫浜轟駭鐢熷己鐑堢殑鎰ゆ叏銆傚悓鏃訛紝浣犺緇欎粬涓涓満浼氬叧闂0闊充簡銆傝繖縐嶆伓浣滃墽紼嬪簭瑕佹眰Intent Receiver錛孉ctivity錛孲ervice錛屼互鍙婃墍鏈変笁縐嶆柟寮忚繘琛岄氫俊銆?
榪欐湁浠涔堝疄闄呯殑閫氶斿悧錛熻繖鍙兘鏈夊悧錛?
榪欐槸涓涓緢濂界殑闂銆傝櫧鐒惰〃闈笂鐪嬫潵涓嶆槸寰堝疄鐢ㄥ簲鐢紝鎴戠浉淇★紝濡傛灉鏈変竴鐐規兂鍍忓姏錛屼綘鍙互鍙戠幇鍏跺緢澶氶噸瑕佺殑鐜板疄鐢ㄩ旓細浠庢帹閫佺數瀛愰偖浠墮氱煡鍒板唴閮ㄧ數璇濆簲鐢ㄩ氫俊銆?
浣犲皢鍚戝墠榪堣繘鍥涗釜闃舵銆傚湪姣忎釜闃舵錛屼綘灝嗕簡瑙f洿澶氬叧浜嶪ntent receives錛宻ervices錛屾墍鏈夎繖浜涘簲鐢ㄧ▼搴忎箣闂寸殑鐩鎬簰浣滅敤浠訛細
閫氱煡鏀跺埌涓涓煭淇?
鎵撳紑鐭俊鐨勫唴瀹瑰拰鎵懼埌鐗規畩鐨勫噣鑽?
褰撶煭淇″埌杈続ctivity鍚姩錛屽茍涓旀剰璇嗗埌鍚姩鍙戠敓鍦ㄦ帴鏀跺櫒鐨勬帶鍒朵笅
寮濮嬩竴涓柊鐨勬湇鍔★紝灝嗘挱鏀鵑煶棰戞枃浠?
浣跨敤Intent Receiver
鍦ㄤ綘寮濮嬬紪鍐橧ntent Receiver涔嬪墠錛屼綘闇瑕佷簡瑙d綘涓轟粈涔堜細浣跨敤浠栥侷ntent Receriver娌℃湁鎴栧嚑涔庢病鏈夊唴瀛樺崰鐢ㄣ乴inkage鍜岀郴緇熷紑閿銆傚湪鍚姩鏃訛紝涓涓椿鍔ㄥ繀欏誨皢鎵鏈夊ぇ閲忕殑寮曞叆鐨勭被鍔犺澆錛孖ntent Receriver鍒欐病鏈夎繖浜涚害鏉熴傜敱浜庢煇縐嶇被鍨嬬殑鏂癐ntent鍙互杈懼埌鐮寸棰戠巼錛堜緥濡傜綉緇滅姸鎬佹洿鏂幫級錛屼竴涓交閲忕駭鐨勫璞″繀欏誨湪鍒嗘瀽鏁版嵁鐨勭涓闃舵銆傚鏋滃畠鏄竴涓傚綋鐨勬椂闂村敜閱掍竴涓洿澶х殑鐢ㄦ埛鐣岄潰紼嬪簭鎴栧ぇ騫呭悗鍙版湇鍔★紝鎰忓浘鎺ユ敹鏈哄簲閲囧彇榪欑琛屽姩銆?
鎻愮ず錛氭剰鍥炬帴鏀跺櫒鍙互緇忓父鐨勫惎鍔ㄥ拰鍏抽棴錛堣繖渚濋潬浠栦滑鐨勭洃鍚級錛岃瘯鍥捐瀹冧滑鍙樺湴閲嶉噺杞伙紝浣跨敤灝藉彲鑳藉皯鐨勭被搴撱備綘鐨勭敤鎴蜂笉浼氶珮鍏達紝濡傛灉浠栦滑鐢佃瘽鍦ㄧ紦鎱㈠湴鐖錛屽洜涓轟綘宸茬粡鎻掑叆鍒板お澶氱壒瀹氱殑浜嬩歡澶勭悊寮閿銆?
緙栧啓Intent Receiver
絎竴浠朵簨棣栧厛浣犻渶瑕佸垱寤轟竴涓繖涓皬鎭朵綔鍓у簲鐢ㄧ▼搴忓緩绔嬫柊欏圭洰銆傚湪婧愮洰褰曚腑錛屽垱寤轟竴涓柊綾伙紝灝嗘垚涓烘柊鐨処ntent Receiver銆傚湪絎竴闃舵錛屽畠鐪嬭搗鏉ュ簲璇ュ儚榪欐牱錛?
public class PrankSMSReceiver extends IntentReceiver
{
public void onReceiveIntent
(Context context, Intent intent)
{
return;
}
}
鐜板湪浣犲凡緇忚瀹氫簡闃剁駭 錛?浣犲繀欏誨憡璇変綘鎯寵 Android 鎺ユ敹 SMS 浜嬩歡銆備綘鍙互閫氳繃淇敼 AndroidManifest.xml 鏂囦歡緇欎綘璁稿彲鍜岀櫥璁?RECEIVE_SMS 鐨?Intent action 銆?
鏉冮檺
榪愯惀鍟嗭紝鐢ㄦ埛錛岀敋鑷沖紑鍙戜漢鍛樺彲鑳戒笉甯屾湜緇橝ndroid搴旂敤鑷敱鏀厤錛岃瘡絀垮叾鎵嬫満鍜岀綉緇滅殑鐗規潈灞傘傚洜姝わ紝璋鋒瓕鎺ㄥ嚭涓縐嶈縐誨姩鍙戜漢鍛樿鍙殑鏉冮檺姒傚康銆備負浜嗚兘澶熸帴鏀剁煭淇℃伅錛屼綘闇瑕侀氱煡鎵嬫満浣犲彲浠ユ帴鏀躲?
鍦ˋndroid涓紝鎵鏈夊厓绱犵殑鏉冮檺澹版槑鍦ㄧ壒鍒殑閰嶇疆鏂囦歡涓紝浣犳坊鍔犵殑鏉冮檺鍦?lt;manifest>鏍囪鍚庯紙浠g爜2-2錛夈傝紺轟緥搴旂敤紼嬪簭灝嗚縐頒負PrankApp銆傚叾媧誨姩涓昏鏄痳ankActivity銆?
Code Listing 2-2. Adding Permissions to Receive SMS Messages
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android=
"
package="com.apress.book.PrankApp"> <uses-permission android:name= "android.permission.RECEIVE_SMS" /> 娌℃湁鏉冮檺鏍囧織錛孉ndroid灝嗕綘鐨勫簲鐢ㄧ▼搴忔棤娉曞惎鍔ㄥ綋瀹冩帴鏀跺埌涓涓煭淇°傝繕鏈夊叾浠栫殑鏉冮檺鎴戦渶瑕佹兜鐩栦綘鍚戝墠鐪嬨傚湪姝ゆ湡闂?錛?浣犲彲浠ユ壘鍒版墍鏈夊湪鍒楄〃鐨勬潈闄?Android 鐨勬枃浠惰祫鏂?http://code.google.com/android/reference/android/ Manifest.permission.html 銆? 鍚戞垜鍙戦佺煭淇★紒 鐜板湪錛屼綘宸茬粡鍏佽榪涜涓庢墜鏈虹殑SMS灞備氦浜掞紝浣犲繀欏誨憡璇夋墜鏈哄仛浠涔堬紝褰撲竴涓柊鐨勬枃鏈俊鎭埌杈炬椂銆傝鍋氬埌榪欎竴鐐癸紝浣犲繀欏繪墦寮AndroidManifest.xml鏂囦歡錛屾坊鍔犱竴涓柊鐨処ntent Receiver銆備唬鐮佹竻鍗?-3鏄劇ず浜嗚鎻掑叆鐨勪唬鐮併? Code Listing 2-3. Registering the New Intent Receiver for Incoming SMSs </activity> <receiver android:name= "PrankSMSReceiver"android:enabled="true"> <intent-filter> <actionandroid:name="android.provider.Telephony.SMS_RECEIVED" /> <categoryandroid:name="android.intent.category.DEFAULT" /> </intent-filter> </receiver> 榪欏氨鏄綘姣忔蹇呴』瑕佹帴鍙楃殑 Intent notification 錛?褰撴墜鏈哄緱鍒頒竴涓帴鏀跺埌鐨?SMS 銆? 鍦?Action 涓垎鏋?Intent Receiver 瑕佸畬鎴愯繖涓姣旀垜浠兂璞$殑鏈変竴鐐瑰洶闅俱備竴涓繘紼嬪繀欏誨湪涓涓?DDMS 涓繍琛?銆備絾鍦ㄥぇ澶氭暟鎯呭喌涓嬶紝浣犱笉鎯寵搴旂敤紼嬪簭榪愯錛岄櫎闈炴柊鐨勪簨浠惰Е鍙戝畠銆傝繖闂鐨勮В鍐蟲柟妗堝湪Eclipse IDE涓彧鏄竴涓皬灝忕殑鎶婃垙銆傚綋浣犱竴姝ヤ竴姝ュ線涓嬭蛋鏃訛紝榪欏彲鑳戒細涓鐐逛竴鐐瑰彉寰楀鏉傘? 鍦ㄤ綘鐨刼nReceiveIntent鏂規硶涓斁緗竴涓柇鐐廣傚紑濮嬭皟璇曞簲鐢ㄧ▼搴忥紝騫惰妯℃嫙鍣ㄤ綅浜?#8220;Hello World錛孭rankActivity”灞忓箷涓娿傚湪Eclipse涓紝鍒囨崲瑙嗗浘鍒癉DMS銆備綘鍙互鎸夎繖鍛戒護+ F8閿嚑嬈℃垨閫夋嫨鑿滃崟 Window 魛仺 Open Perspective 魛仺 DDMS 銆? 娌跨潃宸﹁竟紿楀彛錛屽湪Device閫夐」鍗′笂錛屼綘鐜板湪搴旇鐪嬫湁涓涓豢鑹瞓ug鍥炬爣鍦ㄤ綘鐨勫簲鐢ㄦ梺杈廣傝繖鏄疍DMS鍛婅瘔浣犺皟璇曞櫒闄勫姞鍒頒綘鐨凱rankApp榪涚▼涓傚湪瀹冪殑涓嬮潰鏄疎mulator Control閫夐」鍗°傚湪榪欓噷浣犲彲浠ュ彂閫佺煭淇℃秷鎭傞鍏堣緭鍏ヤ換浣曚竴涓數璇濆彿鐮侊紝閫夋嫨SMS錛岄敭鍏ヤ竴涓祴璇曟秷鎭紝騫舵寜涓婼end銆? 濡傛灉浣犵殑閰嶇疆姝g‘錛屼綘搴旇鐪嬪埌Eclipse鍒囨崲鍒癉ebug閫忚鍥撅紝騫跺仠姝㈠湪浣犵殑鏂拌緗柇鐐逛笂銆? 娉ㄦ剰錛氬鏋滄病鏈夊彂鐢燂紝棣栧厛紜繚浣犺緗簡鏉冮檺姝g‘銆傚鏋滀粬浠笉姝g‘錛屼綘搴旇鐪嬪埌涓涓け璐ョ殑鏉冮檺淇℃伅鏄劇ず鍦―DMS灞忓箷搴曢儴鐨凩ogCat鏍囩涓傛澶栵紝璇風‘淇濅綘鐨勫簲鐢ㄧ▼搴忓凡緇忓湪榪愯錛屽茍鍦―evices閫夐」鍗℃湁緇胯壊璋冭瘯鍥炬爣鍦ㄥ畠鐨勬梺杈廣傚鏋滄墍鏈夎繖浜涢兘涓嶅鏁堬紝姣旇緝浣犵殑欏圭洰涓庢枃涓殑紺轟緥銆? 鐩墠涓烘錛屽鏋滀綘姝g‘鍦板畬鎴愪簡銆備綘鐨処ntent鐨刼nReceiveIntent鍔熻兘琚皟鐢紝褰撴瘡涓涓猄MS娑堟伅鍙戦佸埌鎵嬫満涓娿傛帴涓嬫潵錛屼綘灝卞繀欏誨紕娓呮濡備綍寰楀埌鐭俊鐨勫唴瀹廣? 浠涔堟槸鍦ㄤ竴涓猄MS涓紵 鍙偛鐨勬槸錛屽埌鐩墠涓烘Android鍏充簬鎺ユ敹鍜岃繃婊MS淇℃伅鐨勬枃妗e彧涓嶈繃鏄販涔辯殑銆傛垜鎬鐤戣繖涓嶆槸涓欏歸渶瑕佸憡璇夊紑鍙戜漢鍛樼殑閲嶈鍔熻兘銆傛垜涓嶅悓鎰忚繖浜涗紭鍏堜簨欏癸紝浣嗘槸浣挎垜鏈夋満浼氬~琛ョ┖緙恒? 涓嬮潰鏄痬ethodonReceiveIntent鐨勪唬鐮侊紝鍔熻兘鏄洃鍚柊鐨凷MS淇℃伅錛? public void onReceiveIntent (Context context, Intent intent) { SmsMessage msg[] = Telephony.Sms.Intents.getMessagesFromIntent(intent); for(int i = 0; i < msg.length; i++) { String msgTxt = msg[i].getMessageBody(); if (msgTxt.equals("0xBADCAT0_Fire_The_Missiles!")) { //Start the pranking here } } return; } 浣犺繕闇瑕佽緭鍏ヤ袱涓被搴撴潵瀹屾垚榪欓」宸ヤ綔錛? Import android.telephony.gsm.SmsMessage; Import android.provider.Telephony; getMessageFromIntent 鏂規硶鏄湪 Telephony 綾諱腑 錛?榪欏皢榪斿洖 SMS 淇℃伅鐨勬暟緇勩傜幇鍦ㄥ墿涓嬬殑灝辨槸寰楀埌鐭俊鐨勬湁鏁堣澆鑽楓備綘瑕佹壘鐨勮Е鍙戞伓浣滃墽媧誨姩鐨勭壒孌婁唬鐮佷負鏂囨湰 “ 0xBADCAT0_Fire_The_Missiles 錛?” 瀹冨繀欏繪槸涓涓傚綋鐨勭嫭鐗圭粍鍚堬紝浠ヤ究瀹冧笉浼氳瑙﹀彂浜嬫晠銆備綘涓嶄細甯屾湜鑷繁鐨勬伓浣滃墽澶辯伀騫舵彁閱掑彈瀹充漢澶棭鐨勩? 娉ㄦ剰錛氬湪Android閲岋紝娌℃湁璁拌澆鐨勫姛鑳芥槸寰堝彲鑳借繕娌℃湁瀹屾垚銆傜敱浜庢帴鏀剁煭淇$殑鏂囨。鍑犱箮涓嶅瓨鍦紝浣犲簲璇ヤ細鏈変簺鍙樺寲鍦ㄥ浣曞鐞嗘墜鏈虹畝璁笂銆傛洿鍙兘鐨勬槸鏁翠綋鐨勬柟娉曞簲璇ユ槸鐩鎬技鐨勶紝浣嗗畠鏈夋妸鎻″湴璁や負鍏朵腑鐨勪竴浜涚粏鑺傚皢鏀瑰彉SDK鐨勫墠鍒拌揪瀹冪殑鏈緇堢増鏈傝繖涓緥瀛愭槸鏈夊叧瀛︿範濡備綍浣跨敤鎰忓浘鎺ユ敹鍣ㄥ鏄湁鍏蟲枃鏈殑娑堟伅閫氫俊璧勬枡銆? 瑙﹀彂媧誨姩 閲嶈鐨勬槸瑕佽浣忥紝鎰忓浘鎺ユ敹鍣ㄧ殑鐢熷懡鍛ㄦ湡鐭紝鍙湁鍙鏂規硶璋冪敤onReceiveIntent銆備竴鏃﹀嚭浜庤繖涓鑱岃兘錛孉ndroid鏄厤璐規潃姝昏繘紼嬩腑榪愯浣犵殑搴旂敤紼嬪簭銆備換浣曞紓姝ュ姛鑳戒細姝誨幓錛屽鏋滄槸涓涓崄鍒嗘鎵嬬殑姝諱骸寮濮嬨傚鏋滀綘鎯寵鍋氳秴瓚婁簡綆鍗曠殑澶勭悊鏂規硶鍐呯殑浠諱綍浜嬫儏錛屼綘闇瑕佸惎鍔ㄦ湇鍔℃垨媧誨姩銆傛棦鐒朵綘瑕佸悓鏃舵挱鏀鵑煶涔愬拰璀︽姤浣犵殑鍙楀鑰咃紝浠栦滑鍘昏繃浜嗭紝浣犻渶瑕佸惎鍔ㄧ殑涓欏規椿鍔ㄣ備綘瀹屾垚姝ゆ儏鍐靛涓嬶細 if (msgTxt.equals("0xBADCAT0_Fire_The_Missiles!")) { //Start the Activity Intent startActivity = new Intent(); startActivity.setLaunchFlags(Intent.NEW_TASK_LAUNCH); startActivity.setAction("com.apress.START_THE_MUSIC"); context.startActivity(startActivity); } 浣犱細鐪嬪埌榪欓噷鏄琛?NEW_TASK_LAUNCH 鍦?setLaunchFlags 銆備綘闇瑕佸仛浠諱綍浣犺鍙戦佺殑 Intent action 錛?灝嗗惎鍔ㄤ竴欏規柊鐨勬椿鍔ㄣ傛澶栵紝姝e浣犲湪鍚姩鐢婚潰紺轟緥搴旂敤紼嬪簭錛屼綘蹇呴』娣誨姞涓涓柊鐨勮鍔紝浣犵殑Activity鐨処ntent filter銆傞偅涓繃紼嬪簲璇ョ湅璧鋒潵寰堢啛鎮夛細 <intent-filter> <action android:name="android.intent.action.MAIN" /> <action android:name="com.apress.START_THE_MUSIC" /> <category android:name= "android.intent.category.LAUNCHER" /> <category android:name= "android.intent.category.DEFAULT" /> </intent-filter> 鐜板湪 錛?濡傛灉浣犲湪鍓嶉潰姝g‘鍦版坊鍔犱簡浠g爜 錛?褰撲綘浠?DDMS 閫忚鍥句腑 鍙戦?SMS 娑堟伅鏃?錛?浣犲簲璇ョ湅鍒頒綘鐨勫簲鐢ㄨ煩鍑哄埌鍓嶅彴 錛?鏄劇ず “Hello World 錛孭rankActivity ” 鏂囨湰鍦ㄥ睆騫曚笂銆? 绱㈠叿鐨勬椿鍔? 涓涓渶鍚庣殑宸ヤ綔浣犻渶瑕佹坊鍔?錛?鍦ㄥ緱鍒板崙閯欑殑闊充箰鎾斁鏈嶅姟涔嬪墠 錛?瑁呴厤 Activity 錛?浠ュ洖搴斾綘鐨?Intent Receiver 鍙戦佺殑媧誨姩 銆傚鏋滃簲鐢ㄧ▼搴忔甯稿惎鍔紝浣犺绔嬪嵆鍏抽棴浜嗐傚悓鏍鳳紝濡傛灉鍙互閫氳繃鑿滃崟鍚姩錛岃繖鏍蜂綘鐨勬伓浣滃墽鐨勮鍒掑氨浼氳繃鏃╃殑鏇濆厜銆傝鍋氬埌榪欎竴鐐癸紝浣犲繀欏繪绱㈠彂灝勭殑Intent錛屽茍璋冪敤getAction鏂規硶鏉ヨ綆楀嚭鍦ㄤ粈涔堟儏鍐典笅錛屽畠宸茬粡鍚姩銆傝PrankActivity鐨凮nCreate鏂規硶鐜板湪鐪嬭搗鏉ュ簲璇ヤ唬鐮?-4銆? Code Listing 2-4. Launching on a Specific Intent Action public void onCreate(Bundle icicle) { super .onCreate(icicle); Intent i = getIntent(); String action = i.getAction(); if (action != null && action.equals("com.apress.START_THE_MUSIC")) { setContentView(R.layout.pranked); //We'll need to start the music service here } else finish(); } 棣栧厛浣犱細寰楀埌鍙戣搗 Activity 鐨処ntent 銆備嬌鐢ㄧ洰鍓嶅緱鍒扮殑 Intent 錛?浣犲彲浠ョ敤 getAction 鏂規硶媯绱㈣皟鐢ㄧ殑琛屽姩銆傝繖涓皢榪斿洖涓涓寘鍚惎鍔ㄤ簨浠剁殑瀛楃涓詫紝浣犳牳瀵逛綘鐨勮憲鍚嶉煶涔愯鍔ㄥ垪鍦ㄥ師鏉ョ殑XML銆傚鏋滃湪鍚姩浜嬩歡涓轟綘鐨勬椿鍔ㄦ潵鑷甯哥殑鏂瑰紡錛堜粠鑿滃崟鎴栦粠鍚姩璋冭瘯鍣級錛岃琛屽姩瀛楃涓插皢鏄痭ull銆傚鏋滄槸榪欐牱鐨勮瘽錛屼綘瑕佺珛鍗充嬌鐢╢inish鏂規硶鍏抽棴媧誨姩銆? 娉ㄦ剰錛歄nCreate鏂規硶琚皟鐢ㄥ綋浣犵殑搴旂敤琚嬈″惎鍔ㄦ椂銆傚鏋滀綘宸茬粡鍚姩浣犵殑搴旂敤紼嬪簭錛岀劧鍚庨鍑猴紙浣跨敤榪斿洖閿級錛屽簲鐢ㄧ▼搴忎粛鐒跺湪鍚庡彴榪愯銆傚鏋滃湪榪欐椂錛屼綘鍙戦佺煭淇★紝浣犵殑媧誨姩灝嗗洖鍒板墠鍙幫紝浣嗗叾OnStart鏂規硶灝嗚皟鐢ㄨ屼笉鏄疧nCreat銆? 浣犱粖澶╂兂緹炶頸璋佸憿錛? 铏界劧鍙兘鏈変簺鐭瀴榪囨錛屼綘瑕佷嬌鐢ˋndroid鐨剆ervice瀵硅薄鏉ュ鐞嗛煶涔愭挱鏀俱傛垜鎵撶畻榪欐牱鍋氭湁鍥犱負鍙︿釜鍘熷洜錛? n 魛們 榪欐槸涓涓ソ鐨勬満浼氭潵灞曠ず浠ョ畝鍗曠殑鏂瑰紡service鐨勪嬌鐢紝鍦ㄧ畝鍗曠殑鐜銆? n 魛們 娼滃湪鐨勶紝瀹冧細璁╀綘鍚姩闊充箰涓嶇敤鐪嬪埌搴旂敤紼嬪簭錛屼嬌浣犵殑鎭朵綔鍓х殑搴旂敤紼嬪簭鏇村崙閯欍? 紲炵粡涓庢湇鍔? 涓轟粈涔堜綘瑕佷嬌鐢ㄧ殑鏈嶅姟錛熶粠鏈川涓婅錛屽畠鎰忓懗鐫鏄竴涓璞★紝涓庣敤鎴風晫闈㈠垎紱葷殑鍙繍琛屽湴榪囩▼銆傝繖鏄畬緹庣殑鎯呭喌錛屽綋涓涓紑鍙戜漢鍛樺笇鏈涚殑鍔熻兘錛堟棤璁烘槸緗戠粶鎴栧濯掍綋鐩稿叧錛夎兘澶熺嫭绔嬭繍琛屻備緥瀛愬寘鎷細闊抽鎾斁錛岀綉緇滀氦鏄撶殑鍚庡彴錛屽拰閭伓鐨勬伓浣滃墽紼嬪簭銆傝櫧鐒舵湇鍔″厑璁稿涓簲鐢ㄧ▼搴忥紙鎵撳紑閫氫俊淇¢亾錛変笌浠栦滑緇戝畾錛屼綘浼氫嬌鐢ㄥ畠浣滀負涓涓畝鍗曠殑鍚庡彴榪涚▼銆傚悓鏍鳳紝services鏈夊緢澶氱敤閫斾笉鍙槸榪欎釜綆鍗曠殑渚嬪瓙銆? 鍒涘緩service 娣誨姞涓涓柊綾葷殑婧愮爜鍖呫傛垜宸茬粡鍐嶆璋冪敤PrankService錛堟病鏈夌偣鍒涙剰錛夈傚湪鏈鍩烘湰鐨勫眰闈紝service瑕侀噸鍐檕nBind鏂規硶銆傝鑾峰緱鏈嶅姟綾葷紪璇戯紝瀹冨繀欏葷湅錛岃嚦灝戞湁涓鐐圭偣錛屽浠g爜2-5銆? Code Listing 2-5. A Stripped-Down Service public class PrankService extends Service { public IBinder onBind(Intent intent) { return null; } } 鍦ㄨ繖涓緥瀛愪腑錛屼綘涓嶄細浣跨敤璇ユ湇鍔nBind鏂規硶榪涜浜掑姩銆備綘鍙互綆鍗曞湴鍚姩鍜屽仠姝㈡湇鍔″湪浣犵殑涓昏媧誨姩鍐呫傝鍋氬埌榪欎竴鐐癸紝浣犲繀欏婚噸鍐欎袱涓柟娉曞湪鏈嶅姟綾伙細 OnStart 錛圛nt startId 錛孊undle argument 錛? 褰揙nStart琚皟鐢ㄦ椂錛屼綘浼氬紑濮嬫挱鏀劇殑濯掍綋鏂囦歡銆傚綋鏈嶅姟琚牬鍧忥紝灝變細鏄庣‘鍦板仠姝€傝繖涓嶆槸蹇呯劧瑕佹眰錛屼絾浣犱細鏄庣櫧銆? 鍚姩鏈嶅姟 寮濮嬩竴涓柊鐨勬湇鍔″簲璇ョ被浼間簬寮濮嬫椿鍔ㄣ傝嚜浠庝綘宸茬粡鎺ヨЕ鍒拌繖鏄嚑嬈★紝鎴戝氨鍦ㄧ粰浣犱竴孌典唬鐮侊紝璁╀綘鏁寸悊涓涓嬨?璋冪敤鍓嶉潰鍒楀嚭鐨凱rankActivity OnCreate鏂規硶銆傜畝鍗曟浛鎹㈡敞閲?#8220; We’ll need to start the music service here ”鐢ㄤ笅闈㈢殑浠g爜琛岋細 startService(new Intent ("com.apress.START_AUDIO_SERVICE"), null ); 鍚屾牱錛岃繖涓湅涓婂幓寰堢啛鎮夈傚惎鍔ˋctivity鍜屽惎鍔╯ervice涔嬮棿鍞竴鐨勫尯鍒槸錛堥櫎浜嗕笉鍚岀殑鏂規硶璋冪敤錛夋槸闅廔ntent浼犻抌undle錛堝疄闄呬笂鏄竴涓湴鍥炬垨鍝堝笇琛級鍙傛暟鐨勮兘鍔涖傝繖bundle灝嗚浼犻掑埌OnCreate鏂規硶鏈嶅姟銆? 鍚姩闊充箰 BREW鍜孞ava涓鏍鳳紝Android鐨勫獟浣撴挱鏀撅紙綆鍗曠殑鎾斁/鍋滄璁$畻錛夐潪甯哥畝鍗曟槗鐢ㄣ傚綋浣犳湇鍔$殑OnStart鍑芥暟琚皟鐢紝浣犱細鍔犺澆鍜屾挱鏀?res/raw 鐩綍涓殑嫻嬭瘯闊抽鏂囦歡棣栧厛瑕佸仛鐨勬槸澶嶅埗闊抽鏍鋒湰鏂囦歡瀵煎叆/res/raw錛堝鏋滄病鏈夎繖涓洰褰曪紝緇х畫騫跺垱寤哄畠錛夈備笅涓姝ワ紝鏀句笅緹炶頸錛屽茍澶嶅埗鍐欏叆灝婇噸錛岄煶棰戞枃浠跺師濮嬫枃浠跺す銆傚鏋滀綘浣跨敤Eclipse錛屼綘搴旇娣誨姞鐩稿簲鐨勫厓绱燫.raw銆傚湪浣犵殑鎯呭喌涓嬶紝瀹冪殑R.raw.test銆? 鐜板湪浣犳湁涓涓煶涔愭枃浠剁殑寮曠敤錛屼綘鍙互娣誨姞紼嬪簭 PrankService 鐨勮姹傚涓?錛? public void onStart(int startId, Bundle arguments) { MediaPlayer p; super .onStart(startId, arguments); player = MediaPlayer.create(this , R.raw.test); player.start(); } 璇瘋浣?錛?鏄竴涓噸鍐欑殑 OnStart 鏂規硶 錛?鍥犳浣犲繀欏昏皟鐢ㄧ埗綾誨悓涓鍑芥暟鎴?Android 灝嗗彉寰椾笉紼沖畾銆傚湪榪欎竴鐐逛笂錛屼綘闇瑕佺敤MediaPlayer鐨勯潤鎬佺被鍒涘緩涓涓柊鐨勫獟浣撴挱鏀懼櫒瀵硅薄銆傚洜涓簊ervice鏄痗ontext鐨勫瓙綾伙紝浣犲皢涓涓寚閽堜紶閫掔粰浣犲綋鍓嶇殑context鍜岄潤鎬佸彉閲忎唬琛ㄤ綘鐨勬祴璇曞獟浣撱傚湪榪欎竴鐐逛笂錛屼綘鍙互璋冪敤play錛岀幇鍦ㄤ綘鍙互寮濮嬪繖浜嗐傛挱鏀句細緇х畫鍦ㄥ悗鍙拌繍琛岋紝鐩村埌stopService榪欎釜鏂規硶鏄敱浣犵殑涓籄ctivity璋冪敤銆? 褰搒topService琚皟鐢ㄦ椂錛屼笅闈㈢殑鏂規硶灝嗚皟鐢細 public void onDestroy() { super.onDestroy(); player.stop(); } 鍚屾儏鐨勮鍔? 鏃㈢劧浣犳槸涓涓笉閿欑殑鐖卞紑鐜╃瑧鐨勪漢 錛?浣犺緇欎綘鐨勫彈瀹寵呬竴涓彴闃朵笅銆傛濡備綘涔嬪墠瑙佽繃鐨勶紝Activity鏄敱Intent Receiver瑙﹀彂鐨勶紝鍦ㄦ椿鍔ㄥ惎鍔ㄦ湇鍔$殑鏃墮棿鐐逛笂銆傛濡備綘鍒氭墠鐪嬪埌鐨勶紝service鏄礋璐f挱鏀懼櫔澹版縺鎬掍綘鍓誨伐紼嬪笀銆傚悓鏍鳳紝鍥犱負浣犳槸浠佹厛鐨勫湪浣犵殑鎵ц鍥炴姤鐨勫悓鏃訛紝浣犲繀欏諱負鍙楀鑰呰璁″叧闂煶涔愭柟娉曘傛坊鍔犲湪浣犵殑PrankActivity涓嬮潰鐨勬柟娉曞彲浠ュ疄鐜頒綘鍠勬剰鐨勮鍔細 public boolean onKeyDown(int keyCode, KeyEvent event) { stopService(new Intent( "com.apress.START_AUDIO_SERVICE")); finish(); return true; } 閰嶇疆鏂囦歡 涓嬮潰鏄〃鐜板涓嬫墍紺?錛? <service android:name=".PrankService"> <intent-filter> <action android:name= "com.apress.START_AUDIO_SERVICE" /> <category android:name= "android.intent.category.DEFAULT" /> </intent-filter> </service> 紱呭畻鍜屾姤澶嶇殑鑹烘湳 閫氳繃涓嶅厜鏄庢澶х殑灝忔伓浣滃墽搴旂敤紼嬪簭鐨勪嬌鐢?錛?浣犲簲璇ユ槑鐧戒簡 Intents 錛孖ntent Receivers 錛宻ervices 鍜孉ctivities 濡備綍 鍏卞悓鍦ㄥ厛榪涚殑 銆?涓昏鏄悗鍙?鐨?搴旂敤紼嬪簭涓繍琛岀殑銆傛垜鐜板湪瑕佹敼鍙樹竴涓嬫柟寮忥紝涓姝ヤ竴姝ュ仛錛屼綘鍋氫簡浠涔堜互鍙婂浣曞疄鐜板畠銆? 璁╂垜鍋氱殑鏇村ソ 浣犲仛浜嗕互涓嬪唴瀹癸細 1銆備綘浣跨敤姝g‘鐨勬潈闄愬拰緋葷粺鎺ユ敹鍣ㄧ殑鎰忓浘綰х煭淇$殑鎰忓浘瀹夋帓鐨勫璞℃槸PrankSMSReciever姣忔瀹炰緥鍖栦竴涓墜鏈轟笂鐨凷MS鍒拌揪銆傚鏋滀綘鐨処ntent Receiver鍙戠幇涓涓潪甯哥壒瀹氱殑SMS鐨勬湁鏁堣澆鑽鳳紝瀹冨皢閫氳繃鍙戦両ntent灝嗗惎鍔ㄤ綘鐨勬椿鍔ㄣ? 2銆傝繖欏規椿鍔ㄥ悕涓篜rankActivity錛屼細鐩戝惉琚玃rankSMSReceiver鐨勭壒瀹歩ntent action銆傚綋瀹冩敹鍒扮‘鍒噄ntent action錛屼綘鐨勬椿鍔ㄥ皢鏄劇ず涓涓?#8220;gotcha”娑堟伅緇欏彈瀹寵呫傚悓鏃訛紝璇ユ椿鍔ㄥ皢鍙戝嚭鎰忓浘鏃ㄥ湪鍚姩鏈嶅姟銆傚鏋滃湪浠諱綍鏃跺欏彈瀹充漢/鐢ㄦ埛鎸変笅涓涓數璇濅笂鐨勯敭錛屽簲鐢ㄧ▼搴忓皢閫鍑猴紝闊充箰鏈嶅姟灝嗙粓姝€? 3銆傛湇鍔$被錛岀О涓篜rankService錛岀洃鍚琍rankActivity鐨刬ntent錛屽皢鍚姩騫跺紑濮嬫挱鏀句護浜鴻鍘岋紝棰勫畾涔夌殑闊抽鏂囦歡銆傚畠灝嗙戶緇挱鏀撅紝鐩村埌瀹冭瑕佹眰鍋滄閫氳繃PrankActivity鐨勮皟鐢ㄦ柟娉晄topService銆? 娉ㄦ剰錛氭紺轟緥搴旂敤紼嬪簭涓嶆秹鍙婃墜鏈虹殑鏈湴鐭俊搴旂敤銆傚洜涓烘墍鏈夌殑intent receiver浼犲叆鐨勯氱煡鎰忓浘錛屼綘鐨勫簲鐢ㄥ皢琚簤澶虹敤鎴蜂笌Android鐨勫叧娉ㄧ煭淇℃敹浠剁鐨勫簲鐢ㄣ傚湪鐢熶駭涓紝榪欏彲鑳介渶瑕佺浉褰撹鏃跺櫒涔熻瑙﹀彂鏂囨湰鏈夋晥杞借嵎錛岃繖鏄竴涓井濡欏涓鐐?“0xBADCAT0_Fire_The_Missiles 錛?#8221; 鍦ˋndroid涓Щ鍔ㄦ暟鎹? 鏈鍚庯紝浣犻渶瑕佹妸閲嶇偣鏀懼湪鍐呭瑙f瀽鍣ㄣ?Android涓嶄細緇橲DK鐗瑰埆鐨勬墜鏈烘枃浠剁郴緇熺殑璁塊棶鏉冮檺錛屽Brew涓鏍楓傚畠涔熸病鏈夋彁渚涗竴涓猂ecordStore錛屽儚Java ME涓鏍楓傚湪浣犵殑Activities銆両ntent Receiver鍜宻ervices涔嬮棿錛屼綘浼犻掓暟鎹殑涓昏鏂規硶鏄繀欏婚氳繃ContentResolver瓚呯被銆傝櫧鐒朵綘鍙互瀛樺偍鏁版嵁閫氳繃鏂囦歡錛屽弬鏁幫紝鍜屽叾浠栨暟鎹簱錛屽彲浠ラ噰鍙栬澶氬艦寮忥紝Android闄勫甫鐨勫嚑涓噸瑕佸唴緗甤ontent resovlers銆傝繖閲屾湁涓涓垪琛紝Android鐨勪富瑕乧ontent resovlers錛屼綘鍙兘瑕佺粡甯鎬簰鍔ㄥ熀紜涓婏細 涔︾ 緋葷粺璁劇疆 Android 鐨勬枃妗f彁渚涗簡闈炲父濂界殑紺轟緥 錛?a >http://code.google.com/android/
onDestroy錛堬級
嫻忚鍣?
鎼滅儲鍘嗗彶
鐢佃瘽鍛煎彨
閫氳瘽璁板綍
鏈榪戦氳瘽
鑱旂郴
紜歡璁劇疆錛堣摑鐗欙紝緗戠粶璁劇疆錛?
杞歡璁劇疆
娉ㄦ剰錛氬彲浠ュ垱寤轟綘鑷繁鐨刢ontent provider錛屼綔涓轟竴縐嶆柟寮忥紝涓轟簡鍏叡璁塊棶灝佽Android鐨凷QLite鐨勬墽琛屻備綘灝嗚繘鍏ュ浣曞湪鍚庨潰鐨勭珷鑺備腑榪欎竴鐐廣傜幇鍦ㄤ綘鍙槸鍘誨鐞哻ontent resolver浜ょ粰鐨?#8220;client”鏂歸潰銆?
Android閲囩敤浜嗚嚜瀹氫箟鐨凷QLite瀹炵幇錛屾潵瀛樺偍鏈湴淇℃伅銆傚鏋滀綘涓嶇啛鎮塖QL鐨勫熀紜鐭ヨ瘑錛岀幇鍦ㄤ篃璁告槸涓涓涔犵殑鏈轟細銆備負琛ㄨ堪鏂逛究錛屾垜瑕佸亣璁句綘浜嗚В鍩烘湰鐨凷QL鏌ヨ鍛戒護銆傚鏋滀綘闇瑕佽繘涓姝ユ彁楂橈紝Apress涓婃湁涓涓緢濂界殑璧勬簮http://apress.com/book/ catalog?category=145 銆?
鏃犺葷殑鑷垜鎺ㄩ攢
璁╂垜浠涓涓嬩綘鐨勫簲鐢ㄧ▼搴忎腑“about”閮ㄥ垎錛屼綘鎯蟲湁涓涓寜閽紝娣誨姞浣犵殑鍟嗕笟杞歡緗戦〉鍒扮敤鎴風殑web涔︾銆備綘瑕佺‘淇濆畠涓嶆坊鍔犱袱嬈★紝濡傛灉浣犵殑鐢ㄦ埛鏈夊啀嬈$偣鍑昏鎸夐挳鎰忓銆備負浜嗕嬌榪欎釜瀹炰緥綆鍗曪紝浣犲皢瑙﹀彂榪欎釜浜嬩歡鍦ㄤ綘紺轟緥搴旂敤紼嬪簭涓紝褰撶敤鎴鋒寜涓嬩竴涓敭銆?
娉ㄦ剰錛氬湪涓涓湁瓚g殑娉ㄦ剰錛屽鏋滀綘闇瑕佽瘉鏄庯紝浣滀負涓涓紑鍙戜漢鍛橈紝Android鏄繕娌℃湁瀹屽叏鎴愮啛鐨勶紝浣犲彧瑕佺湅鐪嬫瘮瀵逛笅鏂囦歡鐨刟ndroid.content.ContentResolver鏂規硶getDataFilePath錛屽叾涓瀹氾細 “ 璇蜂笉瑕佷嬌鐢ㄦ鍔熻兘錛佹湁浜鴻榪欎竴鐐癸紝浠栦滑涓嶅簲璇ャ備綘娌℃湁鐩存帴鐨勮闂枃浠跺唴鐨勫唴瀹規彁渚涘晢銆備笉瑕佺榪欎釜銆傝蛋寮銆?“ 榪欐槸濂斤紝鐭ラ亾鍗充嬌鏄Android鐨勬枃妗f妧鏈綔瀹舵湁騫介粯鎰熴?
鑾峰彇鐢ㄦ埛鐨勪功絳?
榪欏簲璇ユ槸鏄捐屾槗瑙佺殑錛岃嚦灝戝湪榪欎竴鐐癸紝寮鍙戜漢鍛樺彲浠ュ仛涓浜涢潪甯擱偑鎭剁殑浜嬫儏錛岃闂敤鎴風殑涔︾銆傜洰鍓嶈繕涓嶆竻妤氾紝鍦ㄨ繖涓鐐癸紝Android浼氬仛浠涔堜互闃叉鍙戠敓榪欑被浜嬫儏銆傛垜鎯寵繖寰楃敱榪愯惀鍟嗘潵閿佸畾鎴栫洃瑙嗘琛屼負銆傚湪浠諱綍鎯呭喌涓嬶紝浣犲皢浣跨敤涓涓皟鐢ㄦ柟娉昺anagedQuery錛屽畠灝嗚繑鍥炰竴涓垪琛ㄧ敤鎴風殑涔︾錛?
Cursor bookmarks =
android.provider.Browser.getAllBookmarks
(getContentResolver());
int urlColumn = bookmarks.getColumnIndex(
android.provider.Browser.BookmarkColumns.URL );
Cursor results;
String[] proj = new String[]
{
android.provider.BaseColumns._ID,
android.provider.Browser.BookmarkColumns.URL,
android.provider.Browser.BookmarkColumns.TITLE
};
results =
managedQuery(android.provider.Browser.BOOKMARKS_URI,
proj, null ,
android.provider.Browser.BookmarkColumns.URL
+ " ASC");
鐜板湪鎴戝皢鍒嗚В姣忎竴涓搷浣溿備綘棣栧厛瑕佷功絳劇綉鍧鍒楃儲寮曘傚啀嬈★紝鍥犱負Android閫氳繃SQL鏍煎紡鎻愪緵鍏跺鏁板唴閮ㄦ暟鎹殑璁塊棶錛屼綘搴旇涔犳儻浜庣敤鏁版嵁搴撶殑鏂瑰紡寮曚綘淇濆瓨鐨勪俊鎭傛帴涓嬫潵錛屼綘灝嗚緗父鏍囷紝涓涓被浼糐ava ME涓璕ecordStore鏋氫婦瀵硅薄錛岃緗瓧絎︿覆鏁板肩殑鏄犲皠銆傚洜涓轟綘鍙叧蹇冨垪鍖呭惈鐨勭綉鍧錛屽畠淇濆瓨闈炲父綆鍗曘傛柟娉曡皟鐢╩anagedQuery鏄皟鐢ㄥ皢榪斿洖浣犵殑鏁版嵁銆備綘鍙互閫氳繃URI涓負涔︾瀛樺偍瀛楃涓詫紝浜ょ粰浣犱簡綆鍗曠殑鏄犲皠鏁板鹼紝涓嶉渶瑕亀here璇彞錛屽茍鍛婅瘔瀹冩寜闄嶅簭鎺掑垪鐨勭綉鍧銆?
鎼滅儲緇撴灉
鎼滅儲緇撴灉寰堢畝鍗曞彧瑕佽凱浠f父鏍囧璞★紝鏄氳繃綆鍗曠殑鍏夋爣榪唬瀵硅薄鍜岄鍑轟竴鍒椾粠URL瀛楃涓睮D浣犳绱㈠墠 錛?
Cursor results =
android.provider.Browser.getAllBookmarks
(getContentResolver());
int urlColumn =
results.getColumnIndex
(android.provider.Browser.BookmarkColumns.URL);
results.first();
do
{
//url is a method param
//containing what we're looking for
if(results.getString(urlColumn).equals(url))
return false;
} while (results.next());
浣犲彲浠ュ仛鏇村鐨勫熀浜?URL 鐨勫唴瀹?錛?浣嗙幇鍦ㄤ綘浼氬彧鏄湅浣犵殑 www.apress.com 閾炬帴銆傚緢鏄庢樉錛屽鏋滄浠g爜鐨勮繍琛屾槸涓婅堪Apress緗戝潃錛屼綘涓嶄細鎵懼埌瀹冦傚洜涓虹敤鎴峰笇鏈涙坊鍔犺吹鍏徃鐨勭綉鍧鍦ㄨ櫄鎷熺殑“About” ” 閮ㄥ垎涓紝浣犱篃瑕佺粰浠栦滑銆?
浣跨敤Content Resolver娣誨姞閭伓鍏徃緗戝潃
涔熻浠栦滑涓嶆槸閭伓錛屼絾浣犲姞鍏ヤ粬浠傜敱浜嶢press涔熻鏄叕鍙告渶閭伓閭i噷錛堜笉鏄垜鏈夊亸瑙侊紝璁頒綇錛夛紝浣犺浠栦滑鎽嗚劚瀹冿紝鍙涓嬈°備笅闈㈡槸涓涓編涓界殑ContentReceiver鏂瑰紡娣誨姞涔︾璁板綍錛?
ContentValues inputValues = new ContentValues();
inputValues.put
(android.provider.Browser.BookmarkColumns.BOOKMARK,
"1");
inputValues.put
(android.provider.Browser.BookmarkColumns.URL,
瑕佺帺google 鎵嬫満 G1鐨勬ā鎷熷櫒錛屽綋鐒墮渶瑕佸厛鍘籫oogle涓婇潰涓嬭澆Android鐨凷DK錛岃В鍘嬪嚭鏉ュ悗鍦⊿DK鐨勬牴鐩綍涓嬫湁涓涓猼ools鏂囦歡澶癸紝閲岄潰灝辨槸妯℃嫙鍣ㄥ拰涓浜涢潪甯告湁鐢ㄧ殑宸ュ叿銆?/p> 鍙屽嚮“emulator.exe”錛岀洿鎺ュ惎鍔ㄦā鎷熷櫒錛岀畝鍗曞惂銆傚綋鐒訛紝濡傛灉瑕佸妯℃嫙鍣ㄨ繘琛屼竴浜涘畾鍒訛紝榪樻槸瑕佷粠鍛戒護琛岃皟鐢紝甯︿笂鍙傛暟鍚姩銆備笅闈㈠氨鏉ヤ粙緇嶄竴涓嬪惎鍔ㄦ槸甯哥敤鐨勫嚑涓弬鏁幫細 1.妯℃嫙鍣ㄥ瑙傜殑瀹氬埗錛?br>480x320, landscape: emulator -skin HVGA-L 2.涓烘ā鎷熷櫒鍔犱笂SD鍗★細 涓嬮潰鎴戜滑鍐嶆潵璇磋濡備綍鍒涘緩"sdcard.img"鏂囦歡錛?br>“tools”鐩綍涓嬭繕鏈夊彟澶栦竴涓緢濂界敤鐨勫伐鍏?#8220;mksdcard.exe”錛屼竴鐪嬪悕瀛楀氨鐭ラ亾鈥斺攎ake sdcard銆傚錛屽氨鐢ㄥ畠鏉ュ垱寤轟竴涓?#8220;SD鍗?#8221;銆?/p> 鍛戒護涓猴細 OK,榪欐牱涓涓閲忎負1G鐨凷D鍗″氨鍒涘緩瀹屾瘯浜嗐?/p> 浣跨敤SDCard: 鍒涘緩: mksdcard <1024M> <sdcard.img> 榪炴帴鍒版ā鎷熷櫒: emulator -sdcard <鐩綍/sdcard.img> 浼犳枃浠跺埌SDCard: adb push <鐩綍/audio.mp3> </sdcard/audio.mp3>
鐜╄繃鎵嬫満妯℃嫙鍣ㄧ殑浜轟竴鑸渶鎰熷叴瓚g殑褰撶劧鏄ā鎷熷櫒鑳藉仛浠涔堝憿錛熶笅闈竴涓閬撴潵錛?/p> GPhone鐨勬ā鎷熷櫒鏈変釜鐗規湁鐨勫彿鐮侊細15555218135錛岃繖涓氨綾諱技鎴戜滑瀹炰綋鎵嬫満鐨凷IM鍗″彿鐮佸暒銆傝瀹炵幇鎷ㄥ彿錛岀敤鎵嬫満錛熷綋鐒朵笉琛岋紒 鏇寸畝鍗曪紝涓夋錛?br>1.榪愯 cmd look錛佹槸涓嶆槸妯℃嫙鍣ㄤ笂鏄劇ず鏉ョ數浜嗭紵鎺ュ惉/鎸傛柇鍜屽疄浣撴墜鏈轟竴鏍楓?/p> 鍙戠煭淇′篃涓鏍風畝鍗曪紝閲嶅涓婇潰1錛?涓ゆ錛岀涓夐儴鍛戒護鏀逛竴涓嬶細 鏉ヨ璇碢C涓庢ā鎷熷櫒鏂囦歡浼犺緭鐨勬柟娉曞惂銆傝繖閲岄渶瑕佺敤鍒板彟涓涓噸瑕佸伐鍏鳳紝涔熷湪“tools”鐩綍涓嬶紝“adb.exe”銆?/p> adb: adb(Android Debug Bridge)鏄?span class="t_tag" style="line-height: 19px; ">Android 鎻愪緵鐨勪竴涓氱敤鐨勮皟璇曞伐鍏鳳紝鍊熷姪榪欎釜宸ュ叿錛屾垜浠彲浠ョ鐞嗚澶囨垨鎵嬫満 妯℃嫙鍣?/span> 鐨?span class="t_tag" style="line-height: 19px; ">鐘舵?/span> 銆傝繕鍙互榪涜浠ヤ笅鐨勬搷浣滐細 涓浜涘父鐢ㄧ殑鎿嶄綔錛?/p> 榪涘叆Shell: adb shell 閫氳繃涓婇潰鐨勫懡浠わ紝灝卞彲浠ヨ繘鍏ヨ澶囨垨妯℃嫙鍣ㄧ殑shell鐜涓紝鍦ㄨ繖涓?span class="t_tag" style="line-height: 19px; ">Linux Shell涓紝浣犲彲浠ユ墽琛屽悇縐?span class="t_tag" style="line-height: 19px; ">Linux 鐨勫懡浠わ紝鍙﹀濡傛灉鍙兂鎵ц涓鏉hell鍛戒護錛屽彲浠ラ噰鐢ㄤ互涓嬬殑鏂瑰紡錛?br>adb shell [command] 涓婁紶鏂囦歡: adb push <PC鏂囦歡> </tmp/...> 瀹夎紼嬪簭: adb install <*.apk> 琛ュ厖涓鐐癸紝閫氳繃adb瀹夎鐨勮蔣浠?*.apk)閮藉湪"/data/app/"鐩綍涓嬶紝鎵浠ュ畨瑁呮椂涓嶅繀鍒跺畾璺緞錛屽嵏杞藉彧闇瑕佺畝鍗曠殑鎵ц"rm"灝辮銆?/p> 緇撴潫adb: adb kill-server 鏄劇ずandroid妯℃嫙鍣ㄧ姸鎬? 絳夊緟姝e湪榪愯鐨勮澶? adb wait-for-device 绔彛杞彂: adb forward adb forward tcp:5555 tcp:1234 鏌ョ湅bug鎶ュ憡: adb bugreport adb shell sqlite3 璁塊棶鏁版嵁搴揝QLite3 搴旂敤紼嬪簭閰嶇疆鏂囦歡: ----------------------------------------------------------------------------------- am鎸囦護(鍦╯hell鍐呬嬌鐢╝m鏉ュ姞杞絘ndroid搴旂敤): am instrument [-e <ARG_NAME> <ARG_VALUE>] 鍚姩嫻忚鍣? 鎷ㄦ墦鐢佃瘽: 鍚姩google map鐩存帴瀹氫綅鍒板寳浜? ----------------------------------------------------------------------------------- 鐩綍錛?/strong> 榪欓噷瑕佽鏄庝笅錛屼粠andorid涓緱鍒扮殑鏂囦歡嫻佺殑瀛楃涓茬殑欏哄簭鏄寜“綾誨瀷+鏉冮檺+鎷ユ湁鑰?鏁扮粍+澶у皬+鏃ユ湡+鍚嶇О+閾炬帴鍒?#8221;欏哄簭鎺掑垪鐨勶紝鍏朵腑綾誨瀷“d”琛ㄧず鐨勬槸鏂囦歡澶癸紝"l"琛ㄧず鐨勬槸閾炬帴,'-'琛ㄧず鐨勬槸鏂囦歡銆?/p> 渚嬪d rwxrwx--- system cache 2009-01-09 11:46 cache 涓婇潰鐨勭洰褰曞氨鏄氳繃瑙f瀽ls鍛戒護榪斿洖鐨勫瓧絎︿覆榪涜瑙f瀽鐨勩?/p> ----------------------------------------------------------------------------------- 鏁版嵁搴? 鑱旂粶浜?鍚氳瘽璁板綍)鏁版嵁搴擄細/data/data/com.android.providers.contacts/databases/contacts.db 閾冨0: /system/media/audio ----------------------------------------------------------------------------------- 銆銆瀹夎鍚庯細 android妯℃嫙鍣ㄥ拰鐪熸満鐨勪笉鍚屼箣澶勶細 * 涓嶆敮鎸佸懠鍙拰鎺ュ惉瀹為檯鏉ョ數錛涗絾鍙互閫氳繃鎺у埗鍙版ā鎷熺數璇濆懠鍙?鍛煎叆鍜屽懠鍑? andoroid妯℃嫙鍣ㄤ嬌鐢ㄦ敞鎰忥細 |
import android.app.Activity;
import android.view.Window;
import android.view.WindowManager;
public class ActivityUtil {
public static void noTitleBar(Activity activity){
activity.requestWindowFeature(Window.FEATURE_NO_TITLE);
}
public static void noNotificationBar(Activity activity){
final Window win = activity.getWindow();
win.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
public static void fullScreen(Activity activity){
noTitleBar(activity);
noNotificationBar(activity);
}
}
濂囨殑鏄?.0浠ヤ笂鐨勭増鏈紝
瑕佸湪.xml涓緗?br>AndroidManifest.xml 涓璦ctivity 鍔?android:theme="@android:style/Theme.NoTitleBar"AndroidManifest.xml 涓璦ctivity 鍔?android:theme="@android:style/Theme.NoTitleBar"
灞忓箷澶у皬 320 - 480 480-720
寰堝瀛︿範android鐨勬湅鍙嬮兘鎯崇湅鐪嬪畨瑁呯洰褰曢噷闈ample鐨勬晥鏋?浣嗘槸浣跨敤file-->import ... 閫夋嫨浜唕oot directory 鍚?涓嬮潰鐨刾roject娌℃湁欏圭洰閫夋嫨.璇曡瘯榪欐牱鍋?File-->new-->android project -->閫夋嫨create project from existing source ...-->閫夋嫨鐩綍,濡傛灉鐩綍閫夋嫨鍚嶣uild target娌℃湁閫夋嫨,鑷繁鍕鵑変竴涓?->finish,1.5鐨剆dk涓鑸鍏ユ椂浼氳嚜鍔ㄥ嬀閫塨uild target鐨?瀵煎叆鍚庝篃涓嶄細鏈変粈涔堥棶棰?鎷呬笉鏄?.5鐨?鐒跺悗build target閫夋嫨鐨勬槸1.5鐨?欏圭洰瀵煎叆榪涙潵鍚?src鐨勫寘閲岄潰浼氭湁涓涓猂.java鏂囦歡,gen鐩綍涓嬮潰涔熸湁涓涓猂.java鏂囦歡,姝ゆ椂,鍒犻櫎鎺塻rc鐨勫寘閲岄潰鐨勯偅涓猂.java鏂囦歡灝卞彲浠ヤ簡,1.0鐗堟湰鐨勪竴浜涘姛鑳?.5涓嶆敮鎸?姣斿璇碢hone,1.0鏈塒hone榪欎釜綾?閲岄潰鏈夋寕鎺夌數璇濈殑鏂規硶,浣?.0浠ヤ笂鐨勭増鏈笉鏀寔榪欎釜浜?鏈夎繖縐嶆儏鍐電殑璇濆氨鐢?.0鐨則arget鍠?...