ReadingNotes@02-12-2013
Android实战经验之图像处理及特效处理的集锦(总结版)
总结的很不错!
Cheatsheet: 2013 04.17 ~ 04.30
一直都比较喜欢CheatSheet形式的reference,简单明了。
C++ Macro
http://stackoverflow.com/questions/216875/in-macros
One thing to be aware of when you're using the token-paste ('##') or stringizing ('#') preprocessing operators is that you have to use an extra level of indirection for them to work properly in all cases
实现类似android市场多apk同时下载,更新通知栏信息小结
public class UpdateService extends Service { private NotificationManager nm; private Notification notification; private boolean cancelUpdate = false; private MyHandler myHandler; private static ExecutorService executorService = Executors.newFixedThreadPool(5); // 固定五个线程来执行任务 @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); /*同一个服务,为避免通知栏起冲突,特使用应用的id作为通知栏id,并用application中的一个Map记录id和下载进度, 并通过handler操作*/ int notificationId = intent.getIntExtra("id", new Random().nextInt()); if(Constants.download.containsKey(notificationId)) return 0; notification = new Notification(); notification.icon = android.R.drawable.stat_sys_download; // notification.icon=android.R.drawable.stat_sys_download_done; notification.tickerText = intent.getStringExtra("name")+"开始下载"; notification.when = System.currentTimeMillis(); notification.defaults = Notification.DEFAULT_LIGHTS; //显示在“正在进行中” notification.flags = Notification.FLAG_NO_CLEAR | Notification.FLAG_ONGOING_EVENT; PendingIntent contentIntent = PendingIntent.getActivity(this, notificationId,new Intent(this, IndexActivity.class), 0); notification.setLatestEventInfo(this, intent.getStringExtra("name"), "0%", contentIntent); Constants.download.put(notificationId, 0); // 将下载任务添加到任务栏中 nm.notify(notificationId, notification); myHandler = new MyHandler(Looper.myLooper(), UpdateService.this); //myHandler = new MyHandler(Looper.myLooper(), this); // 初始化下载任务内容views //Message message = myHandler.obtainMessage(3, 0); //myHandler.sendMessage(message); // 启动线程开始执行下载任务 downFile(intent.getStringExtra("url"),notificationId,intent.getStringExtra("name")); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); } // 下载更新文件 private void downFile(final String url,final int notificationId,final String name) { executorService.execute(new Runnable() { @Override public void run() { // TODO Auto-generated method stub File tempFile = null; try { HttpClient client = new DefaultHttpClient(); // params[0]代表连接的url HttpGet get = new HttpGet(url); HttpResponse response = client.execute(get); HttpEntity entity = response.getEntity(); long length = entity.getContentLength(); InputStream is = entity.getContent(); if (is != null) { File rootFile = new File(Environment.getExternalStorageDirectory(),"/zhtrade"); if (!rootFile.exists() && !rootFile.isDirectory()) rootFile.mkdir(); /* * 路径的特殊性,分解出包名,并用对应的应用"_"+id特别标识,避免出现apk包重复和冲突(有一些apk的package是相同的) */ tempFile = new File(Environment.getExternalStorageDirectory(),"/zhtrade/"+ url.substring(url.lastIndexOf("/"),url.indexOf("?"))+"_"+notificationId+".apk"); 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 / length) * 100); // 每下载完成10%就通知任务栏进行修改下载进度 if (precent - Constants.download.get(notificationId) >= 10) { Constants.download.put(notificationId, precent); Message message = myHandler.obtainMessage(3,precent); Bundle bundle = new Bundle(); bundle.putString("name", name); message.setData(bundle); message.arg1 = notificationId; myHandler.sendMessage(message); } } bos.flush(); bos.close(); fos.flush(); fos.close(); is.close(); bis.close(); } if (!cancelUpdate) { Message message = myHandler.obtainMessage(2, tempFile); message.arg1 = notificationId; Bundle bundle = new Bundle(); bundle.putString("name", name); message.setData(bundle); myHandler.sendMessage(message); } else { tempFile.delete(); } } catch (ClientProtocolException e) { if (tempFile.exists()) tempFile.delete(); Message message = myHandler.obtainMessage(4, name+"下载失败:网络异常!"); message.arg1 = notificationId; myHandler.sendMessage(message); } catch (IOException e) { if (tempFile.exists()) tempFile.delete(); Message message = myHandler.obtainMessage(4, name+"下载失败:文件存储异常"); message.arg1 = notificationId; myHandler.sendMessage(message); } catch (Exception e) { if (tempFile.exists()) tempFile.delete(); Message message = myHandler.obtainMessage(4, name+"下载失败,"+e.getMessage()); message.arg1 = notificationId; myHandler.sendMessage(message); } } }); } // 安装下载后的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) { PendingIntent contentIntent = null; super.handleMessage(msg); if (msg != null) { switch (msg.what) { case 0: Toast.makeText(context, msg.obj.toString(),Toast.LENGTH_SHORT).show(); Constants.download.remove(msg.arg1); break; case 1: break; case 2: contentIntent = PendingIntent.getActivity(UpdateService.this, msg.arg1,new Intent(UpdateService.this, IndexActivity.class), 0); notification.setLatestEventInfo(UpdateService.this, msg.getData().getString("name")+"下载完成", "100%",contentIntent); nm.notify(msg.arg1, notification); // 下载完成后清除所有下载信息,执行安装提示 Constants.download.remove(msg.arg1); nm.cancel(msg.arg1); Instanll((File) msg.obj, context); // 停止掉当前的服务 stopSelf(); break; case 3: contentIntent = PendingIntent.getActivity(UpdateService.this, msg.arg1,new Intent(UpdateService.this, IndexActivity.class), 0); notification.setLatestEventInfo(UpdateService.this, msg.getData().getString("name")+"正在下载", Constants.download.get(msg.arg1) + "%",contentIntent); nm.notify(msg.arg1, notification); break; case 4: Toast.makeText(context, msg.obj.toString(),Toast.LENGTH_SHORT).show(); Constants.download.remove(msg.arg1); nm.cancel(msg.arg1); stopSelf(); break; } } } } }
adb failed to start daemon 的解决办法
adb nodaemon server
Post by: Jalen Wang (转载请注明出处)