高分网 > 通用学习方法 > 学习经验 >

android学习心得

时间: 嘉欣2 学习经验

  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的方法

74842