学习Android前后有快有1个月了,本着不耍流氓,谈恋爱就要结婚的信念(其实AD开发也挺有趣的),做了自己的第一个Android小应用。本来准备今天和大家分享的,考虑到在不同屏幕上的效果没测试和本着节约大家流量的前提下准备后天和大家分享我的APP,抽时间把一些大一点的数据缓冲到手机,不每次都去网络上下载。今天和大家分享我在开发这个app中的一些知识点。

1、请求webservices

  上次和大家说到的是请求wcf,以前有一个现成的.net网站里面提供了webservices服务,我就没有把webservices上功能拉出来部署为wcf服务了。先实现功能再说。今天先说webservices了,以后有机会再聊wcf。其实调用webservices服务挺简单的,下面把代码贴上来

  1. /**
  2. * 调用webservices服务
  3. *
  4. * @param url
  5. * 服务地址/方法名。 例如:http://www.wenyunge.com/webservices/XXX.asmx/
  6. * QueryTopsNew
  7. * @param params方法参数
  8. * 例如:List params = new ArrayList(); params.add(new
  9. * BasicNameValuePair("count", count));
  10. * @return
  11. */
  12. @SuppressWarnings({ "unchecked", "rawtypes" })
  13. public String Request(String url, List params) {
  14. HttpPost request = new HttpPost(url);
  15. String result = "";
  16. try {
  17.  
  18. request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
  19. HttpResponse httpResponse = new DefaultHttpClient()
  20. .execute(request);
  21. if (httpResponse.getStatusLine().getStatusCode() != 404) {
  22. result = EntityUtils.toString(httpResponse.getEntity());
  23. }
  24. } catch (Exception e) {
  25. try {
  26. throw e;
  27. } catch (Exception e1) {
  28. // TODO Auto-generated catch block
  29. e1.printStackTrace();
  30. }
  31. }
  32. return result;
  33. }

简单吧,我就不细说了。

 2、Service、BootBroadcastReceiver学习

  自己用文云阁来看小说,总是要进去后才知道最近有没有更新,这种体验实在是糟透了。作为屌丝的程序员,肯定总能想到办法啦。1、使用BootBroadcastReceiver设置为开机启动(这个好像只有在android4.0以上的系统中才能用上),然后在从写2、onReceive方法时候启动个Service,3、再然后再Service的onCreate里面写一个定时器。定时去检查有没有更新,4、有的话再通过NotificationManager在android通知里面告诉你。这样是不是很屌丝啊。嘿嘿

1、使用BootBroadcastReceiver设置为开机启动

  1. AndroidManifest.xml
  2. 权限:
  3. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  4. 设置开机启动
  5. <receiver android:name="BootBroadcastReceiver" >
  6. <intent-filter>
  7. <action android:name="android.intent.action.BOOT_COMPLETED" >
  8. </action>
  9.  
  10. <category android:name="android.intent.category.LAUNCHER" />
  11. </intent-filter>
  12. </receiver>

2、onReceive方法时候启动个Service

  1. public void onReceive(Context context, Intent intent) {
  2. // 后边的XXX.class就是要启动的服务
  3. Intent service = new Intent(context, BookUpdateService.class);
  4. context.startService(service);
  5. Log.v("TAG", "更新提醒服务已经启动");
  6. // 启动应用,参数为需要自动启动的应用的包名
  7. // Intent intent = getPackageManager().getLaunchIntentForPackage(
  8. // packageName);
  9.  
  10. // context.startActivity(intent);
  11. }

3、再然后再Service的onCreate里面写一个定时器

  1. public void onCreate() {
  2. // TODO Auto-generated method stub
  3. // Log.i("myService", "onCreate");
  4.  
  5. Timer timer = new Timer();
  6.  
  7. // 3. 启动定时器,
  8. timer.schedule(task, , );
  9.  
  10. Log.e("myService", "onCreate");
  11. System.out.print("onCreate");
  12. }

特意设置1800000半小时检查一次,太快了流量还要钱呢。

4、有的话再通过NotificationManager在android通知里

  1. @SuppressLint("HandlerLeak")
  2. Handler handler = new Handler() {
  3. @Override
  4. public void handleMessage(Message msg) {
  5. // TODO Auto-generated method stub
  6. // 要做的事情
  7. Bitmap btm = BitmapFactory.decodeResource(getResources(),
  8. R.drawable.ic_launcher);
  9. NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
  10. BookUpdateService.this)
  11. .setSmallIcon(R.drawable.ic_launcher)
  12. .setContentTitle("文云阁").setContentText("您的书架有新更新");
  13. mBuilder.setTicker("您的书架有新更新");// 第一次提示消息的时候显示在通知栏上
  14. mBuilder.setNumber(msg.arg2);
  15. mBuilder.setLargeIcon(btm);
  16. mBuilder.setAutoCancel(true);// 自己维护通知的消失
  17.  
  18. // 构建一个Intent
  19. Intent resultIntent = new Intent(BookUpdateService.this,
  20. MainActivity.class);
  21. // 封装一个Intent
  22. PendingIntent resultPendingIntent = PendingIntent.getActivity(
  23. BookUpdateService., resultIntent,
  24. PendingIntent.FLAG_UPDATE_CURRENT);
  25. // 设置通知主题的意图
  26. mBuilder.setContentIntent(resultPendingIntent);
  27. // 获取通知管理器对象
  28. NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
  29. mNotificationManager.notify(, mBuilder.build());
  30. }
  31. };
 3、系统更新

屌丝的人生你不懂,做出来的东西也就是马马虎虎的,总有bug,总要升级

  1. private void notNewVersionShow() {
  2. StringBuffer sb = new StringBuffer();
  3. sb.append("当前版本:");
  4. sb.append(BaseActivity.getVerName(ToolActivity.this));
  5. sb.append(" Code:");
  6. sb.append(BaseActivity.getVerCode(ToolActivity.this));
  7. sb.append(",/n已是最新版,无需更新!");
  8. Dialog dialog = new AlertDialog.Builder(ToolActivity.this)
  9. .setTitle("软件更新").setMessage(sb.toString())// 设置内容
  10. .setPositiveButton("确定",// 设置确定按钮
  11. new DialogInterface.OnClickListener() {
  12. @Override
  13. public void onClick(DialogInterface dialog,
  14. int which) {
  15. }
  16. }).create();// 创建
  17. // 显示对话框
  18. dialog.show();
  19. }
  20.  
  21. private void doNewVersionUpdate() {
  22. StringBuffer sb = new StringBuffer();
  23. sb.append("当前版本:");
  24. sb.append(BaseActivity.getVerName(ToolActivity.this));
  25. sb.append(" Code:");
  26. sb.append(BaseActivity.getVerCode(ToolActivity.this));
  27. sb.append(", 发现新版本:");
  28. sb.append(name);
  29. sb.append(" Code:");
  30. sb.append(code);
  31. sb.append(", 是否更新?");
  32. Dialog dialog = new AlertDialog.Builder(ToolActivity.this)
  33. .setTitle("软件更新").setMessage(sb.toString())
  34. // 设置内容
  35. .setPositiveButton("更新",// 设置确定按钮
  36. new DialogInterface.OnClickListener() {
  37. @Override
  38. public void onClick(DialogInterface dialog,
  39. int which) {
  40. pBar = new ProgressDialog(ToolActivity.this);
  41. pBar.setTitle("正在下载");
  42. pBar.setMessage("请稍候...");
  43. pBar.setProgressStyle(ProgressDialog.STYLE_SPINNER);
  44. downFile();
  45. }
  46. }).create();// 创建
  47. // .setNegativeButton("暂不更新",
  48. // new DialogInterface.OnClickListener() {
  49. // public void onClick(DialogInterface dialog,
  50. // int whichButton) {
  51. // // 点击"取消"按钮之后退出程序
  52. //
  53. // }
  54. // }).create();// 创建
  55. // 显示对话框
  56. dialog.show();
  57. }
  58.  
  59. ProgressDialog pBar;
  60.  
  61. void downFile() {
  62. pBar.show();
  63. new Thread() {
  64. public void run() {
  65. HttpClient client = new DefaultHttpClient();
  66. HttpGet get = new HttpGet(getResources().getString(
  67. R.string.site_url)
  68. + "wenyunge.apk");
  69. HttpResponse response;
  70. try {
  71. response = client.execute(get);
  72. HttpEntity entity = response.getEntity();
  73. long length = entity.getContentLength();
  74. InputStream is = entity.getContent();
  75. FileOutputStream fileOutputStream = null;
  76. if (is != null) {
  77. File file = new File(
  78. Environment.getExternalStorageDirectory(),
  79. "wenyunge.apk");
  80. fileOutputStream = new FileOutputStream(file);
  81. ];
  82. ;
  83. ) {
  84. fileOutputStream.write(buf, , ch);
  85. ) {
  86. }
  87. }
  88. }
  89. fileOutputStream.flush();
  90. if (fileOutputStream != null) {
  91. fileOutputStream.close();
  92. }
  93. down();
  94. } catch (ClientProtocolException e) {
  95. e.printStackTrace();
  96. } catch (IOException e) {
  97. e.printStackTrace();
  98. }
  99. }
  100. }.start();
  101.  
  102. }
  103.  
  104. void down() {
  105. handler.post(new Runnable() {
  106. public void run() {
  107. pBar.cancel();
  108. update();
  109. }
  110. });
  111. }
  112.  
  113. void update() {
  114. Intent intent = new Intent(Intent.ACTION_VIEW);
  115. File f = new File(Environment.getExternalStorageDirectory(),
  116. "wenyunge.apk");
  117. if (f.exists()) {
  118. intent.setDataAndType(Uri.fromFile(f),
  119. "application/vnd.android.package-archive");
  120. startActivity(intent);
  121. }
  122. }

其实这段代码是我看别人的,那兄弟的网址不记得了,不然给大家贴出来
我跟大家分享个错误,在升级app的时候提示,在下面

 4、an existing package by the same name with a conflicting signature is already installed

是因为新app签名和原来的不同

 5、最后了,app还是有问题,大家喜欢的下来玩玩,有问题,告诉我,我会尽快给解决。
 支持分享,有愿意一起学习的也可以Q我,我的源码放在svnChina上了。

扫描二维码下载

 觉得还看的过去的,一定要先赞下啊。呵呵
 仅为学习,和方便大家

Android宝典入门篇-进阶的更多相关文章

  1. Android宝典入门篇-基础知识

    今天跟大家分享的是我学android时的笔记.以前搞net很多年了,现在还在搞这.本着活到老学到老抽了点时间学习了下android.android网上有很多的视频教程,当时对于我这样以前不了解java ...

  2. Android从入门到进阶——布局

    一.组件 1.UI组件 (Android.view.View的子类或者间接子类) 2.容器组件(Android.view.ViewGroup子类或者间接子类) 二.UI组件:TextView,Spin ...

  3. Android测试入门篇

    Android本身是一套软件堆叠(Software Stack),或者成为软件叠层架构,叠层主要分成三层:操作系统.中间件和应用程序. Android构架 1. Application 应用程序层:用 ...

  4. 服务端技术进阶(八)GitHub入门篇

    服务端技术进阶(八)GitHub入门篇 前言 在投递简历的过程中,发现有的公司会要求填写自己的GitHub地址,而自己却还没有GitHub帐号,准确点说是自己还不太会使用GitHub.(貌似开源社区中 ...

  5. Android Studio2.0 教程从入门到精通Windows版 - 入门篇

    http://www.open-open.com/lib/view/open1468121363300.html 本文转自:深度开源(open-open.com)原文标题:Android Studio ...

  6. Scala进阶之路-并发编程模型Akka入门篇

    Scala进阶之路-并发编程模型Akka入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Akka Actor介绍 1>.Akka介绍 写并发程序很难.程序员不得不处 ...

  7. 【Android开发日记】之入门篇(十二)——Android组件间的数据传输

    组件我们有了,那么我们缺少一个组件之间传递信息的渠道.利用Intent做载体,这是一个王道的做法.还有呢,可以利用文件系统来做数据共享.也可以使用Application设置全局数据,利用组件来进行控制 ...

  8. 【Android开发日记】之入门篇(三)——Android目录结构

    本来的话,这一章想要介绍的是Android的系统架构,毕竟有了这些知识的储备,再去看实际的项目时才会更清楚地理解为什么要这样设计,同时在开发中遇到难题,也可以凭借着对Android的了解,尽快找出哪些 ...

  9. Android数据绑定DataBinding(二)入门篇

    前言 之前写了Android数据绑定DataBinding(一)入门篇,很简单的记录了如何使用DataBinding,其初衷是想要代码中的数据发生改变,不需要繁琐的setText等操作,在最后说到了只 ...

随机推荐

  1. TeX中的引号(UVa272)

    问题: 在Tex中,做双引号的" `` ",右双引号是"  '' "(两个回车左边的).输入一篇包含双引号的文章,你的任务是把它转换成TeX的格式. 样例输入: ...

  2. js_数组对象的浅克隆

      如果再考虑更奇葩更复杂的情况,例如我们定义: var obj = [{ "a": { "a1": ["a11", "a12&q ...

  3. bzoj 2326 矩阵快速幂

    思路:矩阵快速幂搞一搞. #include<bits/stdc++.h> #define LL long long #define fi first #define se second # ...

  4. github 笔记(一)

    笔记预留 0. echo "# Try" >> README.md git init git add README.md git commit -m "fir ...

  5. 洛谷P2507 [SCOI2008]配对 [DP,贪心]

    题目传送门 配对 题目描述 你有 n 个整数Ai和n 个整数Bi.你需要把它们配对,即每个Ai恰好对应一个Bp[i].要求所有配对的整数差的绝对值之和尽量小,但不允许两个相同的数配对.例如A={5,6 ...

  6. jQuery.Validate.js验证大表单的优化

    最近在项目中有遇到一个Form表单中有200多个标签.在提交表单时网页会出现等待时间很长,甚至会出现网页奔溃的情况. 主要的原因是因为在使用jQuery.Validate.js进行Form验证的时候会 ...

  7. 浅谈MVVM模式和MVP模式——Vue.js向

    浅谈MVVM模式和MVP模式--Vue.js向 传统前端开发的MVP模式 MVP开发模式的理解过程 首先代码分为三层: model层(数据层), presenter层(控制层/业务逻辑相关) view ...

  8. 矩阵&行列式

    # 代数 排列 对换,对于一个排列操作,对于一个偶排列一次对换之后变为奇排列 反之变为偶排列 行列式 N阶行列式室友N^2个数aij(i,j = 1,2,3,...n) 行列式的数=\(\sum_ { ...

  9. 我的OI生涯 第六章

    开学了,但是我们并没有像一个正常的高二学生一样坐在教室里接受调研考试的洗礼. 暑假作业这种东西早已被甩在一旁,可以想象回去补文化课时该有多么狼狈. 大王给我们制定了周密的计划,每周两次测试,加上蔡老师 ...

  10. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...