继承CordovaPlugin类实现Activity调用
2014-07-30 11:07
92 查看
package com.jiatianxia.version; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaPlugin; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.app.AlertDialog; import android.app.Dialog; import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager.NameNotFoundException; import android.net.Uri; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.util.Log; public class Version extends CordovaPlugin{ // 作为回调传递参数 CallbackContext callbackContext; String newVerName = "";// 新版本名称 int newVerCode = -1;// 新版本号 ProgressDialog pd = null; String UPDATE_SERVERAPK = "软件.apk"; @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { this.callbackContext = callbackContext; if (action.equals("upVersion")) { updateVersion(); callbackContext.success("调用成功"); } else { return false; } callbackContext.success(); return true; } // 判断是否更新版本 public void updateVersion() { if (getServerVer()) { int verCode = this.getVerCode(cordova.getActivity()); if (newVerCode > verCode) { doNewVersionUpdate();// 更新版本 } else { notNewVersionUpdate();// 提示已是最新版本 } } } /** * 获得版本号 */ public int getVerCode(Context context) { int verCode = -1; try { String packName = context.getPackageName(); verCode = context.getPackageManager().getPackageInfo(packName, 0).versionCode; } catch (NameNotFoundException e) { // TODO Auto-generated catch block Log.e("版本号获取异常", e.getMessage()); } return verCode; } /** * 获得版本名称 */ public String getVerName(Context context) { String verName = ""; try { String packName = context.getPackageName(); verName = context.getPackageManager().getPackageInfo(packName, 0).versionName; } catch (NameNotFoundException e) { Log.e("版本名称获取异常", e.getMessage()); } return verName; } /** * 从服务器端获得版本号与版本名称 * * @return */ public boolean getServerVer() { try { URL url = new URL("服务器路径/version.text"); HttpURLConnection httpConnection = (HttpURLConnection) url .openConnection(); httpConnection.setDoInput(true); httpConnection.setDoOutput(true); httpConnection.setRequestMethod("GET"); httpConnection.connect(); InputStreamReader reader = new InputStreamReader( httpConnection.getInputStream()); BufferedReader bReader = new BufferedReader(reader); String json = bReader.readLine(); JSONArray array = new JSONArray(json); JSONObject jsonObj = array.getJSONObject(0); newVerCode = Integer.parseInt(jsonObj.getString("verCode")); newVerName = jsonObj.getString("verName"); } catch (Exception e) { e.printStackTrace(); return false;// 如果这里改为true 则不更新会退出程序 } return true; } /** * 不更新版本 */ public void notNewVersionUpdate() { int verCode = this.getVerCode(cordova.getActivity()); String verName = this.getVerName(cordova.getActivity()); StringBuffer sb = new StringBuffer(); sb.append("当前版本:"); sb.append(verName); sb.append(" Code:"); sb.append(verCode); sb.append("\n已是最新版本,无需更新"); Dialog dialog = new AlertDialog.Builder(cordova.getActivity()).setTitle("软件更新") .setMessage(sb.toString()) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub // finish(); } }).create(); dialog.show(); } /** * 下载apk */ public void downFile(final String url) { pd.show(); new Thread() { public void run() { HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(url); HttpResponse response; try { response = client.execute(get); HttpEntity entity = response.getEntity(); long length = entity.getContentLength(); InputStream is = entity.getContent(); FileOutputStream fileOutputStream = null; if (is != null) { File file = new File( Environment.getExternalStorageDirectory(), UPDATE_SERVERAPK); fileOutputStream = new FileOutputStream(file); byte[] b = new byte[1024]; int charb = -1; int count = 0; while ((charb = is.read(b)) != -1) { fileOutputStream.write(b, 0, charb); count += charb; } } fileOutputStream.flush(); if (fileOutputStream != null) { fileOutputStream.close(); } down(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }.start(); } /** * 更新版本 */ public void doNewVersionUpdate() { int verCode = this.getVerCode(cordova.getActivity()); String verName = this.getVerName(cordova.getActivity()); StringBuffer sb = new StringBuffer(); sb.append("当前版本:"); sb.append(verName); sb.append(" Code:"); sb.append(verCode); sb.append(",发现版本:"); sb.append(newVerName); sb.append(" Code:"); sb.append(newVerCode); sb.append(",是否更新"); Dialog dialog = new AlertDialog.Builder(cordova.getActivity()) .setTitle("软件更新") .setMessage(sb.toString()) .setPositiveButton("更新", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub pd = new ProgressDialog(cordova.getActivity()); pd.setTitle("正在下载"); pd.setMessage("请稍后"); pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); pd.setCancelable(false); new Thread() { double progress = 0; public void run() { try { while (progress < 94) { // 由线程来控制进度 pd.setProgress((int) (progress += 0.18)); Thread.sleep(100); } while (progress > 100) { pd.cancel(); } } catch (Exception e) { pd.cancel(); } } }.start(); downFile("服务器路径/软件名.apk"); } }) .setNegativeButton("暂不更新", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub // finish(); } }).create(); // 显示更新框 dialog.show(); } Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); pd.cancel(); update(); } }; /** * 下载完成,通过handler将下载对话框取消 */ public void down() { new Thread() { public void run() { Message message = handler.obtainMessage(); handler.sendMessage(message); } }.start(); } /** * 安装应用 */ public void update() { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(Environment .getExternalStorageDirectory(), UPDATE_SERVERAPK)), "application/vnd.android.package-archive"); cordova.getActivity().startActivity(intent); } }在上面的代码中我们通过Version extends CordovaPlugin类实现了不是Activity也可以进行对Activity的调用。关键方法
cordova.getActivity()
相关文章推荐
- cordova-plugin-media录音功能的实现
- cordova-plugin-file-transfer实现文件上传、下载整理(一)
- Cordova2.0(既PhoneGap)中通过Plugin实现Java和JS代码互相调用
- cordova-plugin-file-transfer实现文件上传、下载整理(二)
- PhoneGap(Cordova)通过自定义plugin插件实现javascript与android交互
- Cordova2.0(既PhoneGap)中通过Plugin实现Java和JS代码互相调用
- 继承的Singleton模式的实现
- 人与继承的C++实现
- Delphi 里面类能不能实现多继承啊?
- [翻译] Effective C++, 3rd Edition, Item 34: 区分 inheritance of interface(接口继承)和 inheritance of implementation(实现继承)(下)
- 如何实现不可继承的类
- ASP.net 中的页面继承实现和通用页面的工厂模式的实现
- C++箴言:接口继承和实现继承
- JScript的两种继承机制的实现
- 继承 System.Windows.Forms.ComboBox 实现支持自动完成功能的 ComboBox!个人感觉还可以!!!
- [翻译] Effective C++, 3rd Edition, Item 34: 区分 inheritance of interface(接口继承)和 inheritance of implementation(实现继承)(上)
- 一个单继承类体系的RTTI实现(根据类名判断类指针)
- JavaScript继承机制模拟实现
- JavaScript中实现简单的类的继承
- ASP.net 中的页面继承实现和通用页面的工厂模式的实现