andrioid 桌面
視頻課:https://edu.csdn.net/course/play/7621
學習內容
?手機桌面管理的技巧
?如何實現實時壁紙
?如何創建快捷方式
?如何創建桌面小控件
?如何創建文件夾
能力目標 ?
?了解手機桌面管理的技巧
?熟練掌握如何實現實時壁紙
?熟練掌握如何創建快捷方式
?熟練掌握如何創建桌面小控件
?熟練掌握如何創建文件夾
本章簡介
Android被認為是新一代的移動操作系統,它與傳統的移動操作系統存在很大的區別。傳統的移動操作系統無論在功能還是外觀上,都與PC操作系統有很大的區別,而Android是目前比較接近PC操作系統的移動操作系統。Android最吸引人的功能恐怕就是可以直接顯示在屏幕上的“小玩意”:窗口小部件、快捷方式、實時文件夾。這些組件都充分體現了新一代移動操作系統的特征。在本節中,我們將結合具體的案例深入學習Android中這些與桌面組件相關的知識。
?
核心技能部分
當拿到Android手機后我們第一眼看到的就是桌面,這個手機桌面和PC機中Windows的桌面類似。桌面上通常用來放置一些常用的程序和功能組件。如圖7.1.1所示。
?
圖7.1.1 手機桌面
在手機桌面上我們首先看到的是壁紙,也就是手機桌面上的那張圖片,在桌面上排列著多個圖標,這些圖標分為三大類:快捷方式、實時文件夾、桌面控件。其中快捷方式與實時文件夾只占用桌面的一個擺放位置,而桌面控件則可以占據多個擺放位置。
我們可以通過程序管理Android桌面,包括改變系統壁紙、快捷方式、實時文件夾與桌面控件等。這也正是本章中我們要重點學習的內容。
7.1?手機桌面的管理
默認情況下,原生的Android系統在初始狀態下只會顯示一個壁紙以及Google Search和Home screen tips在桌面上。其中Google Search是屏幕最上方的搜索條;Home screen tips是搜索條下面的提示框,如下圖7.1.2所示 。
?
圖7.1.2 默認桌面
桌面上顯示的圖標是可以進行刪除和天機的刪除桌面組件可以通過以下兩步來完成:
(1)?在屏幕上長按指定組件,直到桌面下方出現垃圾桶。
(2)?將指定組件拖到桌面下方的垃圾桶中即可刪除,如下圖7.1.3所示。
?
圖7.1.3 刪除桌面圖標
添加桌面組件可以通過以下幾步來完成:
(1)?當系統顯示手機桌面時,長按手機屏幕空白區域,在桌面上顯示如圖7.1.4所示的菜單。
?
圖7.1.4 桌面菜單
(2)?以添加“快捷方式”為例,單擊圖7.1.4所示列表的“Shortcuts”菜單項,系統會顯示圖7.1.5的所示的界面。
?
圖7.1.5 選擇添加桌面快捷方式
(3)?以添加“ApiDemos”為例,選中圖7.1.5所示列表中的“ApiDemos”列表項,然后返回桌面將會看到圖7.1.6所示的界面,ApiDemos的快捷方式已經出現在桌面上了。
?
圖7.1.6 桌面快捷方式
7.2?實時壁紙
手機桌面壁紙總是只顯示靜態圖片會略顯單調,那么其實我們可以通過實時壁紙技術使手機桌面“動起來”。所謂實時壁紙就是指手機桌面不再是簡單的圖片,而是運行中的動畫,這個動畫是由程序實時繪制的,因此被稱為實時壁紙。
在Android中開發實時壁紙需要繼承名為WallpaperService的類,并重寫相關方法。具體步驟如下:
(1)?創建一個繼承自WallpaperService的類。
(2)?重寫WallpaperService的onCreateEngine()方法,該方法返回一個WallpaperService.Engine類的對象。
(3)?實現WallpaperService.Engine類,重寫onVisibilityChanged()、onOffsetsChanged()方法。另外,由于WallpaperService.Engine類采用了與SurfaceView相同的繪圖機制,因此可以選擇性地重寫SurfaceHolder.Callback中的三個方法,重寫這些方法時可通過SurfaceHolder動態地繪制圖形。
按照7.1節所示的內容,依次長按桌面—>Wallpapers—>Live wallpapers—>Cube,可以選擇Android系統默認提供的一個實時壁紙作為當前壁紙,設置完成后桌面效果如下圖7.1.7所示,整個立方體會沿著x軸的方向旋轉。
?
圖7.1.7 Cube效果
示例7.1
創建實時壁紙。
要求當系統進入預覽實時壁紙界面時,可以看到一個圓圈在不停地移動,如果7.1.8所示。單擊【Set Wallpaper】按鈕時,即可應用這個實時壁紙程序。然后當再次切換到Android系統界面,將可在桌面上看到圖7.1.9所示的效果。
?
圖7.1.8 實時壁紙預覽界面
?
?
圖7.1.9 自制實時壁紙效果圖
首先編寫一個繼承自WallpaperService的類來實現實時壁紙的相關服務,詳細代碼如下:
public?class?LiveWallpaperService extends?WallpaperService {
// 實現WallpaperService必須實現的抽象方法
@Override
public?Engine onCreateEngine() {
// 返回自定義的Engine
return?new?MyEngine();
}
?
class?MyEngine extends?Engine {
// 記錄程序界面是否可見
private?boolean?isVisibile;
// 記錄當前當前用戶動作事件的發生位置
private?float?touchX?= -1;
private?float?touchY?= -1;
// 記錄當前圓圈的繪制位置
private?float?cx?= 15;
private?float?cy?= 20;
// 定義畫筆
private?Paint mPaint?= new?Paint();
// 定義一個Handler
Handler mHandler?= new?Handler();
// 定義一個周期性執行的任務
private?final?Runnable drawTarget?= new?Runnable() {
public?void?run() {
drawFrame();
}
};
?
@Override
public?void?onCreate(SurfaceHolder surfaceHolder) {
super.onCreate(surfaceHolder);
// 初始化畫筆
mPaint.setColor(0xffffffff);
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(2);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStyle(Paint.Style.STROKE);
// 設置處理觸摸事件
setTouchEventsEnabled(true);
}
?
@Override
public?void?onDestroy() {
super.onDestroy();
// 刪除回調
mHandler.removeCallbacks(drawTarget);
}
?
@Override
public?void?onVisibilityChanged(boolean?visible) {
isVisibile?= visible;
// 當界面可見時候,執行drawFrame()方法。
if?(visible) {
// 動態地繪制圖形
drawFrame();
} else?{
// 如果界面不可見,刪除回調
mHandler.removeCallbacks(drawTarget);
}
}
?
@Override
public?void?onOffsetsChanged(float?xOffset, float?yOffset, float?xStep, float?yStep, int?xPixels, int?yPixels) {
drawFrame();
}
?
@Override
public?void?onTouchEvent(MotionEvent event) {
// 如果檢測到滑動操作
if?(event.getAction() == MotionEvent.ACTION_MOVE) {
touchX?= event.getX();
touchY?= event.getY();
} else?{
touchX?= -1;
touchY?= -1;
}
super.onTouchEvent(event);
}
?
// 定義繪制圖形的工具方法
private?void?drawFrame() {
// 獲取該壁紙的SurfaceHolder
final?SurfaceHolder holder = getSurfaceHolder();
Canvas c = null;
try?{
// 對畫布加鎖
c = holder.lockCanvas();
if?(c != null) {
c.save();
// 繪制背景色
c.drawColor(0xff000000);
// 在觸碰點繪制圓圈
drawTouchPoint(c);
// 繪制圓圈
c.drawCircle(cx, cy, 80, mPaint);
c.restore();
}
} finally?{
if?(c != null)
holder.unlockCanvasAndPost(c);
}
mHandler.removeCallbacks(drawTarget);
// 調度下一次重繪
if?(isVisibile) {
cx?+= 15;
cy?+= 20;
// 如果cx、cy移出屏幕后從左上角重新開始
if?(cx?> 320)
cx?= 15;
if?(cy?> 400)
cy?= 20;
// 指定0.1秒后重新執行mDrawCube一次
mHandler.postDelayed(drawTarget, 100);
}
}
?
// 在屏幕觸碰點繪制圓圈
private?void?drawTouchPoint(Canvas c) {
if?(touchX?>= 0 && touchY?>= 0) {
c.drawCircle(touchX, touchY, 40, mPaint);
}
}
}
}
在本Service類中重寫了WallpaperService.Engine的onVisibilityChanged()、onOffsetsChanged()方法,并指定了當桌面顯示時調用drawFrame()方法進行重繪,在drawFrame()方法中繪制完成后利用Handler對象指定0.1秒后重繪。
完成了Service類的編寫之后,接下來需要在功能清單文件中配置該Service,配置實時壁紙的Service時,需要指定運行實時壁紙所需要的權限及的編寫meta-data兩項內容。詳細代碼如下所示:
<service
????android:name=".LiveWallpaperService"
????android:label="@string/app_name"
????android:permission="android.permission.BIND_WALLPAPER"?>
?
????<!-- 為實時壁紙配置intent-filter -->
????<intent-filter>
????????<action?android:name="android.service.wallpaper.WallpaperService"/>
????</intent-filter>
????<!-- 為實時壁紙配置meta-data -->
????<meta-data
????????android:name="android.service.wallpaper"
????????android:resource="@xml/livewallpaper"?/>
</service>
上面配置文件中指定了實時壁紙的meta-data放在xml/livewallpaper中定義,因此程序還需要在res/xml目錄下增加一個livewallpaper.xml的文件,此文件的代碼如下:
<?xml?version="1.0"?encoding="utf-8"?>
<wallpaper?xmlns:android="http://schemas.android.com/apk/res/android"/>
運行該程序,當程序啟動起來之后,切換到Android桌面,長按桌面,在彈出的“Add to Home screen”對話框中單擊Wallpapers列表項,然后再在彈出的“Select wallpaper from”對話框中單擊“Live wallpapers”列表項,最后選擇“打開程序”,單擊打開的預覽窗口中“Set wallpaper”按鈕,就可以在將我們的動態桌面設置為系統默認的桌面。
雖然本示例程序實現的實時壁紙只是在桌面上繪制運動的圓形,程序功能比較簡單,但有關實時壁紙的知識點已經講解的比較透徹。在實際的應用開發中我們可以根據自己的需求在系統桌面上繪制更加復雜美觀的動態圖形,從而實現漂亮的實時壁紙功能。
7.3?創建快捷方式
如果手機中應用程序安裝的太多,找起來會很費勁。這種情況在Windows中是一樣的,而Windows系統通過在桌面上為應用程序創建快捷方式來解決該問題。我們Android中有沒有類似的功能呢?答案是肯定的,Android系統也有快捷方式的類似的功能。在Android中實現快捷方式的添加有兩種情況:向快捷方式列表添加快捷方式和直接將快捷方式添加到桌面。在本節中我們會通過兩個案例分針對這兩種情況進行講解。
默認情況下,應用程序的快捷方式不會出現在圖7.1.5所示的列表(快捷方式列表)中,為了讓指定應用程序出現在快捷方式列表中,只需要在功能清單文件中配置該Activity時指定相應的<intent-filter…/>元素即可。
?
示例7.2
向快捷方式列表添加快捷方式。新建一個項目,在該項目中新創建一個Activity,Activity類的詳細代碼如下:
public?class?AddShortcutToList?extends?Activity {
@Override
protected?void?onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
?????Button btn = new Button(this);
btn.setText("快捷方式列表中的快捷方式程序");
setContentView(btn);
}
}
在功能清單文件中對這個Activity類進行設置,代碼如下:
<activity
????android:name="MainViewAddShortcut"
????android:label="@string/app_name"?>
????<intent-filter>
????????????????<action?android:name="android.intent.action.MAIN"?/>
????????????????<action?android:name="android.intent.action.CREATE_SHORTCUT"?/>
????????????????<category?android:name="android.intent.category.LAUNCHER"?/>
????</intent-filter>
</activity>
此處配置快捷方式的Activity時,必須得指定CREATE_SHORTCUT動作,只需要將這個Activity添加到任何的應用程序中即可。在該程序啟動后,快捷方式會自動添加到圖7.1.4所示的列表中,如下圖7.1.10所示。
在該程序啟動后,快捷方式會自動添加到圖7.1.5所示的列表中,如下圖7.1.10所示。當我們單擊這個列表項時,就會調用相對應的Activity程序。
?
圖7.1.10 列表中的快捷方式
示例7.3
直接將快捷方式放在桌面上。
在示例7.2中我們只是將快捷方式直接添加到Shortcuts列表中,為了方便,我們也可以通過廣播的方式直接將快捷方式添加到桌面上。這種應用在我們的平時所接觸到的程序中比較常見,比如當我們第一次運行一個程序時,它會提示我們是否在桌面上設置快捷方式就是通過這種技術實現的。
首先寫一個只顯示一個ImageView的Activity,然后在主布局文件中提供一個id為shortCut的按鈕,當用戶單擊這個按鈕時調用上面創建的Activity,將圖片顯示在屏幕上。
Activity類代碼:
public?class?ShortcutActivity extends?Activity implements?OnClickListener {
@Override
public?void?onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.shortcut);
?
Button btn = (Button) findViewById(R.id.shortCut);
btn.setOnClickListener(this);
}
?
@Override
public?void?onClick(View view) {
//指定安裝快捷方式的Action
Intent installShortCut =
?new?Intent("com.android.launcher.action.INSTALL_SHORTCUT");
//指定快捷方式在桌面上的顯示名稱
installShortCut.putExtra(Intent.EXTRA_SHORTCUT_NAME, "打開圖片");
Parcelable icon =
???????????????Intent.ShortcutIconResource.fromContext(this, R.drawable.ic_launcher);
installShortCut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
Intent intent = new?Intent("com.hc.activity.DesktopActivity");
installShortCut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
sendBroadcast(installShortCut);
}
}
在功能清單文件中添加如下權限:
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
運行程序,會在桌面上生成如下圖7.1.11所示的快捷方式
?
圖7.1.11 桌面快捷方式
7.4?桌面小控件
所謂桌面小控件,指的是直接顯示在Android系統桌面上的小程序,比如圖7.1.1中的Google Seacher。一般來說, 我們可以把那些用戶經常用到的程序,比如搜索框、指南針、時鐘、日歷等做成桌面控件,這樣用戶可以直接在桌面上看到程序的運行界面,非常方便。
桌面小控件是通過廣播的形式進行控制的,因此每個桌面小控件都對應一個BroadcastReceiver類。為了簡化桌面小控件的開發,Android系統提供了一個名為AppWidgetProvider的BroadcastReceiver的子類。在開發桌面小控件時,我們只需要繼承這個類,并重寫它的不同狀態的生命周期方法,就可以非常方便地實現自己的需求。
AppWidgetProvider類里提供了如下四個不同的生命周期方法:
??onUpdate():負責更新桌面控件,它只有在小控件被用戶放到桌面上時才會被調用到。
??onDeleted():當一個或多個桌面小控件被刪除時回調這個方法。
??onEnabled():當接收到ACTION_APPWIDGET_ENABLED廣播時回調這個方法。
??onDisabled():當接收到ACTION_APPWIDGET_DISABLED廣播時回調這個方法。
一般來說,開發桌面小控件只需要定義一個AppWidgetProvider的子類,并重寫它的onUpdate()方法即可,重寫這個方法的步驟如下:
(1)?創建一個RemoteViews對象,創建該對象時可以加載指定的界面布局文件。
(2)?如果需要改變上一步所加載的界面布局文件的內容,可以通過RemoteViews對象進行修改。
(3)?創建一個ComponentName對象。
(4)?調用AppWidgetManager更新桌面小控件。
?
示例7.4
自定義一個數字時鐘桌面程序,效果如下圖7.1.12所示。
為了實現程序,我們需要在布局文件中定義5個ImageView,分別用來顯示小時、分鐘以及它們之間的冒號。為了讓時鐘實時地顯示當前時間,程序需要每隔一分鐘更新一次界面,我們可以借助Handler實現。
?
圖7.1.12 桌面時鐘
首先編寫布局文件,在布局文件digitclock.xml中提供id值分別為img01、img02、img03、img04、img05的五個ImageView,用來顯示具體的時鐘界面。然后在res/xml目錄下新建一個名為appwidget_provider.xml的文件,該文件用來指定桌面小控件使用誰作為meta-data,它的詳細代碼如下:
<?xml?version="1.0"?encoding="utf-8"?>
<appwidget-provider
xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="300px"
android:minHeight="52px"
android:updatePeriodMillis="60000"
android:initialLayout="@layout/digitclock"/>
繼承自AppWidgetProvider的數字時鐘類的代碼如下:
public?class?DigitClock extends?AppWidgetProvider?{
private?Timer timer?= new?Timer();
private?AppWidgetManager manager;
private?Context context;
// 將0~9的數字圖片定義成數組
private?int[] digits?= new?int[] {
?R.drawable.num1, R.drawable.num2, R.drawable.num3,
R.drawable.num4, R.drawable.num5, R.drawable.num6,
R.drawable.num7, R.drawable.num8, R.drawable.num9, R.drawable.num10};
// 將顯示小時、分鐘、秒鐘的ImageView定義成數組
private?int[] digitViews?= new?int[] { R.id.img01, R.id.img02, R.id.img04, R.id.img05?};
?
@Override
public?void?onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
this.manager?= appWidgetManager;
this.context?= context;
// 定義計時器
timer?= new?Timer();
// 啟動周期性調度
timer.schedule(new?TimerTask() {
public?void?run() {
// 發送空消息,通知界面更新
handler.sendEmptyMessage(1234);
}
}, 0, 60000);
}
?
private?Handler handler?= new?Handler() {
public?void?handleMessage(Message msg) {
super.handleMessage(msg);
if?(msg.what?== 1234) {
RemoteViews views = new?RemoteViews(context.getPackageName(), R.layout.digitclock);
// 定義SimpleDateFormat對象
SimpleDateFormat df = new?SimpleDateFormat("HHmm");
// 將當前時間格式化成HHmmss的形式
String time = df.format(new?Date());
for?(int?i = 0; i < time.length(); i++) {
// 將第i個數字字符轉換為對應的數字
int?num = time.charAt(i) - 48;
// 將第i個圖片的設為對應的數字圖片
views.setImageViewResource(digitViews[i], digits[num]);
}
// 將AppWidgetProvider子類實例包裝成ComponentName對象
??????????ComponentName componentName = new?ComponentName(context, DigitClock.class);
// 調用AppWidgetManager將remoteViews添加到ComponentName中
manager.updateAppWidget(componentName, views);
}
}
};
}
????由于AppWidgetProvider繼承了BroadcastReceiver,所以從本質上看它還是一個廣播,因此我們還需要在功能清單文件中使用<receiver/>元素來配置該廣播,配置該元素時需要為它指定相應的<intent-filter/>和<meta-data/>元素。代碼如下:
<receiver
????android:name=".DigitClock"
????android:label="@string/app_name"?>
?
????<!-- 將該BroadcastReceiver當成桌面小控件 -->
????<intent-filter>
????????<action?android:name="android.appwidget.action.APPWIDGET_UPDATE"?/>
????</intent-filter>
????<!-- 指定桌面小控件的meta-data -->
????<meta-data
????????android:name="android.appwidget.provider"
????????android:resource="@xml/appwidget_provider"?/>
</receiver>
????把該應用布置到模擬器上,按照7.1節所示的方法將該桌面程序安裝到桌面上,將會看到圖7.1.12所示的效果,時鐘會每隔一分鐘更新一次,與模擬器系統時間保持一致。
?7.5?實時文件夾
所謂的實時文件夾(LiveFoler)指的是用于顯示ContentProvider提供的數據的桌面組件。眾所周知ContentProvider組件用于向外提供數據訪問接口,一個應用程序可通過ContentProvider把自己的數據暴露出來,從而允許其它程序調用。ContentProvider除了可以供其它程序訪問外,還可以通過實時文件夾添加成桌面快捷方式。
當用戶把實時文件夾添加到桌面上之后,如果用戶單擊該實時文件夾,系統將會顯示從指定ContentProvider中查詢出來的全部數據,這在很大程度上為用戶的使用帶來了便利。
實時文件夾可以訪問其它應用程序中的數據,例如聯系人、電子郵件、短信等。從本質上來說它也是一個Activity,只是該Activity并不會加載任何顯示界面,開發實時文件夾同樣需要繼承Activity,并重寫onCreate()方法,重寫此方法時建議大家按照如下步驟進行:
(1)?創建一個Intent。
(2)?調用該Intent的setData(Uri uri)方法,該Uri參數就是ContentProvider對外提供數據的Uri。進入該文件夾將會顯示此ContentProvider所返回的數據列表。
(3)?依次調用Intent對象的putExtra()方法來設置實時文件夾的圖標、標題、顯示模式等內容。
(4)?設置完成后,調用Activity的finish()方法結束當前的Activity。
示例7.5
創建實時文件夾,顯示電話本中的聯系人的信息。
Activity類的代碼如下:
public?class?AddLiveFolder extends?Activity {
@Override
public?void?onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if?(LiveFolders.ACTION_CREATE_LIVE_FOLDER.equals(getIntent().getAction())) {
Intent intent = new?Intent();
intent.setData(Uri.parse("content://contacts/live_folders/people"));
intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_BASE_INTENT, new?Intent(Intent.ACTION_VIEW, ContactsContract.Contacts.CONTENT_URI));
intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_NAME, "電話本");
intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_ICON, Intent.ShortcutIconResource.fromContext(this, android.R.drawable.sym_action_call));
intent.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_DISPLAY_MODE, LiveFolders.DISPLAY_MODE_LIST);
setResult(RESULT_OK, intent);
} else?{
setResult(RESULT_CANCELED);
}
finish();
}
}
本示例中用到了大量的實時文件夾相關的屬性常量,具體含義參看下表7-1-1所示。
表7-1-1 實時文件夾常用屬性及含義
名稱 | 含義 |
EXTRA_LIVE_FOLDER_NAME | 實時文件夾的名稱 |
EXTRA_LIVE_FOLDER_ICON | 實時文件夾的圖標 |
EXTRA_LIVE_FOLDER_DISPLAY_MODE | 實時文件夾的顯示模式,取值有: ??DISPLAY_MODE_LIST(列表) ??DISPLAY_MODE-GRID(網格) |
EXTRA_LIVE_FOLDER_BASE_INTENT | 當該項數據被單擊時,將啟動該Intent對應的程序組件,并把該數據的主鍵追加到該Intent的data數據后面。 |
功能清單文件中對上述配置文件進行注冊,代碼如下:
<activity
?????android:name=".AddLiveFolder"
?????android:label="電話本"?>
?????<intent-filter>
???????????<action?android:name="android.intent.action.CREATE_LIVE_FOLDER"?/>
?????</intent-filter>
</activity>
程序運行效果如下圖7.1.13所示,當我們單擊這個電話圖標時就會打開聯系人界面,如下圖7.1.14所示:
?
圖7.1.13 電話本實時文件夾
?
圖7.1.14 聯系人列表
任務實訓部分??
1:?倒計時桌面小控件
訓練技能點
自定義桌面小控件
需求說明
倒計時提醒是我們日常生活經常用到的一個功能,本程序要求大家做按照下圖7.2.1所示的界面設計一個具有倒計時提醒功能的桌面小控件,用戶可以自行指定提示的內容及時間。
?
圖7.2.1 倒計時桌面控件
2:創建快捷方式
需求說明
為之前編寫的軟件管理器創建一個快捷方式。要求當用戶第一次運行軟件退出軟件時,系統彈出一個詢問用戶是否創建桌面快捷方式的對話框,當用戶確認后會在桌面上創建本程序的快捷方式;否則,不創建快捷方式。
?
鞏固練習
?
一、簡答題
1.?簡單闡述在Android中開發實時壁紙的步驟。?
2.?簡單闡述在Android中創建實時文件夾的步驟。?
二、上機練習
修改7.5節中的實時文件夾示例程序的代碼,要求:當我們單擊桌面的電話圖標時,顯示出來的聯系人信息以網格的形式進行顯示。?
?
總結
以上是生活随笔為你收集整理的andrioid 桌面的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 特色输入输出
- 下一篇: GPS用户定位