Android Shell命令dumpsys

dumpsys命令可以显示手机中所有应用程序的信息,并且也会给出现在手机的状态。 直接执行adb shell dumpsys会显示以下所有信息。 SurfaceFlinger, accessibility, account, activity, alarm, appwidget, audio, backup, battery, batteryinfo, bluetooth, bluetooth_a2dp, clipboard, connectivity, content, cpuinfo, device_policy, devicestoragemonitor, diskstats, dropbox, entropy, hardware, hdmi, input_method, iphonesubinfo, isms, location, media.audio_flinger, media.audio_policy, media.camera, media.player, meminfo, mount, netstat, network_management, notification, package, permission, phone, power, search, sensor, simphonebook, statusbar, telephony.registry, throttle, uimode, usagestats, vibrator, wallpaper, wifi, window dumpsys的参数可以跟以上信息的名字。例如: adb shell dumpsys activity 显示activity相关的信息 adb shell dumpsys statusbar 显示状态栏相关的信息 adb shell dumpsys meminfo $package_name or $pid 使用程序的包名或者进程id显示内存信息

Continue reading ↦

Android定时任务相关

Android上定时运行任务常用的方法有2种,一种方法用Timer+TimerTask,另一种是AlarmManager。

Timer

Android 的 Timer 类可以用来计划需要循环执行的任务,Timer 的问题是它需要用 WakeLock 让 CPU 保持唤醒状态,这样会大量消耗手机电量,大大减短手机待机时间。而一旦待机,任务可能就不会执行了。

Timer实现不是很准确,时间上是有误差的。

AlarmManager

AlarmManager 是 Android 系统封装的用于管理 RTC 的模块,RTC (Real Time Clock) 是一个独立的硬件时钟,可以在 CPU 休眠时正常运行,在预设的时间到达时,通过中断唤醒 CPU。

这意味着,如果我们用 AlarmManager 来定时执行任务,CPU 可以正常的休眠,只有在需要运行任务时醒来一段很短的时间。

这种实现通常要选择RTC_WAKEUP才能达到这样的效果,这是需要注意的!

Continue reading ↦

Javascript零食

1.Js跨域实现必须要服务端支持才可以 Js跨域通常是通过动态创建script实现的。 2.Js压缩和反压缩(混淆和反混淆) 通常所说的压缩和混淆指的是一样的。现在很多都采用出现较早的Dean Edwards’ Javascript Packer的压缩方式,即eval方法的方式,所以反压缩也比较容易,使用下列语句即可。 eval("var data=String" + encode.slice(4)); 此时data的值就是解压还原出的原始代码。 很多解压缩工具解压缩都是这么做的。 3.Js进制转换 10进制parseInt(str) 10进制转16进制int.toString(16) 16进制转10进制parseInt(c,16)


TextView自动跑马灯

TextView中的文本太多时,我们希望文本以跑马灯的形式展现。xml文件中对TextView做以下属性配置即可实现: <TextView android:id="@+id/TextView03" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ellipsize="marquee" android:focusable="true" android:focusableInTouchMode="true" android:marqueeRepeatLimit="marquee_forever" android:padding="5dip" android:singleLine="true" android:text="Really Long Scrolling Text Goes HereReally Long Scrolling Text Goes Here" /> 每次用跑马灯都要写这些属性配置,太麻烦了点。简单方法? TextView的跑马灯效果只有在获得焦点的时候才开始滚动,以上这些属性就是配置marquee效果,并且自动获得焦点。那简单的方法就是:自定义View继承TextView,然后覆盖TextView的一些方法,使其自动完成跑马灯效果,而不是通过配置属性来完成。代码如下: package com.androidbears.components; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.widget.TextView; public class ScrollingTextView extends TextView { public ScrollingTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public ScrollingTextView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public ScrollingTextView(Context context) { super(context); init(); } @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { if(focused) super.

Continue reading ↦

Android应用没有Activity是否可以接受广播?

一个应用没有activity,在API<3.1的版本是可以的接受广播,3.1以后就不可以了。 从3.1开始出于安全的考虑,一个应用必须至少运行一次才能接受广播,意思是说用户知道这个应用运行过,它才可以接受广播。如果非要试试没有activity的话,可以第一次安装有activity,然后,删除activity和xml对应的配置信息再次安装。不过这样实际意义不大。 普通的App如果没有启动默认都是停止状态的,停止状态的App默认是接受不到任何广播的。不过发送广播时如果添加指定标记,也可以使停止状态的应用接受这个的广播。 /** * If set, this intent will not match any components in packages that * are currently stopped. If this is not set, then the default behavior * is to include such applications in the result. */ public static final int FLAG_EXCLUDE_STOPPED_PACKAGES = 0x00000010; /** * If set, this intent will always match any components in packages that * are currently stopped. This is the default behavior when * {@link# FLAG_EXCLUDE_STOPPED_PACKAGES} is not set.

Continue reading ↦

Android自定义相机功能模块

一个Android自定义相机功能模块,调用简单。提供拍照预览功能,支持从图库选择图片,仅支持竖屏拍照和预览。 项目地址:https://github.com/laomo/TakePhoto 调用方式: package com.laomo.takephoto; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.widget.ImageView; public class MainActivity extends Activity { private static final int CODE_TAKE_PHOTO = 1; private ImageView mImageView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent intent = new Intent(this,TakePhotoActivity.class); startActivityForResult(intent, CODE_TAKE_PHOTO); mImageView = (ImageView) findViewById(R.id.imageview); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //取得拍照所得图片的byte数组 if(resultCode == RESULT_OK&&requestCode == CODE_TAKE_PHOTO){ byte[] _data = data.

Continue reading ↦

wordpress支持markdown

markdown是一个很轻量级的文本标记语言,其语法可直接翻译成HTML,便于编写和阅读。 比较有名的对Markdown的应用是github和stackoverflow,我是通过github知道的。有种相见恨晚的感觉,只怪自己孤陋寡闻啊!!决定以后就用它来写东西。一直想在Wordpress上能用Mardown就好了。可惜Wordpress没有对Markdown做支持,好在可以安装各种插件,扩展性就是好啊。 其实主要问题是用Markdown来写wordpress blog,但是希望之前的文章不受影响,排版格式和代码高亮等等。如果单纯的用Markdown写全新的wordpress blog,很好办,好多插件都可以,一下提到的都可以。 目标:老文章编辑显示方式不变,依旧用原来的,用markdown写的文章,编辑显示基于markdown。 到目前为之,尝试了挺多插件,最后的效果还算不错,就是代码高亮不太完美,有待优化。一下列出尝试列表和最终选择解决方案。 尝试一:Markdown for WordPress and bbPress插件。 核心是markdown.php文件。由于以上提到的老文章兼容问题(安装测试时是排版问题),未能采用。 尝试二:修改WordPress插件让Markdown与HTML格式并存 这篇blog博主貌似是台湾同胞,blog是繁体的,人很热心。修改的就是Markdown for WordPress and bbPress插件,主要是通过在页面内加标记,解析的时候通过判断页面有这个标记,就解析为Markdown,然后转成Html,没有就不做处理。测试了也是老文章排版问题。理论说这么做是应该可以了。但是具体原因未能查清,可能和wordpress版本有关系吧。 尝试三:Markdown on Save+WP MarkItUp! 依然是那位热心的台湾同胞。通过2个插件完美的解决了他的blog中Markdown与HTML格式并存。但是到我这还是有小问题。WP MarkItUp!是对编辑的时候做所视即所得支持的。但是我安装后设置页面一直提示无权打开。Markdown on Save通过在表中添加一个字段的处理方式来完成Markdown与HTML的兼容。由于WP MarkItUp!设置问题和要对表做修改,并未单独测试Markdown on Save。 尝试四:WP-Markdown 编辑完成保存时把markdown保存为html,编辑原有blog把html转成markdown。但是测试插件安装以前写得blog发现还是有问题,并为把html转成markdown。可能也修改数据库了,还是blog加入转换标记了。目前用的就是这个插件。代码高亮有点问题,使用wp-highlight.js这个插件支持代码高亮,但是不太好。 这里面有个小插曲: 写java的代码,代码中有类似这种List<ResolveInfo>的,会在代码中自动补全 List</ResolveInfo>。 开始以为是插件问题,关闭插件发现还是有这个问题。捣鼓半天,最后才想到是不是wordpress太“智能”了,WP-Markdown把markdown保存为html,wordpress自动补全html标记?最后在设置-撰写里找到了,果然wordpress太“智能”。有个选项“让 WordPress 自动校正嵌套错误的 XHTML 代码 ”。好吧,把选项关掉。该早点想到的。只是以前都是可视化写blog,类似这种,wordpress已经转换好了,不会在html源码中直接出现类似List<ResolveInfo>这种代码。 本文地址:http://lmbj.net/blog/wordpress-support-markdown


使用Github Pages搭建Octopress博客

安装 参考了很多文章基于Github Pages搭建Octopress博客,我的Octopress终于搭建成功了。网上已经很多教程,不在详述,一下罗列我参考的文章,以示感谢: 使用Octopress将博客从wordpress迁移到GitHub上 象写程序一样写博客:搭建基于github的博客 Blog = GitHub + Octopress 还有[像黑客一样写博客],可以搜索下,好多转载的,不给出具体地址了。 基本上参考文章大同小异,当然有些会很详细,有些是概述。 注意事项 安装过程虽然好多文章都写的很简单顺利。但是实际环境不同,会遇到很多不同的问题,以下记载我安装以及使用中遇到的问题。 1.Ruby版本问题 Ruby一定要是至少9.2版本的。ubuntu系统不要使用系统默认可安装的,是8.x版本的。我最后使用rvm安装的。由于不懂Ruby,不谈论安装细节啦。 2.git配置问题 发布文章时,使用的是全局的git配置,不能使用在octopress项目下配置的git用户名和邮箱。 解决:明明配置了.git/config文件,为什么发布文章使用的还是全局的git用户名和邮箱?虽然不懂Ruby,但是看打印出的信息,_deploy文件夹都是删除重新生成,也就说说文件夹的git信息都是重新初始发的!然后大概了解了下,Ruby使用Rakefile文件,硬着头皮打开看看吧。果然看到deploy_dir的git信息都是重新初始化的!这下好办了,在每个git init后面加入: git config user.name yourname git config user.email youremail 2个地方都加上了,再次发布文章,已经显示你填写的用户名和邮箱啦。 3.源码备份问题 博客程序发布会占用github的master分支。想备份整个程序源码的话,其实也很简单。因为发布过博客以后,本地分支名字已经变成source。只需要简单的push到github上就行了。这样:master分支是博客内容,source分支,是用来发布的程序,包括博客文章的备份。 4.命令不熟悉 以下列举安装成功以后,发布文章要用到的命令: 本地预览:rake preview 地址:http://localhost:4000 创建文章:rake new_post[‘Hello World’] 生成静态文件:rake generate 发布文章:rake deploy 我的第一篇Markdown博客 用到了标题,链接(参考式),有序列表以及代码区块。


修改git已提交的的author和email

这个问题来源于我的实际应用中的需求,在得问发起提问:修改git已提交的的author和email,具体如下: 修改上一次提交的用户名和Email可以用以下命令: git commit –amend –author=‘Your Name [email protected]’ 我现在的需求是这样的:项目中git初始化时未指定name和email,使用了全局的name和email设置,已经提交过N次,假设10次。但是我希望这个项目使用自己的name和email,而不是全局的。那么该如何修改N次已提交的name和email? 我明确的知道肯定有这样一个操作,可以一次完成,但是苦于不知道这是怎样一个操作。有兄弟回答,给出答案:git filter-branch,大概明白了意思,感觉要写一个脚本,但是只是用过简单的git命令,自己写不出,然后顺着这个方向找,找到 http://stackoverflow.com/questions/750172/how-do-i-change-the-author-of-a-commit-in-git。可以说是一模一样的需求(怎么没想到用英文搜索答案??估计想到,也拼装不出这句吧?)。这里的答案给出了具体的脚本,其中github上的http://help.github.com/articles/changing-author-info 解决方案比较完美,或者说扩展了这个需求,不仅仅解决这个问题。以下是实现代码: # !/bin/sh git filter-branch --env-filter ' an="$GIT_AUTHOR_NAME" am="$GIT_AUTHOR_EMAIL" cn="$GIT_COMMITTER_NAME" cm="$GIT_COMMITTER_EMAIL" if [ "$GIT_COMMITTER_EMAIL" = "[email protected]" ] then cn="Your New Committer Name" cm="Your New Committer Email" fi if [ "$GIT_AUTHOR_EMAIL" = "[email protected]" ] then an="Your New Author Name" am="Your New Author Email" fi export GIT_AUTHOR_NAME="$an" export GIT_AUTHOR_EMAIL="$am" export GIT_COMMITTER_NAME="$cn" export GIT_COMMITTER_EMAIL="$cm" ' 最后吐槽一下,百度搜索上确实比Google差很多。


Ant编译Android工程

一.Ant安装 Windows下安装Ant: ant 官网可下载 http://ant.apache.org ant 环境配置: 解压ant的包到本地目录。 在环境变量中设置ANT_HOME,值为你的安装目录。 把ANT_HOME/bin加到你系统环境的path。 Ubuntu下安装Ant sudo apt-get install ant即可,环境变量也会自动配置。 二.编译Anadroid工程 android本身是支持Ant编译的,这里要知道一些Android命令。配置好android sdk 环境,保证在任意目录下执行android 命令。 1.创建一个android项目 android create project -k tk.laomos.demo -a Demo -t 25 -p . 参数说明: -k /–package 为命名空间(包名) -a /–name 工程名 -p /–path 项目 -t 为目标平台的版本对应id编号 查看当前平台Api level对应的id:(列出不同版本平台的对应id编号) android list targets 2.更新一个android项目产生build.xml等ant配置文件 对已经存在的android工程,我们可以update下(修改平台的版本),这样会自动添加build.xml 等ant的配置文件. android update project --name Demo -t 25 -p . 然后直接执行ant可以查看相应的参数。 ant 参数如下:

Continue reading ↦