package com.jiuqi.njt.service;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.widget.RemoteViews;
import android.widget.Toast;
import com.jiuqi.njt.R;
public class UpdateService extends Service{
private NotificationManager nm;
private Notification notification;
private File tempFile=null;
private boolean cancelUpdate=false;
private MyHandler myHandler;
private int download_precent=0;
private RemoteViews views;
private int notificationId=1234;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onStart(Intent intent,int startId){
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent,int flags,int startId){
// nm=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
// notification=new Notification();
// notification.icon=android.R.drawable.stat_sys_download;
// //notification.icon=android.R.drawable.stat_sys_download_done;
// notification.tickerText=getString(R.string.appName)+"更新";
// notification.when=System.currentTimeMillis();
// notification.defaults=Notification.DEFAULT_LIGHTS;
//
// //设置任务栏中下载进程显示的views
// views=new RemoteViews(getPackageName(),R.layout.alert_dialog_progress);
// notification.contentView=views;
// Intent upIntent = new Intent(UpdateService.this, UpdateService.class);
// PendingIntent contentIntent=PendingIntent.getActivity(this,0,upIntent,0);
// notification.setLatestEventInfo(this,"","", contentIntent);
//
// //将下载任务添加到任务栏中
// nm.notify(notificationId,notification);
//
// myHandler=new MyHandler(Looper.myLooper(),this);
//
// //初始化下载任务内容views
// Message message=myHandler.obtainMessage(3,0);
// myHandler.sendMessage(message);
//
// //启动线程开始执行下载任务
// downFile(com.jiuqi.njt.update.Config.UPDATE_SERVER
// + com.jiuqi.njt.update.Config.UPDATE_APKNAME);
// return super.onStartCommand(intent, flags, startId);
nm=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
notification=new Notification();
notification.flags=Notification.FLAG_AUTO_CANCEL;
notification.icon=R.drawable.ic_launcher_new;
notification.tickerText=getString(R.string.appName)+"更新";
notification.when=System.currentTimeMillis();
notification.defaults=Notification.DEFAULT_LIGHTS;
// //设置任务栏中下载进程显示的views
views=new RemoteViews(getPackageName(),R.layout.alert_dialog_progress);
notification.contentView=views;
Intent upIntent = new Intent(UpdateService.this, UpdateService.class);
PendingIntent contentIntent=PendingIntent.getActivity(this,0,upIntent,0);
notification.contentIntent=contentIntent;
//将下载任务添加到任务栏中
nm.notify(notificationId,notification);
myHandler=new MyHandler(Looper.myLooper(),this);
//初始化下载任务内容views
Message message=myHandler.obtainMessage(3,0);
myHandler.sendMessage(message);
//启动线程开始执行下载任务
downFile(com.jiuqi.njt.update.Config.UPDATE_SERVER
+ com.jiuqi.njt.update.Config.UPDATE_APKNAME);
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy(){
super.onDestroy();
nm.cancel(notificationId);
//停止掉当前的服务
stopSelf();
}
private long totalLength;
//下载更新文件
private void downFile(final String url) {
new Thread() {
public void run(){
try {
HttpClient client = new DefaultHttpClient();
// params[0]代表连接的url
HttpGet get = new HttpGet(url);
HttpResponse response = client.execute(get);
HttpEntity entity = response.getEntity();
totalLength = entity.getContentLength();
InputStream is = entity.getContent();
if (is != null) {
File rootFile=new File(Environment.getExternalStorageDirectory(), "/pinke");
if(!rootFile.exists()&&!rootFile.isDirectory())
rootFile.mkdir();
tempFile = new File(Environment.getExternalStorageDirectory(),"/pinke/"+url.substring(url.lastIndexOf("/")+1));
if(tempFile.exists())
tempFile.delete();
tempFile.createNewFile();
//已读出流作为参数创建一个带有缓冲的输出流
BufferedInputStream bis = new BufferedInputStream(is);
//创建一个新的写入流,讲读取到的图像数据写入到文件中
FileOutputStream fos = new FileOutputStream(tempFile);
//已写入流作为参数创建一个带有缓冲的写入流
BufferedOutputStream bos = new BufferedOutputStream(fos);
int read;
long count=0;
int precent=0;
byte[] buffer=new byte[1024];
while( (read = bis.read(buffer)) != -1 && !cancelUpdate){
bos.write(buffer,0,read);
count+=read;
precent=(int)(((double)count/totalLength)*100);
//每下载完成5%就通知任务栏进行修改下载进度
if(precent-download_precent>=5){
download_precent=precent;
Message message=myHandler.obtainMessage(3,precent);
myHandler.sendMessage(message);
}
}
bos.flush();
bos.close();
fos.flush();
fos.close();
is.close();
bis.close();
}
if(!cancelUpdate){
Message message=myHandler.obtainMessage(2,tempFile);
myHandler.sendMessage(message);
}else{
tempFile.delete();
}
} catch (ClientProtocolException e) {
Message message=myHandler.obtainMessage(4,"下载更新文件失败");
myHandler.sendMessage(message);
} catch (IOException e) {
Message message=myHandler.obtainMessage(4,"下载更新文件失败");
myHandler.sendMessage(message);
} catch(Exception e){
Message message=myHandler.obtainMessage(4,"下载更新文件失败");
myHandler.sendMessage(message);
}
}
}.start();
}
//安装下载后的apk文件
private void Instanll(File file,Context context){
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
context.startActivity(intent);
}
/*事件处理类*/
class MyHandler extends Handler{
private Context context;
public MyHandler(Looper looper,Context c){
super(looper);
this.context=c;
}
@Override
public void handleMessage(Message msg){
super.handleMessage(msg);
if(msg!=null){
switch(msg.what){
case 0:
Toast.makeText(context,msg.obj.toString(), Toast.LENGTH_SHORT).show();
break;
case 1:
break;
case 2:
//下载完成后清除所有下载信息,执行安装提示
download_precent=0;
nm.cancel(notificationId);
Instanll((File)msg.obj,context);
//停止掉当前的服务
stopSelf();
break;
case 3:
//更新状态栏上的下载进度信息
views.setTextViewText(R.id.progress_percent,"已下载"+download_precent+"%");
views.setTextViewText(R.id.progress_number, totalLength*download_precent/100/1024/1024+"/"+ totalLength/1024/1024+"M");
views.setProgressBar(R.id.progress,100,download_precent,false);
notification.contentView=views;
nm.notify(notificationId,notification);
break;
case 4:
nm.cancel(notificationId);
break;
}
}
}
}
}