android学习心得
android学习心得篇一
最后一个多星期的话,帮忙修复了一些小bug,还有页面方面的一些事,感觉做的还是不多!继续加油吧!
android学习心得篇二
研究android也有一段时间了,单从知识点来说,也撑握了不少东西,却从未在网上发布过任何东西。为了让喜欢android的新手们(其实我也是新 手)少走弯路,从现在起,我会把我总结的(更多是整理的别人的,我只一起展示给大家,也望作者勿怪)知识共享给大家,也希望大家能多提意见,共同进步。
最基本的开发环境配置、hello world等内容网上很多,我这里不写了,我只把各功能点和注意事项列给大家。
内容如下:
1、绘图
2、短信服务
3、电话服务
4、互联网应用
5、GOOGLE MAP
6、位置服务
7、SQLit
9、多媒体播放
9、多媒体录制
10、拍照
......
还有其它更细的知识点介绍。
(作者:子轩,邮箱:)
Android学习心得(一)——绘图做java的都知道,绘图肯定首先需要一个 Canvas,然后在用Graphics在上面绘制自己想要图案。不错,Android上面也类似,你可以从一个Bitmap得到它的Canvas,进行 绘制,也可以自定义一个View,用它的Canvas。不同的时,Android里没有Graphics,而用Paint代之,当然用法也稍有不同。以下 是自定义View的一段代码:
@Override
public void onDraw(Canvas canvas) {
// 首先定义一个paint
Paint paint = new Paint();
// 绘制矩形区域-实心矩形
// 设置颜色
paint.setColor(Color.WHITE);
// 设置样式-填充
paint.setStyle(Style.FILL);
// 绘制一个矩形
canvas.drawRect(new Rect(0, 0, getWidth(), getHeight()), paint);
// 绘空心矩形
// 设置颜色
paint.setColor(Color.RED);
// 设置样式-空心矩形
paint.setStyle(Style.STROKE);
// 绘制一个矩形
canvas.drawRect(new Rect(10, 10, 50, 20), paint);
// 绘文字
// 设置颜色
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中的可能稍有区别,前两个参数是左上角的坐标,后两个参数是右下角的坐标(不是宽度和高度);
2、Style.STROKE和Style.FILL外边的像素数是有区别的,这点和java里一样;
3、绘文字时,设置的坐标点为(30,30),但绘出来后你会发现,文字的左上角坐标要比你设置的偏上,不知道是android设置的bug,还是我们有理解到坐标点的意义。
Android学习心得(二)——短信服务Android中发短信非常方便,两行代码:
SmsManager sm = SmsManager.getDefault();
sm.sendTextMessage("10086", null, "hello", null, null);
由于现在我还没有Android手机,也不知道这样能否成功。
收短信稍稍复杂一点,需要建立一个BroadcastReceiver,来监听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、不要忘记添加短信收发相关的权限;
2、不要忘记配置SMSReceiver。
(作者:子轩,邮箱:)
Android学习心得(三)——电话服务Android打电话也是两行代码:
Intent intent = new Intent("android.intent.action.DIAL", Uri.parse("tel:10086") );
startActivity(intent);
这样便进进入呼叫界面了。
接下来我们再看一下监听电话状态的功能。
监听电话状态首先建立一个继承于PhoneStateListener电话监听类(如:TeleListener),并让TelephonyManager监听它。
TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
mTelephonyMgr.listen(new TeleListener(), PhoneStateListener.LISTEN_CALL_STATE | PhoneStateListener.LISTEN_SERVICE_STATE | PhoneStateListener.LISTEN_SIGNAL_STRENGTH);
TeleListener需要实现父类的几个方法,onCallStateChanged、onServiceStateChanged、onSignalStrengthChanged,根据方法名我们便可知其功能,这里就不再详述。
Android学习心得(四)——互联网应用Android中,互联网应用和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发送一张图片,定义了OutputStream和InputStream,其实这里InputStream本用不 着,但是如果不执行is=conn.getInputStream(),就发不出数据,不知道这是android的bug,还是规定。
Android学习心得(五)——GOOGLE MAPGOOGLE MAP API是Android的靓点之一,我们可以创建一个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内容如下:
<?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、不要忘了设置互联网访问权限。
(作者:子轩,邮箱:)
Android学习心得(六)——位置服务本节主要是介绍一下gps的使用,google map和gps的结合是android上主要应用之一,android market中,此类产品所占比例不小。
我们在上节的代码中添加如下内容:
LocationManager lm;
MyLocationListener locationListener;
lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationListener = new MyLocationListener();
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
缺少MyLocationListener吧?那我们就创建一个MyLocationListener,要实现LocationListener中的几个方法,LocationListener的功能我就不用再说了吧?
我吧代码贴出来,一目了然。
// 下面是从GPS获取坐标的监听,暂时没有使用
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) {
}
}
注意事项:
又是权限的问题,我全列出来,随便用哪个了。
<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学习心得(七)——SQLite众所周知,移动设备上的数据库最成功的非SQLite莫属了,Android上同样是用SQLite,并且android提供了较为简单的API,用起来非常顺手。
看下面的代码:
//定义数据库
SQLiteDatabase myDB = null;
//打开或建立数据库(当数据库不存在时,自动分创建)
myDB = this.openOrCreateDatabase("MY_DATABASE_NAME", "MODE_PRIVATE", null);
//删除表格、新建表格、插入数据、更新数据,地球人都知道,我也不说了
myDB.execSQL("........标准的SQL语句..........;");
//查询比较麻烦,我这里列出代码
//查询(表格和数据你自己去建立吧)
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();
//关装闭数据库
myDB.close();
怎么样?比jdbc要简单得多吧?移动设置上功能不需要太强大,好用就好。
(作者:子轩,邮箱:)
Android学习心得(八)——多媒体播放先看代码:
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,也不是很复杂。
我还是把代码加上吧,不然老感觉不完整。
VideoView videoView = new VideoView(this);
setContentView(videoView);
videoView.setVideoURI(Uri.parse("/sdcard/t.3gp"));
videoView.requestFocus();
videoView.start();
ndroid学习心得(九)——多媒体录制还是先看代码,用一种最笨的方式实现了录音的功能:
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已经上市,看来是时候弄部真机了。
(作者:子轩,邮箱:)
ndroid学习心得(十)——拍照拍照有两种方式,一是使用android.hardware.Camera,二是使用Intent("android.media.action.IMAGE_CAPTURE"),当然还是第一种好,不过代码太复杂,以后有时间再说,这里就说一下第二种方式吧。
try {
Intent i = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(i, Activity.DEFAULT_KEYS_DIALER);
} catch (Exception e) {
}
这样就可以调用系统的像机了。
当然你的Activity要重构一下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中了。当然,你也可以保存这个Bitmap到文件。
经测试,SDK 1.5版中,测试出错,大概是因为用的是模拟器吧,SDK 1.1版中,程序可以拍到照片,但是尺寸有点小,不知道为什么。这里,我没有怀疑自己,应该是Android的bug,也或者是我没有找在设置图片尺寸的 地方,如果哪位找到了解决办法,也麻烦通知我一下,我的邮箱就在下面。
Android学习心得(附1)——屏幕显示设置程序中默的显示是带有标题栏和系统信息栏的,有的时候,这很影响程序界面的美观。手机默认的是竖屏,或与感应器状态相关,为了某种效果,我们的程序需要限制使用横屏或竖屏。以下的代码就解决了上述问题。
//设置为无标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
//设置为全屏模式
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
//设置为横屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Android学习心得(附2)——Intent参数传递当Activity与Activity/Service(或其它情况)有时与要进行参数传递,最常用也是最简单的方式就是通过Intent来处理。
看如下代码:
Intent intent = new Intent(...);
Bundle bundle = new Bundle();
bundle.putString("NAME", "zixuan");
intent.putExtras(bundle);
context.startActivity(intent); 或 context.startService(intent);
当然,有传送就有接收,接收也很简单,如:
Bundle bunde = intent.getExtras();
String name = bunde.getInt("NAME");
当然参数KEY要与传送时的参数一致。
Android学习心得(附3)——获取手机号/手机串号在j2me中,根本没有办法获取用户的手机号码,就连获取手机串号(IMEI)都基本上无法实现,然后在android手机上一切都是如此的简单,看代码:
TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
String imei = tm.getDeviceId();
String tel = tm.getLine1Number();
看来,android的确加速了j2me的消亡。
Android学习心得(附4)——振动器总感觉手机上的振动器没有多大用处(当然静音模式下的振铃很有用),但还是顺带着说一下吧,只有两行代码:
1、获取振动服务的实例
Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
2、设置振动时长,单位当然也是ms
vibrator.vibrate(1000);
如果你觉得这样过去单调的话,可以设个节奏:
vibrator.vibrate(new long[]{10, 100, 20, 200}, -1);
两个参数,习惯告诉我第一个是节奏,第二个是重复次数,可事实并没有这么简单,我翻译不好,大家还是看原文吧:
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学习心得(附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,来调用目标组件。
Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
3、设置闹钟
获取闹钟管理的实例:
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
设置单次闹钟:
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (5*1000), pendingIntent);
设置周期闹钟:
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (10*1000), (24*60*60*1000), pendingIntent);
搞定!当然这里闹钟的响应处理只是用的文字,你可以播放声音,或都用更复杂的一系统通知,在这里你就是上帝,一切由你做主。
android学习心得篇三
Android 学习已有一年半有余,先后做过两款游戏、三款应用和搭建一台服务端,也了解过一些Android相关的源码(JDK、SDK和NDK)
后来想学深入点,搞过两款开源项目(LGame 和 AChartEngine),还发布过自己的开源项目(wsi-lgame-pro 和 mobilesurvey),现在总结一下自己的经验和心得
Android 入门
一开始学Android,主要看了三本书
《Android开发教程&笔记》,讲解了Android起源、Android框架、环境搭建、简单Demo等开发入门知识,对Android概念有个感性认识,知道Android是个什么东东
《Android应用开发揭秘》,重点练习了各种控件的使用,图片操作和动画,数据存储的各种方式和使用场景,以及网络通信,其中我感觉这本书对网络通信部分讲得最好
《Android 3D游戏开发》,重点看了View和SurfaceView绘制图片的原理和流程,用来做游戏开发,后来把随书的几个示例都调试通了,熟悉了各个资源文件夹的作用
《Android核心技术与实例详解》,其实这本书就没啥核心技术,也都是一些应用层的基础知识,重点是对手机通信、桌面组件、传感器和google服务讲得比较全面
就这样高强度学习了将近一个月,就算Android入门了,当时都是在Ubuntu环境下搭建和开发的,在练习和学习过程中,有哪不懂就上网查,在此推荐 stackoverflow
Android 进阶
android入门后,只会照着别人的葫芦来画瓢,即没有设计思想,也没有自主原创的代码,不好不好
于是乎,进了公司跟着项目走,用项目来驱动自己去学习和提高
公司是1+1开发模式,即1个美工 + 1个工程师,负责完成一个项目(主要是游戏开发),就完全需要自己设计游戏的布局、逻辑,以及各种动画,来增强用户体验的效果
当时主要是看Android官方的SDK API文档、中文API文档、 JDK源码,对有些感念不清楚,就上论坛去找答案,如CSDN、ITEye、IBM、知乎,或者去啃google 官方的文档
Android 高级
在后来,掌握了常用控件、view、surfaceview使用方式,知道怎样去适配不同屏幕后,每天就是重复的工作,堆砌代码,难以进一步去提升自己
于是就自己给自个找点事干,自定义控件,如对话框背景等,或去google code找些开源的代码下来研究,学习人家的设计思想、模块功能的划分、代码组织结构等知识
这个过程中,涉及到的知识比较多,如版本管理工具SVN、Git、Mercurial,如设计模式的思想,如怎样构建通用的开源应用框架(考虑sdk1.5等版本),如何适用在不同屏幕分辨率的手机上等等
学习中会不断遇到一个又一个新的问题,因此需要不断去查资料、再学习各种工具,逐步积累,潜移默化中自己掌握的知识和工具就多了,眼界也开阔了
这里推荐几个进阶的好书:
《Android技术内幕.系统卷》,此书与《Android应用开发揭秘》对应的系统篇,也是由杨丰盛著,主要讲解Android内部底层的实现,涉及到Linux、硬件驱动和汇编
老罗的博客,讲解Android底层的各个模块比较详尽、透彻,我有事没事会去访问、溜达,学习一些底层的实现,让自己增长一点见识,这样对理解应用层会有帮助
Android 开源
学习编程,最好的最快的方式,就是先阅读大量源代码,学习、借鉴,吸收,拿来主义,融会贯通,再加工,化为己用 —— 师夷长技以自强 ^_^
这里推荐几个比较好的开源社区:
google code(google 开源社区,包含google自己的开源项目,如chromium、gtest等,也包括其它的,如著名的MySQL、JavaScript、Python、...)
github(版本工具Git进行管理维护,英文)
oschina(开源中国,中文的开源社区)
看了android学习心得还看:
1.android的学习心得
2.android培训心得体会
3.安卓的实训心得
4.android应该如何学习
5.学习android的方法