android學(xué)習(xí)心得
android學(xué)習(xí)心得篇一
最后一個多星期的話,幫忙修復(fù)了一些小bug,還有頁面方面的一些事,感覺做的還是不多!繼續(xù)加油吧!
android學(xué)習(xí)心得篇二
研究android也有一段時間了,單從知識點來說,也撐握了不少東西,卻從未在網(wǎng)上發(fā)布過任何東西。為了讓喜歡android的新手們(其實我也是新 手)少走彎路,從現(xiàn)在起,我會把我總結(jié)的(更多是整理的別人的,我只一起展示給大家,也望作者勿怪)知識共享給大家,也希望大家能多提意見,共同進步。
最基本的開發(fā)環(huán)境配置、hello world等內(nèi)容網(wǎng)上很多,我這里不寫了,我只把各功能點和注意事項列給大家。
內(nèi)容如下:
1、繪圖
2、短信服務(wù)
3、電話服務(wù)
4、互聯(lián)網(wǎng)應(yīng)用
5、GOOGLE MAP
6、位置服務(wù)
7、SQLit
9、多媒體播放
9、多媒體錄制
10、拍照
......
還有其它更細的知識點介紹。
(作者:子軒,郵箱:)
Android學(xué)習(xí)心得(一)——繪圖做java的都知道,繪圖肯定首先需要一個 Canvas,然后在用Graphics在上面繪制自己想要圖案。不錯,Android上面也類似,你可以從一個Bitmap得到它的Canvas,進行 繪制,也可以自定義一個View,用它的Canvas。不同的時,Android里沒有Graphics,而用Paint代之,當(dāng)然用法也稍有不同。以下 是自定義View的一段代碼:
@Override
public void onDraw(Canvas canvas) {
// 首先定義一個paint
Paint paint = new Paint();
// 繪制矩形區(qū)域-實心矩形
// 設(shè)置顏色
paint.setColor(Color.WHITE);
// 設(shè)置樣式-填充
paint.setStyle(Style.FILL);
// 繪制一個矩形
canvas.drawRect(new Rect(0, 0, getWidth(), getHeight()), paint);
// 繪空心矩形
// 設(shè)置顏色
paint.setColor(Color.RED);
// 設(shè)置樣式-空心矩形
paint.setStyle(Style.STROKE);
// 繪制一個矩形
canvas.drawRect(new Rect(10, 10, 50, 20), paint);
// 繪文字
// 設(shè)置顏色
paint.setColor(Color.GREEN);
// 繪文字
canvas.drawText(str, 30, 30, paint);
// 繪圖
// 從資源文件中生成位圖
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
// 繪圖
canvas.drawBitmap(bitmap, 10, 10, paint);
}
以上需要注意的有三點:
1、Android中的Rect和java中的可能稍有區(qū)別,前兩個參數(shù)是左上角的坐標,后兩個參數(shù)是右下角的坐標(不是寬度和高度);
2、Style.STROKE和Style.FILL外邊的像素數(shù)是有區(qū)別的,這點和java里一樣;
3、繪文字時,設(shè)置的坐標點為(30,30),但繪出來后你會發(fā)現(xiàn),文字的左上角坐標要比你設(shè)置的偏上,不知道是android設(shè)置的bug,還是我們有理解到坐標點的意義。
Android學(xué)習(xí)心得(二)——短信服務(wù)Android中發(fā)短信非常方便,兩行代碼:
SmsManager sm = SmsManager.getDefault();
sm.sendTextMessage("10086", null, "hello", null, null);
由于現(xiàn)在我還沒有Android手機,也不知道這樣能否成功。
收短信稍稍復(fù)雜一點,需要建立一個BroadcastReceiver,來監(jiān)聽android.provider.Telephony.SMS_RECEIVED事件,我不太詳述,完整代碼如下:
public class SMSReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdusObj = (Object[]) bundle.get("pdus");
if (pdusObj != null) {
SmsMessage[] messages = new SmsMessage[pdusObj.length];
for (int n = 0; n < pdusObj.length; n++) {
messages[n] = SmsMessage.createFromPdu((byte[]) pdusObj[n]);
Log.d("MsgTest", "Message: " + n + " " + messages[n].getMessageBody());
Log.d("MsgTest", "Message from: " + messages[n].getOriginatingAddress());
}
}
}
}
}
注意:
1、不要忘記添加短信收發(fā)相關(guān)的權(quán)限;
2、不要忘記配置SMSReceiver。
(作者:子軒,郵箱:)
Android學(xué)習(xí)心得(三)——電話服務(wù)Android打電話也是兩行代碼:
Intent intent = new Intent("android.intent.action.DIAL", Uri.parse("tel:10086") );
startActivity(intent);
這樣便進進入呼叫界面了。
接下來我們再看一下監(jiān)聽電話狀態(tài)的功能。
監(jiān)聽電話狀態(tài)首先建立一個繼承于PhoneStateListener電話監(jiān)聽類(如:TeleListener),并讓TelephonyManager監(jiān)聽它。
TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
mTelephonyMgr.listen(new TeleListener(), PhoneStateListener.LISTEN_CALL_STATE | PhoneStateListener.LISTEN_SERVICE_STATE | PhoneStateListener.LISTEN_SIGNAL_STRENGTH);
TeleListener需要實現(xiàn)父類的幾個方法,onCallStateChanged、onServiceStateChanged、onSignalStrengthChanged,根據(jù)方法名我們便可知其功能,這里就不再詳述。
Android學(xué)習(xí)心得(四)——互聯(lián)網(wǎng)應(yīng)用Android中,互聯(lián)網(wǎng)應(yīng)用和java里基本一樣,也沒有什么好說的,但在我測試上傳圖片時遇到一個問題,先看一段代碼:
private void uploadImage(String httpUrl) {
try {
OutputStream os = null;
InputStream is = null;
URL url = new URL(httpUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("X-Online-Host", "www.ppice.com");
conn.connect();
os = conn.getOutputStream();
InputStream bmis = getResources().openRawResource(R.drawable.icon);
int i = 0;
while (i != -1) {
i = bmis.read();
os.write(i);
}
bmis.close();
os.flush();
os.close();
is = conn.getInputStream();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
這段代碼的功能是:向一個Servlet發(fā)送一張圖片,定義了OutputStream和InputStream,其實這里InputStream本用不 著,但是如果不執(zhí)行is=conn.getInputStream(),就發(fā)不出數(shù)據(jù),不知道這是android的bug,還是規(guī)定。
Android學(xué)習(xí)心得(五)——GOOGLE MAPGOOGLE MAP API是Android的靚點之一,我們可以創(chuàng)建一個MapActivity的子類,將MapView顯示于其上即可,可以用MapController來控制顯示的坐標、地圖模式和視野高度,處理起來非常簡單。
完整代碼如下:
public class MapTest extends MapActivity {
private MapView mapView;
private MapController mc;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mapview);
mapView = (MapView) findViewById(R.id.map);
mapView.setTraffic(true);
mc = mapView.getController();
GeoPoint gp = new GeoPoint((int) (30.659259 * 1000000), (int) (104.065762 * 1000000)); //地理坐標
mc.animateTo(gp);
mc.setZoom(12);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
}
mapview.xml內(nèi)容如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<com.google.android.maps.MapView android:id="@+id/map"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:enabled="true"
android:clickable="true"
android:apiKey="0mHnPl2NS9XPKx6pKwJriV2Wj-mEHSh71yyX_SQ"
/>
</RelativeLayout>
注意:
1、你要申請一個自己的apiKey;
2、不要忘了設(shè)置互聯(lián)網(wǎng)訪問權(quán)限。
(作者:子軒,郵箱:)
Android學(xué)習(xí)心得(六)——位置服務(wù)本節(jié)主要是介紹一下gps的使用,google map和gps的結(jié)合是android上主要應(yīng)用之一,android market中,此類產(chǎn)品所占比例不小。
我們在上節(jié)的代碼中添加如下內(nèi)容:
LocationManager lm;
MyLocationListener locationListener;
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationListener = new MyLocationListener();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
缺少MyLocationListener吧?那我們就創(chuàng)建一個MyLocationListener,要實現(xiàn)LocationListener中的幾個方法,LocationListener的功能我就不用再說了吧?
我吧代碼貼出來,一目了然。
// 下面是從GPS獲取坐標的監(jiān)聽,暫時沒有使用
public class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location loc) {
if (loc != null) {
Log.d("MapTest", "Location changed : Lat: " + loc.getLatitude() + " Lng: " + loc.getLongitude());
GeoPoint p = new GeoPoint((int) (loc.getLatitude() * 1E6), (int) (loc.getLongitude() * 1E6));
mc.animateTo(p);
mc.setZoom(16);
mapView.invalidate();
}
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
}
注意事項:
又是權(quán)限的問題,我全列出來,隨便用哪個了。
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
(作者:子軒,郵箱:)
Android學(xué)習(xí)心得(七)——SQLite眾所周知,移動設(shè)備上的數(shù)據(jù)庫最成功的非SQLite莫屬了,Android上同樣是用SQLite,并且android提供了較為簡單的API,用起來非常順手。
看下面的代碼:
//定義數(shù)據(jù)庫
SQLiteDatabase myDB = null;
//打開或建立數(shù)據(jù)庫(當(dāng)數(shù)據(jù)庫不存在時,自動分創(chuàng)建)
myDB = this.openOrCreateDatabase("MY_DATABASE_NAME", "MODE_PRIVATE", null);
//刪除表格、新建表格、插入數(shù)據(jù)、更新數(shù)據(jù),地球人都知道,我也不說了
myDB.execSQL("........標準的SQL語句..........;");
//查詢比較麻煩,我這里列出代碼
//查詢(表格和數(shù)據(jù)你自己去建立吧)
Cursor c = myDB.rawQuery("SELECT id,name,tel FROM MY_DATABASE_TABLE WHERE age>1 order by age;", null);
if (c != null) {
if (c.moveToFirst()) {
do {
Log.w("test", "id="+c.getString(c.getColumnIndex("id")));
Log.w("test", "name="+c.getString(c.getColumnIndex("name")));
Log.w("test", "tel="+c.getString(c.getColumnIndex("tel")));
Log.w("test", "--------------");
} while (c.moveToNext());
}
}
c.close();
//關(guān)裝閉數(shù)據(jù)庫
myDB.close();
怎么樣?比jdbc要簡單得多吧?移動設(shè)置上功能不需要太強大,好用就好。
(作者:子軒,郵箱:)
Android學(xué)習(xí)心得(八)——多媒體播放先看代碼:
try {
String path = "/sdcard/t.mp3";
MediaPlayer mp = null;
mp = new MediaPlayer();
mp.setDataSource(path);
mp.prepare();
mp.start();
mp.setOnCompletionListener(cl);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
音頻播放,就是這么簡單。
視頻播放用VideoView,也不是很復(fù)雜。
我還是把代碼加上吧,不然老感覺不完整。
VideoView videoView = new VideoView(this);
setContentView(videoView);
videoView.setVideoURI(Uri.parse("/sdcard/t.3gp"));
videoView.requestFocus();
videoView.start();
ndroid學(xué)習(xí)心得(九)——多媒體錄制還是先看代碼,用一種最笨的方式實現(xiàn)了錄音的功能:
try {
String path = "/sdcard/recorder.amr";
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(path+name);
recorder.prepare();
recorder.start();
try {
Runnable.wait(10000);
} catch (Exception exp) {
exp.printStackTrace();
}
recorder.stop();
recorder.release();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
10秒鐘哦,等也得等,不等也得等,不用線程怎么行。
錄像就是Audio+Video,所以還要加點東西,看代碼:
path = "/sdcard/v.3gp";
recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setVideoSize(176, 144);
recorder.setVideoFrameRate(15);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(path);
理論上是沒錯的,可我用模擬器測試錄制視頻還是會報錯,G2已經(jīng)上市,看來是時候弄部真機了。
(作者:子軒,郵箱:)
ndroid學(xué)習(xí)心得(十)——拍照拍照有兩種方式,一是使用android.hardware.Camera,二是使用Intent("android.media.action.IMAGE_CAPTURE"),當(dāng)然還是第一種好,不過代碼太復(fù)雜,以后有時間再說,這里就說一下第二種方式吧。
try {
Intent i = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(i, Activity.DEFAULT_KEYS_DIALER);
} catch (Exception e) {
}
這樣就可以調(diào)用系統(tǒng)的像機了。
當(dāng)然你的Activity要重構(gòu)一下onActivityResult方法,代碼如下:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Bundle extras = data.getExtras();
Bitmap b = (Bitmap) extras.get("data");
ImageView img = new ImageView(this);
img.setImageBitmap(b);
setContentView(img);
}
這樣,你拍到的照片就可以顯示在ImageView中了。當(dāng)然,你也可以保存這個Bitmap到文件。
經(jīng)測試,SDK 1.5版中,測試出錯,大概是因為用的是模擬器吧,SDK 1.1版中,程序可以拍到照片,但是尺寸有點小,不知道為什么。這里,我沒有懷疑自己,應(yīng)該是Android的bug,也或者是我沒有找在設(shè)置圖片尺寸的 地方,如果哪位找到了解決辦法,也麻煩通知我一下,我的郵箱就在下面。
Android學(xué)習(xí)心得(附1)——屏幕顯示設(shè)置程序中默的顯示是帶有標題欄和系統(tǒng)信息欄的,有的時候,這很影響程序界面的美觀。手機默認的是豎屏,或與感應(yīng)器狀態(tài)相關(guān),為了某種效果,我們的程序需要限制使用橫屏或豎屏。以下的代碼就解決了上述問題。
//設(shè)置為無標題欄
requestWindowFeature(Window.FEATURE_NO_TITLE);
//設(shè)置為全屏模式
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
//設(shè)置為橫屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Android學(xué)習(xí)心得(附2)——Intent參數(shù)傳遞當(dāng)Activity與Activity/Service(或其它情況)有時與要進行參數(shù)傳遞,最常用也是最簡單的方式就是通過Intent來處理。
看如下代碼:
Intent intent = new Intent(...);
Bundle bundle = new Bundle();
bundle.putString("NAME", "zixuan");
intent.putExtras(bundle);
context.startActivity(intent); 或 context.startService(intent);
當(dāng)然,有傳送就有接收,接收也很簡單,如:
Bundle bunde = intent.getExtras();
String name = bunde.getInt("NAME");
當(dāng)然參數(shù)KEY要與傳送時的參數(shù)一致。
Android學(xué)習(xí)心得(附3)——獲取手機號/手機串號在j2me中,根本沒有辦法獲取用戶的手機號碼,就連獲取手機串號(IMEI)都基本上無法實現(xiàn),然后在android手機上一切都是如此的簡單,看代碼:
TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
String imei = tm.getDeviceId();
String tel = tm.getLine1Number();
看來,android的確加速了j2me的消亡。
Android學(xué)習(xí)心得(附4)——振動器總感覺手機上的振動器沒有多大用處(當(dāng)然靜音模式下的振鈴很有用),但還是順帶著說一下吧,只有兩行代碼:
1、獲取振動服務(wù)的實例
Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
2、設(shè)置振動時長,單位當(dāng)然也是ms
vibrator.vibrate(1000);
如果你覺得這樣過去單調(diào)的話,可以設(shè)個節(jié)奏:
vibrator.vibrate(new long[]{10, 100, 20, 200}, -1);
兩個參數(shù),習(xí)慣告訴我第一個是節(jié)奏,第二個是重復(fù)次數(shù),可事實并沒有這么簡單,我翻譯不好,大家還是看原文吧:
public void vibrate (long[] pattern, int repeat)
pattern: an array of longs of times to turn the vibrator on or off.
repeat: the index into pattern at which to repeat, or -1 if you don't want to repeat.
google喜歡弄些技巧,我卻覺得這里有點弄巧成拙了。
Android學(xué)習(xí)心得(附5)——鬧鐘最近看了一下Android的鬧鐘管理類(AlarmManager),真不錯誤,強大又簡單,代碼如下:
1、建立一個AlarmReceiver繼承入BroadcastReceiver,并在AndroidManifest.xml聲明
public static class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "鬧鐘提示:時間到!", Toast.LENGTH_LONG).show();
}
}
2、建立Intent和PendingIntent,來調(diào)用目標組件。
Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
3、設(shè)置鬧鐘
獲取鬧鐘管理的實例:
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
設(shè)置單次鬧鐘:
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (5*1000), pendingIntent);
設(shè)置周期鬧鐘:
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10*1000), (24*60*60*1000), pendingIntent);
搞定!當(dāng)然這里鬧鐘的響應(yīng)處理只是用的文字,你可以播放聲音,或都用更復(fù)雜的一系統(tǒng)通知,在這里你就是上帝,一切由你做主。
android學(xué)習(xí)心得篇三
Android 學(xué)習(xí)已有一年半有余,先后做過兩款游戲、三款應(yīng)用和搭建一臺服務(wù)端,也了解過一些Android相關(guān)的源碼(JDK、SDK和NDK)
后來想學(xué)深入點,搞過兩款開源項目(LGame 和 AChartEngine),還發(fā)布過自己的開源項目(wsi-lgame-pro 和 mobilesurvey),現(xiàn)在總結(jié)一下自己的經(jīng)驗和心得
Android 入門
一開始學(xué)Android,主要看了三本書
《Android開發(fā)教程&筆記》,講解了Android起源、Android框架、環(huán)境搭建、簡單Demo等開發(fā)入門知識,對Android概念有個感性認識,知道Android是個什么東東
《Android應(yīng)用開發(fā)揭秘》,重點練習(xí)了各種控件的使用,圖片操作和動畫,數(shù)據(jù)存儲的各種方式和使用場景,以及網(wǎng)絡(luò)通信,其中我感覺這本書對網(wǎng)絡(luò)通信部分講得最好
《Android 3D游戲開發(fā)》,重點看了View和SurfaceView繪制圖片的原理和流程,用來做游戲開發(fā),后來把隨書的幾個示例都調(diào)試通了,熟悉了各個資源文件夾的作用
《Android核心技術(shù)與實例詳解》,其實這本書就沒啥核心技術(shù),也都是一些應(yīng)用層的基礎(chǔ)知識,重點是對手機通信、桌面組件、傳感器和google服務(wù)講得比較全面
就這樣高強度學(xué)習(xí)了將近一個月,就算Android入門了,當(dāng)時都是在Ubuntu環(huán)境下搭建和開發(fā)的,在練習(xí)和學(xué)習(xí)過程中,有哪不懂就上網(wǎng)查,在此推薦 stackoverflow
Android 進階
android入門后,只會照著別人的葫蘆來畫瓢,即沒有設(shè)計思想,也沒有自主原創(chuàng)的代碼,不好不好
于是乎,進了公司跟著項目走,用項目來驅(qū)動自己去學(xué)習(xí)和提高
公司是1+1開發(fā)模式,即1個美工 + 1個工程師,負責(zé)完成一個項目(主要是游戲開發(fā)),就完全需要自己設(shè)計游戲的布局、邏輯,以及各種動畫,來增強用戶體驗的效果
當(dāng)時主要是看Android官方的SDK API文檔、中文API文檔、 JDK源碼,對有些感念不清楚,就上論壇去找答案,如CSDN、ITEye、IBM、知乎,或者去啃g(shù)oogle 官方的文檔
Android 高級
在后來,掌握了常用控件、view、surfaceview使用方式,知道怎樣去適配不同屏幕后,每天就是重復(fù)的工作,堆砌代碼,難以進一步去提升自己
于是就自己給自個找點事干,自定義控件,如對話框背景等,或去google code找些開源的代碼下來研究,學(xué)習(xí)人家的設(shè)計思想、模塊功能的劃分、代碼組織結(jié)構(gòu)等知識
這個過程中,涉及到的知識比較多,如版本管理工具SVN、Git、Mercurial,如設(shè)計模式的思想,如怎樣構(gòu)建通用的開源應(yīng)用框架(考慮sdk1.5等版本),如何適用在不同屏幕分辨率的手機上等等
學(xué)習(xí)中會不斷遇到一個又一個新的問題,因此需要不斷去查資料、再學(xué)習(xí)各種工具,逐步積累,潛移默化中自己掌握的知識和工具就多了,眼界也開闊了
這里推薦幾個進階的好書:
《Android技術(shù)內(nèi)幕.系統(tǒng)卷》,此書與《Android應(yīng)用開發(fā)揭秘》對應(yīng)的系統(tǒng)篇,也是由楊豐盛著,主要講解Android內(nèi)部底層的實現(xiàn),涉及到Linux、硬件驅(qū)動和匯編
老羅的博客,講解Android底層的各個模塊比較詳盡、透徹,我有事沒事會去訪問、溜達,學(xué)習(xí)一些底層的實現(xiàn),讓自己增長一點見識,這樣對理解應(yīng)用層會有幫助
Android 開源
學(xué)習(xí)編程,最好的最快的方式,就是先閱讀大量源代碼,學(xué)習(xí)、借鑒,吸收,拿來主義,融會貫通,再加工,化為己用 —— 師夷長技以自強 ^_^
這里推薦幾個比較好的開源社區(qū):
google code(google 開源社區(qū),包含google自己的開源項目,如chromium、gtest等,也包括其它的,如著名的MySQL、JavaScript、Python、...)
github(版本工具Git進行管理維護,英文)
oschina(開源中國,中文的開源社區(qū))
看了android學(xué)習(xí)心得還看:
1.android的學(xué)習(xí)心得
2.android培訓(xùn)心得體會
3.安卓的實訓(xùn)心得
4.android應(yīng)該如何學(xué)習(xí)
5.學(xué)習(xí)android的方法
