目录

  • 1 第一周 android简介
    • 1.1 第一课 Android基础入门1
    • 1.2 第二课 Android基础入门2
    • 1.3 第三课 Android UI开发介绍
  • 2 第二周 android布局
    • 2.1 第一课 Android 布局文件介绍1
    • 2.2 第二课 Android 布局文件介绍2
    • 2.3 第三课 Android 布局文件介绍3
  • 3 第三周 Android UI组件开发
    • 3.1 第一课 Button和ImageButton
    • 3.2 第二课 TextView和EditText
    • 3.3 第三课 RadioButton和CheckBox
  • 4 第四周 Android UI组件开发
    • 4.1 第一课 Spinner和ListView
    • 4.2 第二课 应用案例-手机信息页面
    • 4.3 第三课 Android生命周期
  • 5 第五周 Android组件通信
    • 5.1 第一课 Intent的介绍
    • 5.2 第二课 Intent实现各种系统功能
    • 5.3 第三课 应用案例-手机注册页面
  • 6 第六周 数据存储
    • 6.1 第一课 应用案例-新建联系人
    • 6.2 第二课 数据存储-简单文件存储
    • 6.3 第三课 SharedPreferences存储
  • 7 第七周 数据存储
    • 7.1 第一课 xml文件存储
    • 7.2 第二课 应用案例-植物百科
    • 7.3 第三课  ListView 组件高级使用
  • 8 第八周 SQLite数据库
    • 8.1 第一课 应用案例-应用列表
    • 8.2 第二课 使用SQLite数据库存储(创建数据库和表)
    • 8.3 第三课 使用SQLite数据库存储(对表数据操作)
  • 9 第九周 项目实战-商品购物车处理
    • 9.1 第一课 使用SQLite数据库存储(对表数据查询)
    • 9.2 第二课 商品购物车处理(布局)
    • 9.3 第三课 商品购物车处理(数据处理)
  • 10 第十周 内容提供者及广播
    • 10.1 第一课 内容提供者的使用
    • 10.2 第二课 广播概念以及如何使用
    • 10.3 第三课 自定义广播
  • 11 第十一周 广播和服务
    • 11.1 第一课 应用案例-电池电量
    • 11.2 第二课 应用案例-通话记录
    • 11.3 第三课 服务简介
  • 12 第十二周 服务应用
    • 12.1 第一课 应用案例—音乐播放器
    • 12.2 第二课 应用案例—地震监测
    • 12.3 第三课 获得手机SIM卡信息
  • 13 第十三周 网络编程
    • 13.1 第一课 网络编程入门
    • 13.2 第二课 使用HttpClient访问网络
    • 13.3 第三课 webview组件
  • 14 第十四周 网络编程应用案例
    • 14.1 第一课 消息机制简介
    • 14.2 第二课 应用案例-应用升级
    • 14.3 第三课 应用案例-应用升级
第三课 应用案例-应用升级

案例 欢迎界面

一、案例描述

1、考核知识点

Handler消息机制原理

HttpURLConnection

广播接收者的创建与注册

2、练习目标

Ø 使用HttpURLConnection访问服务器

Ø 保存服务器的图片到SD卡

3、需求分析

基本所有APP在打开时第一眼看到的都是一张欢迎图片,在显示3S左右就会进入主界面,这个欢迎界面也有广告的形式,比如腾讯新闻、头条新闻等APP在打开应用时都会显示一张广告图片,并且这张图片是时时更换的,说明获取的都是服务器中的图片。接下来就仿照这些应用的设计制作可以更换图片的欢迎界面。

4、设计思路(实现原理)

1)   每次打开应用都访问服务器,把服务器中指定的图片保存至本地SD卡中

2)   如果SD卡保存有图片,打开应用时就加载SD卡中的图片,如果服务器图片发生变化,

3)   在第二次打开应用时,欢迎界面则加载最新的图片。

二、案例实现

1)欢迎界面程序

创建“欢迎界面”程序,首先创建WelcomeActivity.java用于处理主要逻辑信息,该程序的界面只有一个ImageView用于显示服务器图片,需要先在res/drawable-hdpi 目录下放置一张图片,如图所示。




MainActivity界面对应的布局文件(welcome.xml)如下所示:

<?xml version="1.0"encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

   android:layout_width="match_parent"

   android:layout_height="match_parent">

   <ImageView

       android:id="@+id/iv_welcome"

       android:layout_width="match_parent"

       android:layout_height="match_parent"

       android:background="@drawable/default" />

</RelativeLayout>


在布局文件中,为ImageView添加一张默认图片,如果SD卡没有图片或者图片加载慢的情况下先显示默认图片。

2WelcomeActivity.java

WelcomeActivity.java用于获取网络上的图片,具体代码如下:

 1  public class WelcomeActivityextends Activity {

 2      protected static final int CHANGE_UI = 1;

 3      protected static final int ERROR = 2;

 4      private static final String BITMAPADDRESSFORSD ="/sdcard/welcome.jpg";

 5      private ImageView ll;

 6      private Bitmap bitmap;

 7      private Handler handler = new Handler() {

 8          @SuppressLint("NewApi")

 9          public void handleMessage(android.os.Message msg) {

 10             if (msg.what == ERROR) {

 11                 Toast.makeText(WelcomeActivity.this, "显示图片错误", 0).show();

 12             }

 13         };

 14     };

 15     private File file;

 16     @SuppressLint({ "NewApi" })

 17     @Override

 18     protected void onCreate(Bundle savedInstanceState) {

 19         super.onCreate(savedInstanceState);

 20         setContentView(R.layout.welcome);

 21         ll = (ImageView) findViewById(R.id.iv_welcome);

 22         file = new File(BITMAPADDRESSFORSD);

 23         if (file.exists()) {

 24             Bitmap bm = BitmapFactory.decodeFile(BITMAPADDRESSFORSD);

 25             ll.setBackground(new BitmapDrawable(bm));

 26         }

 27         getServiceImage();

 28         handler.postDelayed(new Runnable() {

 29             @Override

 30             public void run() {

 31                 Intent intent = new Intent(WelcomeActivity.this,

 32                         MainActivity.class);

 33                 startActivity(intent);

 34                 finish();

 35             }

 36         }, 2000);

 37     }

 38     // 获取服务器图片

 39     private void getServiceImage() {

 40         new Thread() {

 41             private HttpURLConnection conn;

 42             public void run() {

 43                 // 连接服务器 get 请求 获取图片.

 44                 try {

 45                     URL url = newURL("http://172.16.25.39:8080/welcome.jpg");

 46                     conn = (HttpURLConnection) url.openConnection();

 47                     // 设置请求的方式

 48                     conn.setRequestMethod("GET");

 49                     // 设置超时时间

 50                     conn.setConnectTimeout(5000);

 51                     // 设置请求头 User-Agent浏览器的版本

 52                     conn.setRequestProperty(

 53                             "User-Agent",

 54                             "Mozilla/4.0 (compatible; MSIE 6.0;Windows NT 5.1; "

 55                                 + "SV1; .NET4.0C; .NET4.0E; .NETCLR 2.0.50727; "

 56                          +".NET CLR 3.0.4506.2152; .NET CLR 3.5.30729;Shuame)");

 57                     // 得到服务器返回的响应码

 58                     int code = conn.getResponseCode();

 59                     conn.getResponseMessage();

 60                     // 请求网络成功后返回码是200

 61                     if (code == 200) {

 62                         InputStream is = conn.getInputStream();

 63                         bitmap = BitmapFactory.decodeStream(is);

 64                         saveBitmapToSD();

 65                     } else {

 66                         // 返回码不是200 请求服务器失败

 67                         Message msg = new Message();

 68                         msg.what= ERROR;

 69                         handler.sendMessage(msg);

 70                     }

 71                 } catch (Exception e) {

 72                     e.printStackTrace();

 73                     Message msg = new Message();

 74                     msg.what = ERROR;

 75                     handler.sendMessage(msg);

 76                 }

 77             };

 78         }.start();

 79     }

 80     public void saveBitmapToSD() throws IOException {

 81         File f = new File(BITMAPADDRESSFORSD);

 82         f.createNewFile();

 83         FileOutputStream fOut = null;

 84         try {

 85             fOut = new FileOutputStream(f);

 86         } catch (FileNotFoundException e) {

 87             e.printStackTrace();

 88         }

 89         bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);

 90         try {

 91             fOut.flush();

 92         } catch (IOException e) {

 93             e.printStackTrace();

 94         }

 95         try {

 96             fOut.close();

 97         } catch (IOException e) {

 98             e.printStackTrace();

 99         }

 100         }

 101     }


注意,第48行所用到的服务器地址需要改成自己的地址。

3)添加权限

需要使用到访问网络与SD卡读写的功能,因此添加相关权限:

   <uses-permissionandroid:name="android.permission.INTERNET" />

   <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE" />

   <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />

   <uses-permission android:name="android.permission.RESTART_PACKAGES"/>


4)运行程序

运行步骤如下:

1)       当第一次运行项目时会看到默认图片

2)       当第二次打开时会看到从服务器中获取到的图片

3)       如果这时候改变服务器中的图片,再次打开关闭、打开应用程序就会看到最新的图片

      

三、案例总结

1、与服务器进行交互可以使用HttpURLConnection对象。

2、要在子线程中更新UI要使用Handler对象