目录

  • 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、考核知识点

名称:服务的创建

名称:bind方式启动服务

2、练习目标

    掌握服务的创建

    掌握bind方式启动服务

3、需求分析

当程序使用startService()和stopService()启动、关闭服务时,服务与调用者之间基本不存在太多的关联,也无法与访问者进行通信、数据交互等。如果服务需要与调用者进行方法调用和数据交互时,应该使用bindService()和unbindService()启动、关闭服务。接下来通过案例地震监测来讲解使用bind方式启动服务。

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

1)将准备好的图片复制到工程目录res/drawable目录下

2)创建MainActivity布局

3)创建服务,并在清单文件中注册

4)在MainActivity中绑定服务,绑定服务后获取服务中的信息

二、案例实现

1、创建“地震监测”程序

创建“地震监测”程序用于开启服务监测地震信息,该程序的界面如图所示。

监测地震程序对应的布局文件activity_main.xml代码如下所示:

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

   xmlns:tools="http://schemas.android.com/tools"

   android:layout_width="match_parent"

   android:layout_height="match_parent"

   tools:context=".MainActivity" >

   <LinearLayout

       android:id="@+id/ll_earthquake_info"

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:background="@drawable/normal_button"

       android:layout_marginLeft="5dp"

       android:layout_marginRight="5dp"

       android:visibility="invisible"

      android:layout_centerVertical="true"

       android:gravity="center_vertical"

       android:orientation="vertical" >

       <RelativeLayout

           android:layout_width="match_parent"

           android:layout_height="45dp"

           android:gravity="center_vertical" >

           <TextView

               android:layout_width="wrap_content"

               android:layout_height="wrap_content"

               android:layout_marginLeft="5dp"

               android:text="地震源"

               android:textColor="@android:color/darker_gray" />

           <TextView

               android:id="@+id/tv_earthqueake_source"

               android:layout_width="wrap_content"

               android:layout_height="wrap_content"

               android:layout_centerHorizontal="true"

               android:text="地震源"/>

       </RelativeLayout>

       <View

           android:layout_width="match_parent"

           android:layout_height="1.0px"

            android:background="@android:color/darker_gray"/>

       <RelativeLayout

           android:layout_width="match_parent"

           android:layout_height="45dp"

           android:gravity="center_vertical" >

           <TextView

               android:layout_width="wrap_content"

               android:layout_height="wrap_content"

               android:layout_marginLeft="5dp"

               android:text="地震等级"

               android:textColor="@android:color/darker_gray" />

           <TextView

               android:id="@+id/tv_earthqueake_level"

               android:layout_width="wrap_content"

               android:layout_height="wrap_content"

               android:layout_centerHorizontal="true"

               android:text="地震源"/>

       </RelativeLayout>

   </LinearLayout>

   <Button

       android:id="@+id/btn_bindService"

       android:layout_width="match_parent"

       android:layout_height="50dp"

       android:layout_marginTop="25dp"

       android:layout_centerHorizontal="true"

       android:layout_marginRight="5dp"

       android:layout_marginLeft="5dp"

       android:layout_below="@+id/ll_earthquake_info"

       android:background="@drawable/soil_backgroud_content3"

       android:text="开启地震监测服务"

       android:textColor="@android:color/white" />

   <Button

       android:id="@+id/btn_getinfo"

       android:layout_width="match_parent"

        android:layout_height="50dp"

       android:layout_marginTop="10dp"

       android:layout_centerHorizontal="true"

       android:layout_marginRight="5dp"

       android:layout_marginLeft="5dp"

       android:layout_below="@+id/btn_bindService"

       android:background="@drawable/soil_backgroud_content3"

       android:text="获取地震监测信息"

       android:textColor="@android:color/white" />

</RelativeLayout>


2、编写逻辑代码

MainActivity的代码如下所示:

public class MainActivity extends Activityimplements OnClickListener {

    privateLinearLayout mInfoLL;

    privateMyBinder binder;

    privateMyConn conn;

    privateTextView mLevelTV;

    privateTextView mSourceTV;

     class MyConn implements ServiceConnection {

        @Override

        publicvoid onServiceConnected(ComponentName name, IBinder service) {

            binder= (MyBinder)service;

            Toast.makeText(getApplicationContext(),"地震监测服务绑定成功",

 0).show();

        }

        @Override

        publicvoid onServiceDisconnected(ComponentName name) {

        }

     }

    @Override

    protectedvoid onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        mInfoLL= (LinearLayout) findViewById(R.id.ll_earthquake_info);

        findViewById(R.id.btn_bindService).setOnClickListener(this);

        findViewById(R.id.btn_getinfo).setOnClickListener(this);

        mLevelTV= (TextView) findViewById(R.id.tv_earthqueake_level);

        mSourceTV= (TextView) findViewById(R.id.tv_earthqueake_source);

        conn =new MyConn();

    }

 

    @Override

    publicvoid onClick(View v) {

        switch(v.getId()) {

        caseR.id.btn_bindService:

            //绑定服务

            bindService(newIntent(this,EarthQuakeService.class), conn,

 BIND_AUTO_CREATE);

            break;

        caseR.id.btn_getinfo:

            if(binder!=null){

                mInfoLL.setVisibility(View.VISIBLE);

                StringearthQuakeLevel = binder.getEarthQuakeLevel();

                StringearthQuakeSource = binder.getEarthQuakeSource();

                mLevelTV.setText(earthQuakeLevel);

                mSourceTV.setText(earthQuakeSource);

            }else{

                Toast.makeText(getApplicationContext(),"请先绑定地震监测服务",

 0).show();

            }

            break;

        }

    }

}


3、创建服务(EarthQuakeService

   创建一个类EarthQuakeService继承自Service,具体代码如下所示:

public class EarthQuakeService extends Service{

    @Override

    publicIBinder onBind(Intent intent) {

        returnnew MyBinder();

    }

    classMyBinder extends Binder{

        publicString  getEarthQuakeLevel(){

            return"7";

        }

        publicString getEarthQuakeSource(){

            return"美国";

        }

    }

}


4、在清单文件中注册Service

   由于服务是Android四大组件之一,因此需要在清单文件中注册,具体代码如下所示:

<serviceandroid:name="cn.itcast.earthquake.EarthQuakeService" >

</service>


5、运行程序

首先运行地震监测程序,能看到如图8-4左侧所示的界面,然后点击程序中的“开启地震监测服务”按钮,看到弹出的Toast之后点击“获取地震信息”按钮能看到如图8-4右侧所示图片。

 


三、案例总结

1、只有在使用bindService()方法开启服务后Binder对象才不为空。

2、在使用服务时,需要在清单文件中注册。