android开发课题五
一、要求
实现一个应用,包含一个Acitivity和Service,Acitivity包含“启动”、“结束”两个按钮,包含一个秒数显示控件;
服务运行时,每隔一秒循环计算一个递增值,从0开始,并显示到Acitivity上;
点击启动按钮,启动服务并开始(重置)计时,点击结束按钮,计时停止;
退出应用时,结束服务。
二、实现
1、绑定服务:创建Service——》写MyBinder类(与Activity进行通信,提供函数对Service中的内容作出改变),Service中的onBing函数返回MyBinder类——》在Acitivity中建立ServiceConnection对象并写onServiceConnected和onServiceDisConnection函数在bindService和UnbindService的时候调用。
2、建立线程:在线程中需要写一个循环,在线程运行的时候,不停的主线程发送消息。这个时候需要获取到主线程创建的Handler,因为Handler在Service的onbind生命周期才能传过来,所以线程的建立需要单独写一个函数而不能在onCreate周期内。
3、Handler的使用:在主线程中创建Handler并重写handlerMessage函数,在函数中接收传递过来的消息并更改UI上面显示的数据——》在Service中创建getMainHandler函数 public void getMainHandler(Handler handler) {
mHandler = handler;
}
——》在Activity中的onServiceConnected方法中将Handler传进去——》Service中发送消息——》Activity中接收消息并处理消息
4、启动服务和启动线程:服务的启动和线程的启动分开,服务启动和结束的时间是在Activity启动和结束的生命周期内实现;线程的启动和结束是在用户点击启动和结束按钮的时候。
5、点击按钮:没点结束按钮之前,两次点击启动按钮实现的效果 都是将计数器重启,也就是置零重新开始计数,因此只需要判断当前线程是否停止,如果没有停止,更改数据的值为0即可,如果线程停止了,则更改值为0并重新启动。
6、闪退问题:空指针异常了,比如在调用Service中的函数的时候没有判断Service是否为空,就使用了函数或者是变量,当Service为空的时候就会找不到这样的变量就会报错闪退。