OTA升级之下载部分:
1,首先在收到开机广播中,context.startService(service);
2,在全局application中:public class Base extends Application {
正在下载判断:
public boolean IsDownloadRunning=false;
消息队列
public ArrayList<StatusMessage> messages = new ArrayList<StatusMessage>();
全局变量访问方法:app = (Base)getApplicationContext();
3,UpgradeService extends Service ,在onCreate中,检查有没有网络,如果没有,在一定时间内给予超时提醒,并注册,监听
ConnectivityManager.CONNECTIVITY_ACTION 广播。在超时期间,有可能有网络了,就走这个广播处理。具体是起一个异步任务,在异步任务
中,连接网络,如果网络是通的,则去初始化下载。
4,在UpgradeService 中有handler:
public Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
setExitTimeOut();//有消息在接收,重新定时,在一定时间内没有消息,即超时了,结束服务。即相当于看门狗功
能。
Log.d(TAG, "handleMessage called: " + msg.what + ", step: ");
Intent intent = new Intent();
intent.setAction(getPackageName() + ".status");
intent.putExtra("message", msg);
sendBroadcast(intent); //发出状态广播。
switch(msg.what) {
根据接收到的消息类型,填充全局变量的messages 消息队列。
handler.sendMessage(handler.obtainMessage(SystemUpgradeMessage.REBOOT_REQUIRED, 0, 0));
这里有一个问题:handler是本service中的。可以在本service中建立的线程或异步线程使用此handler。其他类中怎么使用?
方法:public interface SystemUpgradeListener {
public void autoCallback(Message msg);
}
本service 实现这个SystemUpgradeListener 接口:
public void autoCallback(Message msg) {
// TODO Auto-generated method stub
Log.d(TAG, "autoCallback called.");
Message myMsg = handler.obtainMessage(msg.what, msg.arg1, msg.arg2);
handler.sendMessage(myMsg);
}
在其他类中,例如class UpgradeListener implements FileDownLoaderListener{//第三方给的文件下载监听类。
构造时,将本service作为参数给UpgradeListener 。这时,再借用本service对象调用autoCallback,即将消息送达到handler。
public UpgradeListener(SystemUpgradeListener callback,Base app)
{
this.callback=callback;
this.app=app;
}
这样就能在第三方发到消息到handler。