android:SQLite数据库 增、删、改、查

学习android开发不可避免的会涉及数据库的使用,android使用的是SQLite数据库。对于SQLite数据库的基本信息这里就不过多的介绍,我们主要看哈是怎么用的就是了。

与以往数据库不一样的地方

以前我们做javaWeb开发时用jdbc连接,现在变了,个人觉得变得简单了。在应用程序中直接就可以去创建数据库,然后对其进行操作。不用像以前写连接代码。

操作数据库

一,SQLiteOpenHelper 类

其中:

getReadableDatabase()得到可读的数据库,返回SQLiteDatabase对象,然后通过对象进行数据库操作。

getWritableDatabase()得到可写的数据库,返回SQLiteDatabase对象,然后通过对象进行数据库操作。

onCreate(SQLiteDatabase db)在第一次创建数据库时调用。

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)在更改数据库时都会调用。

onOpen(SQLiteDatabase db)当数据库打开时调用。

close()关闭数据库。

二,SQLiteDatabase类

这个类提供了对数据库的一些基本操作:

insert()

delete()

update()

query()

。。。。。等等。

代码:

SQLiteOpenHelper 的子类:

  1. import android.content.Context;
  2. import android.database.sqlite.SQLiteDatabase;
  3. import android.database.sqlite.SQLiteDatabase.CursorFactory;
  4. import android.database.sqlite.SQLiteOpenHelper;
  5. /**
  6.  * 通过getReadableDatabase()和getWritableDatabase()可以获得数据库对象。
  7.  * 提供onCreate()-创建数据库时,onUpgrade()-升级数据库时,两个回调函数。
  8.  */
  9. public class DatabaseHelper extends SQLiteOpenHelper {
  10.     // 按要求必须要有构造函数
  11.     public DatabaseHelper(Context context, String name, CursorFactory factory,
  12.             int version) {
  13.         super(context, name, factory, version);
  14.     }
  15.     // 当第一次得到SQLiteDatabase对象时,调用该方法
  16.     @Override
  17.     public void onCreate(SQLiteDatabase db) {
  18.         String sql = “create table MSG(id int,body varchar(100))”;
  19.         db.execSQL(sql);
  20.         System.out.println(“创建了一个数据库!”);
  21.     }
  22.     // 当更新数据库时执行该方法
  23.     @Override
  24.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  25.         System.out.println(“更新了数据库!”);
  26.         // 还可以写其他的操作
  27.     }
  28. }

有了这个类后,我们就可以对数据库进行增、删、改、查操作了。
插入数据:

  1. //生成ContentValues对象,key:列名,value:想插入的值
  2.                 ContentValues values = new ContentValues();
  3.                 values.put(“id”, 1);
  4.                 values.put(“body”, “hello”);
  5.                 DatabaseHelper dbhelper = new DatabaseHelper(SqliteActivity.this, “text_msg”, null, 2);
  6.                 //得到可写的SQLiteDatabase对象
  7.                 SQLiteDatabase db = dbhelper.getWritableDatabase();
  8.                 //调用insert方法,将数据插入数据库
  9.                 //参数1:表名
  10.                 //参数2:如果你想插入空值,那么你必须指定它的所在的列
  11.                 db.insert(“MSG”, null, values);
  12.                 System.out.println(“插入了:1, hello”);

删除数据:

  1. DatabaseHelper dbhelper = new DatabaseHelper(SqliteActivity.this, “text_msg”, null, 2);
  2.                 //得到可写的SQLiteDatabase对象
  3.                 SQLiteDatabase db = dbhelper.getWritableDatabase();
  4.                 //调用delete方法,删除数据
  5.                 db.delete(“MSG”, “id=?”, new String[]{“1”});
  6.                 System.out.println(“删除了:id=1”);

修改数据:

  1. ContentValues values = new ContentValues();
  2.                 values.put(“body”, “my dear!”);
  3.                 DatabaseHelper dbhelper = new DatabaseHelper(SqliteActivity.this, “text_msg”, null, 2);
  4.                 //得到可写的SQLiteDatabase对象
  5.                 SQLiteDatabase db = dbhelper.getWritableDatabase();
  6.                 //调用insert方法,将数据插入数据库
  7.                 //参数3:where 子句 “?”是占位符号,对应后面的”1”,这和web开发时的语法是一样的
  8.                 db.update(“MSG”, values, “id=?”, new String[]{“1”});
  9.                 System.out.println(“更新了:hello–>my dear!”);

查询数据:

  1. DatabaseHelper dbhelper = new DatabaseHelper(SqliteActivity.this, “text_msg”, null, 2);
  2.                 //得到可读的SQLiteDatabase对象
  3.                 SQLiteDatabase db = dbhelper.getReadableDatabase();
  4.                 //参数1:表名
  5.                 //参数2:要想显示的列
  6.                 //参数3:where子句
  7.                 //参数4:where子句对应的条件值
  8.                 //参数5:分组方式
  9.                 //参数6:having条件
  10.                 //参数7:排序方式
  11.                 Cursor cursor = db.query(“MSG”, new String[]{“id”,”body”}, “id=?”, new String[]{“1”}, null, null, null);
  12.                 System.out.println(“查到的数据为:”);
  13.                 while(cursor.moveToNext()){
  14.                         int id = cursor.getInt(cursor.getColumnIndex(“id”));
  15.                         String name = cursor.getString(cursor.getColumnIndex(“body”));
  16.                         System.out.println(“–>”+id+”::::::::::”+name);
  17.                     }

怎样使用adb查看数据库?

SQLite没有客户端,不能直接的查看数据库,所以用它提供的adb吧。

1,进入命令行后输入adb回车,会显示很多的信息。

2,输入adb shell回车,就进入了Linux命令行,现在就可以使用Linux的命令了。

3,ls回车,显示所有的东西,其中有个data。(ls:显示所有,cd:进入)

4,cd data回车,再ls回车,cd data回车,ls回车后就会看到很多的com.。。。的东西,那就是机器上的应用程序,找到你应用程序的包名,然后进入。

5,进去后在查看所有,会发现个databases,进入databases,显示所有就会发现你的数据库名字,我这里使用的是”text_msg”。

6,sqlite3 text_msg回车就进入了你的数据库了,然后“.schema”就会看到该应用程序的所有表及建表语句。

7,现在你就可以使用标准的SQL语句查看刚才生成的数据库及数据了。

对数据库的操作方法很多,这只是其中一种。

原文地址:http://blog.csdn.net/zzy916853616/article/details/6599898

Android 盘点所有Dialog 对话框 大合集 详解

雨松MOMO带大家盘点Android 中的对话框

今天我用自己写的一个Demo 和大家详细介绍一个Android中的对话框的使用技巧。


1.确定取消对话框

对话框中有2个按钮   通过调用 setPositiveButton 方法 和 setNegativeButton 方法 可以设置按钮的显示内容以及按钮的监听事件。

我们使用AlerDialog 创建对话框

  1. AlertDialog.Builder builder = new AlertDialog.Builder(MainDialog.this);

使用builder设置对话框的title button icon 等等

  1. builder.setIcon(R.drawable.icon);
  2.        builder.setTitle(“你确定要离开吗?”);
  3.        builder.setPositiveButton(“确定”, new DialogInterface.OnClickListener() {
  4.            public void onClick(DialogInterface dialog, int whichButton) {
  5.                //这里添加点击确定后的逻辑
  6.                showDialog(“你选择了确定”);
  7.            }
  8.        });
  9.        builder.setNegativeButton(“取消”, new DialogInterface.OnClickListener() {
  10.            public void onClick(DialogInterface dialog, int whichButton) {
  11.                //这里添加点击确定后的逻辑
  12.                showDialog(“你选择了取消”);
  13.            }
  14.        });
  15.        builder.create().show();

这个dialog用于现实onClick后监听的内容信息

  1. private void showDialog(String str) {
  2. w AlertDialog.Builder(MainDialog.this)
  3.      .setMessage(str)
  4.      .show();
  5. }

2.多个按钮信息框

  1. AlertDialog.Builder builder = new AlertDialog.Builder(MainDialog.this);
  2. builder.setIcon(R.drawable.icon);
  3. builder.setTitle(“投票”);
  4. builder.setMessage(“您认为什么样的内容能吸引您?”);
  5. builder.setPositiveButton(“有趣味的”, new DialogInterface.OnClickListener() {
  6.     public void onClick(DialogInterface dialog, int whichButton) {
  7.         showDialog(“你选择了有趣味的”);
  8.     }
  9. });
  10. builder.setNeutralButton(“有思想的”, new DialogInterface.OnClickListener() {
  11.     public void onClick(DialogInterface dialog, int whichButton) {
  12.         showDialog(“你选择了有思想的”);
  13.     }
  14. });
  15. builder.setNegativeButton(“主题强的”, new DialogInterface.OnClickListener() {
  16.     public void onClick(DialogInterface dialog, int whichButton) {
  17.         showDialog(“你选择了主题强的”);
  18.     }
  19. });
  20. builder.create().show();

3.列表框

这个数组用于列表选择

  1. final String[] mItems = {“item0″,”item1″,”itme2″,”item3″,”itme4″,”item5″,”item6”};
  1. AlertDialog.Builder builder = new AlertDialog.Builder(MainDialog.this);
  2.         builder.setTitle(“列表选择框”);
  3.         builder.setItems(mItems, new DialogInterface.OnClickListener() {
  4.             public void onClick(DialogInterface dialog, int which) {
  5.                 //点击后弹出窗口选择了第几项
  6.                 showDialog(“你选择的id为” + which + ” , ” + mItems[which]);
  7.             }
  8.         });
  9.         builder.create().show();

4.单项选择列表框

mSingleChoice 用于记录单选中的ID

  1. int mSingleChoiceID = -1;
  1. AlertDialog.Builder builder = new AlertDialog.Builder(MainDialog.this);
  2. mSingleChoiceID = -1;
  3. builder.setIcon(R.drawable.icon);
  4.     builder.setTitle(“单项选择”);
  5.     builder.setSingleChoiceItems(mItems, 0, new DialogInterface.OnClickListener() {
  6.         public void onClick(DialogInterface dialog, int whichButton) {
  7.                 mSingleChoiceID = whichButton;
  8.                 showDialog(“你选择的id为” + whichButton + ” , ” + mItems[whichButton]);
  9.         }
  10.     });
  11.     builder.setPositiveButton(“确定”, new DialogInterface.OnClickListener() {
  12.         public void onClick(DialogInterface dialog, int whichButton) {
  13.             if(mSingleChoiceID > 0) {
  14.             showDialog(“你选择的是” + mSingleChoiceID);
  15.             }
  16.         }
  17.     });
  18.     builder.setNegativeButton(“取消”, new DialogInterface.OnClickListener() {
  19.         public void onClick(DialogInterface dialog, int whichButton) {
  20.         }
  21.     });
  22.    builder.create().show();

5.进度条框

点击进度条框按钮后 开启一个线程计算读取的进度 假设读取结束为 100
Progress在小于100的时候一直在线程中做循环++ 只到读取结束后,停止线程。

  1.           mProgressDialog = new ProgressDialog(MainDialog.this);
  2.      mProgressDialog.setIcon(R.drawable.icon);
  3.      mProgressDialog.setTitle(“进度条窗口”);
  4.      mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  5.      mProgressDialog.setMax(MAX_PROGRESS);
  6.      mProgressDialog.setButton(“确定”, new DialogInterface.OnClickListener() {
  7.          public void onClick(DialogInterface dialog, int whichButton) {
  8.              //这里添加点击后的逻辑
  9.          }
  10.      });
  11.      mProgressDialog.setButton2(“取消”, new DialogInterface.OnClickListener() {
  12.          public void onClick(DialogInterface dialog, int whichButton) {
  13.              //这里添加点击后的逻辑
  14.          }
  15.      });
  16.      mProgressDialog.show();
  17.      new Thread(this).start();
  18. ic void run() {
  19. int Progress = 0;
  20. while(Progress < MAX_PROGRESS) {
  21. try {
  22.     Thread.sleep(100);
  23.     Progress++;
  24.     mProgressDialog.incrementProgressBy(1);
  25. } catch (InterruptedException e) {
  26.     // TODO Auto-generated catch block
  27.     e.printStackTrace();
  28. }
  29. }

6.多项选择列表框

MultiChoiceID 用于记录多选选中的id号 存在ArrayList中
选中后 add 进ArrayList
取消选中后 remove 出ArrayList

  1. ArrayList <Integer>MultiChoiceID = new ArrayList <Integer>();
  1. AlertDialog.Builder builder = new AlertDialog.Builder(MainDialog.this);
  2. MultiChoiceID.clear();
  3. builder.setIcon(R.drawable.icon);
  4.     builder.setTitle(“多项选择”);
  5.     builder.setMultiChoiceItems(mItems,
  6.             new boolean[]{false, false, false, false, false, false, false},
  7.             new DialogInterface.OnMultiChoiceClickListener() {
  8.                 public void onClick(DialogInterface dialog, int whichButton,
  9.                         boolean isChecked) {
  10.                    if(isChecked) {
  11.                        MultiChoiceID.add(whichButton);
  12.                        showDialog(“你选择的id为” + whichButton + ” , ” + mItems[whichButton]);
  13.                    }else {
  14.                        MultiChoiceID.remove(whichButton);
  15.                    }
  16.                 }
  17.             });
  18.     builder.setPositiveButton(“确定”, new DialogInterface.OnClickListener() {
  19.         public void onClick(DialogInterface dialog, int whichButton) {
  20.             String str = “”;
  21.             int size = MultiChoiceID.size();
  22.             for (int i = 0 ;i < size; i++) {
  23.             str+= mItems[MultiChoiceID.get(i)] + “, “;
  24.             }
  25.             showDialog(“你选择的是” + str);
  26.         }
  27.     });
  28.     builder.setNegativeButton(“取消”, new DialogInterface.OnClickListener() {
  29.         public void onClick(DialogInterface dialog, int whichButton) {
  30.         }
  31.     });
  32.    builder.create().show();

7.自定义布局


讲到自定义布局我就得多说一说了,为什么要多说一说呢?
其实自定义布局在Android的开发中非常重要 因为它能让开发者做出自己五彩缤纷的Activity 而不用去使用系统枯燥的界面。

自定义dialog有什么好处?

比如我们在开发过长当中 要通过介绍系统发送的一个广播弹出一个dialog . 但是dialog必需是基于activity才能呈现出来 如果没有activity 的话 程序就会崩溃。所以我们可以写一个自定义的 dialog 把它定义成一个activity
这样我们收到一条打开dialog的广播后 直接启动这个 activity  程序正常运行~~

这就是自定义dialog的好处。

注明:下面这个例子只是写了自定义dialog 没有把它单独的写在一个activity中 如果须要的话 可以自己改一下。

  1. AlertDialog.Builder builder = new AlertDialog.Builder(MainDialog.this);
  2.  LayoutInflater factory = LayoutInflater.from(this);
  3.  final View textEntryView = factory.inflate(R.layout.test, null);
  4.      builder.setIcon(R.drawable.icon);
  5.      builder.setTitle(“自定义输入框”);
  6.      builder.setView(textEntryView);
  7.      builder.setPositiveButton(“确定”, new DialogInterface.OnClickListener() {
  8.          public void onClick(DialogInterface dialog, int whichButton) {
  9.          EditText userName = (EditText) textEntryView.findViewById(R.id.etUserName);
  10.          EditText password = (EditText) textEntryView.findViewById(R.id.etPassWord);
  11.          showDialog(“姓名 :”  + userName.getText().toString()  + “密码:” + password.getText().toString() );
  12.          }
  13.      });
  14.      builder.setNegativeButton(“取消”, new DialogInterface.OnClickListener() {
  15.          public void onClick(DialogInterface dialog, int whichButton) {
  16.          }
  17.      });
  18.    builder.create().show();
  1. <span style=”color:#000000;”><?xml version=”1.0″ encoding=”utf-8″?>
  2. <RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
  3. android:layout_height=”wrap_content”
  4. android:layout_width=”wrap_content”
  5. android:orientation=”horizontal”
  6. android:id=”@+id/dialog”>
  7. <LinearLayout
  8. android:layout_height=”wrap_content”
  9. android:layout_width=”wrap_content”
  10. android:orientation=”horizontal”
  11. android:id=”@+id/dialogname”>
  12. <TextView android:layout_height=”wrap_content”
  13.    android:layout_width=”wrap_content”
  14.   android:id=”@+id/tvUserName”
  15.   android:text=”姓名:” />
  16. <EditText android:layout_height=”wrap_content”
  17.   android:layout_width=”wrap_content”
  18.   android:id=”@+id/etUserName”
  19.   android:minWidth=”200dip”/>
  20. </LinearLayout>
  21. <LinearLayout
  22. android:layout_height=”wrap_content”
  23. android:layout_width=”wrap_content”
  24. android:orientation=”horizontal”
  25. android:id=”@+id/dialognum”
  26.  android:layout_below=”@+id/dialogname”
  27. >
  28.   <TextView android:layout_height=”wrap_content”
  29.    android:layout_width=”wrap_content”
  30.   android:id=”@+id/tvPassWord”
  31.   android:text=”密码:” />
  32. <EditText android:layout_height=”wrap_content”
  33.   android:layout_width=”wrap_content”
  34.   android:id=”@+id/etPassWord”
  35.   android:minWidth=”200dip”/>
  36.  </LinearLayout>
  37.   </RelativeLayout></span>


8.读取进度框

显示一个正在转圈的进度条loading

 

  1. mProgressDialog = new ProgressDialog(this);
  2.  mProgressDialog.setTitle(“读取ing”);
  3.  mProgressDialog.setMessage(“正在读取中请稍候”);
  4.  mProgressDialog.setIndeterminate(true);
  5.  mProgressDialog.setCancelable(true);
  6.  mProgressDialog.show();

最后如果你还是觉得我写的不够详细 不要紧我把源代码的下载地址贴出来 欢迎大家一起讨论学习 雨松MOMO希望可以和大家一起进步。

15 Best Free Android Games You Love To Play

Android is open sources OS (operating System) for smart phones. Google’s mobile platform, the second most popular operating system using smart phones. Android has a big library of free apps and its growing day by day. Android Market has a big collection of free apps and free games, Android gaming market is also growing as well. So today we come with some best Android games for free download, you would love playing.

Our Last article, related to games appreciated by our readers a lot- best Linux 3D Games For free to use. And again this time we catch best android games for free to use. if you have Android phone then you must try these free Android games for kill free time and having fun.

I have been searching free games for android to make a best list for Android platform users. And finally i got the best list of free games for Android smart phones for having fun and enjoy. These games are the latest version of year 2011.

 

I hope Android platform users whom loves to play games on their smart phones will love to use these free android games. here we have listed 15 best free android games you love to play. You can share your views in our comment section below.

1. Bubble Blast 2

2. Angry Birds


3.  Yoo Ninja

4. Paradise Island

5. Drag Racing

6. Unblock Me

7. Mouse Trap

8. Paper Toss

9. Ant Smasher

10. iRunner

11. SpeedX

12. Air Control

13. Speed Anatomy

14. Aporkalypse Free

15. Math Maniac

 

CentOS 6正式发布,免费的企业级Linux

CentOS 6 正式版已于7月9日发布。

CentOS(Community ENTerprise Operating System)是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用。两者的不同在于,CentOS并不包含封闭源代码软件。

CentOS 6.0 基于上游的 Red Hat Enterprise Linux 6.0 制作,同时基本包含了所有的上游软件包。CentOS 完全遵守上游供应商的再发行政策,并且以百分之百的软件兼容性为目标,但相对于 RHEL ,CentOS 最主要的改变是去除了上游供应商的商标及美工图。

CentOS 6上游版本发行注记和文档:Red Hat Enterprise Linux 6

CentOS 6相对于上游版本 RHEL 6,修改、删除和新增了部分组件,详细情况参阅:发行注记

官方网站:http://www.centos.org/

下载页面:http://www.centos.org/modules/tinycontent/index.php?id=15

敏捷方法中测试人员的价值?

敏捷方法在软件开发中受到青睐,特别是在互联网应用服务系统的开发中,越来越多的公司采用敏捷方法,包括XPScrumLeanCrystalFDD等。具体的敏捷方法在操作时有一些区别,但基本思想是一致的,如客户至上、拥抱变化、缩短迭代周期、自我组织等。在敏捷方法中,流程相对灵活,强调沟通,通过充分的沟通来及时解决问题,由于沟通充分,文档不是很重要,而且有可能不采用Word等独立的文件格式,而是采用Wiki、空间等web内容方式。

在敏捷方法中,需求变化比较快、产品开发周期很短(一、两周),给软件测试带来很大的挑战!例如,功能测试的自动化实现就比较困难,没有足够时间开发自动化测试脚本,要花大量时间讨论产品特性,及时进行产品的验收测试。自动化测试,更多的是在单元测试这个层次上实现。而单元测试自动化、持续集成等一些关键实践,开发人员能发挥更大的作用,而测试人员难以很好地发挥作用。在敏捷方法中,开发人员的主导作用更明显,讨论需求、实现需求,再修改需求、再实现、再重构,不断完善产品,测试人员容易边缘化。甚至在Crystal方法中,可以不需要测试人员,开发人员能承担所有技术性的工作。 在敏捷方法中,测试人员的价值又如何体现?

  1. 首先在需求讨论上,测试人员可以站在客户角度上来阐述自己的观点,和产品人员、开发人员等进行充分的交流和讨论,使自己在用户体验、业务逻辑等等方面的经验充分体现出来。
  2. 在开发过程中,测试人员不仅扮演“用户代表”角色,而且可以及时提供更全面的质量反馈,包括代码质量、接口一致性等。测试人员不写代码,可以参与代码复审(code review),将质量问题及时提交给项目组,保证在产品构造的整个过程中质量受到足够的关注,提高质量改进的持续性和可视性。
  3. 测试人员还是可以参与单元测试。即使单元测试由开发人员做,测试人员可以推进开发人员进行单元测,检查单元测试状态,如确保单元测试达到80%以上覆盖率,以及帮助开发人员开发出具有良好可测试性的代码。
  4. 即使在敏捷方法中,集成测试、端到端(end-to-end)测试、性能测试等是不可少的。因为在敏捷方法中,往往将一个大的系统开发分解成多个小的子系统(模块/组件),集成测试和端到端(end-to-end)测试显得更重要。测试人员在功能测试上工作量会降低,但在这些测试上发挥更大的作用。
  5. 随着迭代的不断深入,回归测试的工作量很大,这也是测试人员的用武之地。 测试人员可以针对稳定的产品特性开发自动化测试脚本,这也是一种持续的努力,使回归测试自动化。
  6. 测试人员对缺陷进行分析,总结出一些规律,帮助开发人员建立良好的习惯,改进代码的质量。

而且:

  • 在敏捷方法中,我们也要采用敏捷测试,不要再写几十页的测试计划书,而是在每个迭代周期,写出一页纸的测试计划,将测试要点列出来。
  • 在敏捷测试中,可能不需要测试用例,而是针对use case 或user story直接进行验证,并进行探索性测试。而节约出来的时间,用于开发原有功能的自动化测试脚本,为回归测试服务。自动化测试脚本将代替测试用例,成为软件组织的财富。
  所以:

敏捷功能测试 = 新特性的手工测试 (use case验证和探索性测试) + 原有功能的自动化测试 (回归测试)

理想情况下,测试人员具有很好的编程能力,可以和开发人员进行角色互换。在当前版本开发(/迭代周期)中担任测试人员角色,在下一个版本开发(/迭代周期)中担任开发人员角色,而开发人员则担任测试人员角色,让开发人员深刻地理解用户的需求角度来考虑系统功能的设计,这样会更好地保证产品的质量,沟通的障碍也会消除,开发的效率会有很大的提高。这也是对测试人员的一个挑战。

敏捷测试也是一个持续测试的过程,而这持续测试的基础是具备一个灵活的、开放的自动化测试框架。测试人员在自动化测试框架构建上、测试工具开发或第3方测试工具前期研究、试用等方面可以发挥主导作用。

项目采用敏捷方法,要获得成功,项目组中每个人都有很强的质量意识,具有质量的主人翁精神,特别是开发人员,每时每刻提醒自己——“质量是构建出来的”,与客户或产品设计人员进行充分沟通,遵守高度一致的质量标准。测试人员将是促进质量文化不断提升的中坚力量。

原作者:朱少民

在看这本书<<30年后,你拿什么养活自己>>?

30年后,你拿什么养活自己?

钱小俊是一位时尚的“月光族”,他有一份令人羡慕的高薪工作和一个幸福的家庭,虽然是按揭贷款,但也是有房有车一族,生活也算是丰衣足食。可是一场梦境、一个自称财富精灵的人的出现彻底改变了他的生活,颠覆了他固守了30年的思想。于是,在财富精灵和理财专家的指引下,他开始了自己的人生规划……
理财是成功规划人生的第一步——而这恰恰是学校里从未教导我们的最重要的一课!富人都是聪明人,但聪明人却不一定都是富人!三大财富管理师将自己多年的心血、理财经验、人生规划的智慧融进书中,许多人在看过这本书后,恨不得重新活过一遍!在韩国,有超过100万人在读完此书后决定理财,开始为30年后的生活做准备:一位20多岁的高薪白领女性丢掉了“名牌包包控”的外号,一位年近40的男子悔恨自己没有更早看到这本书……

 

看完再写读后感!!

Android开发几个必去的网站

1 Eoe Android开发者门户

简介:有许多技术性文章,人气很旺,经常有些很酷的android设置,android新闻报道的不是很及时

网址: http://www.eoeandroid.com/portal.ph

移动App资讯站(推荐)

简介: Android开发者必去的一个网站,可以及时了解android开发全球最新消息,同时也有最新手机软件开发业内报道有句很经典的话
只有NEWS.

网址: http://www.ydapp.com/

3 Android Police

简介:国外的网站,主要报道最新Android产品

网址:http://www.androidpolice.com/

有米广告

简介:这个应该大家不陌生吧国内第一家移动APP广告商 ,广告单价很高

网址: http://www.youmi.net/

移动Labs(中国移动研究院)

简介:经常出一些经典的文章比较深入的说明移动开发行业动态.了解行业走向,及发展趋势.

网址: http://labs.chinamobile.com/

Android Developer Income Report

A lot of people says that there is no real money in the Android development. They say that if you want to make money you should write for iPhone, iPad and all other iThings… This is not true! I am not a one of guys that is making thousands of dollars but my income seems to be steady and is still growing.

Moreover I am not one of top developers nor any of my apps have been promoted by Android Market. I am just an one among of thousands of Android developers with not to well known apps. And what may be really surprising all my apps are free as Google do not allow developers from my country (Poland) to sell apps via Android Market!

So keep in mind these facts:

  1. None of my apps has been ever promoted in Top of Android Market
  2. I am providing only free apps (mostly due of Android Market limitations)
  3. Even if I would be able to sell apps I would not use it as main income source… (I believe that you still can make more from ads…)

All my income comes from ads that are included in my mobile apps for Android. Here is the list with current number of downloads:

  1. X-Ray Scanner (over 268 000 downloads)
  2. Cracked Screen (over 182 000 downloads)
  3. Virtual Drums (over 20 000 downloads)
  4. Daily Beauty Tips (over 11 000 downloads)
  5. Don’t push it (over 6 500 downloads)
  6. WP Stats (over 4 000 downloads)

I have started to learn Android Development on April 2010. My first application was ready to be published on May. And it bring me first few dollars… I was not satisfied as I have been expecting that this app (WP Stats) will be really popular… Unfortunately it wasn’t… Anyway I have published a few more apps that got a lot more popularity… So here is my total income breakdown:

  • May 2010 – $4.92
  • June 2010 – $138.87
  • July 2010 – $538.26
  • August 2010 – $920.00
  • September 2010 – $1545.45
  • October 2010 – $1059.31

October looks to be lower in earning but it happened only because I have not been updating any of my apps in this month (I have been moving to new house and had no time for it…).

So as you may see income has not been high on the begging but with each month with regular updates and new apps it has been growing very rapidly!

And I will say it again… I have not made a single cent from selling apps – all my income is only from ads. This month I am preparing new updates for my apps and I am finalizing some new ideas… so my income should start growing up again…

All comments are welcome and very desired.

Android application四大组件的作用

我简要的介绍下这四大组件,希望与你们一起学习共同进步!
Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持久化的事情,妥善管理生命周期以及一些跳转逻辑

service:后台服务于Activity,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的食物,定义好需要接受的Intent提供同步和异步的接口

Content Provider:是Android提供的第三方应用数据的访问方案,可以派生Content Provider类,对外提供数据,可以像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供统一的借口模型,大大简化上层应用,对数据的整合提供了更方便的途径

BroadCast Receiver:接受一种或者多种Intent作触发事件,接受相关消息,做一些简单处理,转换成一条Notification,统一了Android的事件广播模型

Android多线程断点续传下载文件类设计

对于Android平台,很多网友可能考虑开发一个软件商店,对于Android平台上如何实现断点续传操作呢? 这里给大家一些思路和原理的介绍,同时在Android手机上要考虑的一些事情。

1. 流量控制,获取运营商的接入方式,比如说使用移动网络接入,尽可能的提示用户切换WiFi或提示,限制下载的流量以节省话费。

2. 屏幕锁控制,屏幕锁屏后导致应用会被挂起,当然Android提供了PowerManager.WakeLock来控制。

3. 对于断点续传,这要追溯到Http 1.1的特性了,主要是获取文件大小,如果这个无法读取的话,那么就无法断点续传了只能使用chunked模式了,当然获取远程服务器上文件的大小可以通过Http的响应头查找Content-Length。

4. 获取上次文件的更改时间,对于断点续传来说比较有风险的就是 继续下载的文件和早期下载的在server上有变动,这将会导致续传时下载的文件版本和原始的不同,一般有两种解决方法,早期我们配置服务器时通过Last-Modified这个http header获取文件上次修改时间,不过本次Android开发网推荐使用更为强大的ETag,ETag一般用于解决同一个URL处理不同返回相应,比如Session认证,多国语言,以及部分黑帽的SEO中。具体的实现大家可以参考RFC文档。

5. 考虑服务器的3xx的返回,对于专业的下载文件服务器会考虑到负载平衡问题,这就涉及到重定向问题,处理重定向使用Android的Apache库处理比较好。

6. 至于多线程,这里CWJ提示大家可能存在独立的线程下载一个文件,和多个线程分块下载单个文件之分,其中后者需要考虑上次下载数据是否存在问题,同时如果服务器不支持文件大小获取,则无法通过分段下载数据,因为不知道如何分段,所以在chunked模式中,只能使用一个线程下载一个文件,而不是多个线程下载一个文件。

7. 下载后的数据效验,可以考虑CRC等方式,当然对于一般的传输只要逻辑不出现问题,基本上不会有偏差。

8. 考虑DRM问题,这个问题在国内用的比较少,而国外的受数字保护的音乐和视频,需要额外的获取证书等。

9. 重试次数,对于一个文件可能在本次网络传输中受到问题,尤其是移动网络,所以可以设置一定的重试次数,让任务单独的走下去。

10. 线程开发方式,这里如果你的Java基础比较好,推荐直接使用Java并发库API比较好,如果过去只做过Java开发使用Thread即可,如果Java技术不过关可以Android封装的AsyncTask。

原文地址:http://www.android123.com.cn/androidkaifa/932.html