地震监测
一、案例描述
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、在使用服务时,需要在清单文件中注册。

