ConditionVariable类位于android.os.ConditionVariable,它可以帮助Android线程同步。在SDK上的介绍ConditionVariable不同于标准Java位于java.lang.Object wait() 和 notify() ,这个类可以等待自己,这就意味着 open(), close() 和 block() 可能会假死 ,如果使用ConditionVariable类的open()在调用 block() 之前, block() 将不会阻塞,相反将会返回立即。 该类一共有4个方法 boolean block(long timeout) 阻止当前线程知道条件是open,或直到超时,这里参数long timeout为超时设置,Android123提示大家如果你们从事过Win32开发,这个方法类似DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds); 函数。 void block() 阻止当前线程知道条件 open ,是上面的无超时等待重载版本。 void close() 重置条件为 close状态。 void open() Open条件,释放所有线程的阻塞. ConditionVariable在创建时还有一种构造方法是 public ConditionVariable (boolean state) ,如果为true,默认时为opened,如果为false则是closed. ,默认public ConditionVariable () 为close().
图160S
Android跨进程数据通讯-剪切板Clipboard Android开发技术
在Android平台中每个常规的应用运行在自己的进程空间中,相对于Win32而言Android上之间的进程间传递主要有IPC、剪切板。当然今天我们说下最简单的ClipboardManager。使用剪切板可以直接实现数据的传输。整个实现比较简单,Android123提示注意剪切板中的类型判断。剪切板类位于android.text.ClipboardManager,导入时注意。 public void setClipboard(String text) { ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); clipboard.setText(text); } public String getClipboard() { ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); return clipboard.getText().toString(); } 有关剪切板的数据类型可以通过 该类的boolean hasText() 方法判断。
在Android的Notification中显示进度条 Android开发技术
如果你在使用Android Market下载应用可能会发现StatusBar拉下后区域除了显示常规的图标、文字和描述外还有一个进度条指示。在Android的Notification中如何加入ProgressBar呢?我们发现NotificationManager类只涉及一个提示的显示和取消,相关的细节还是在构造Notification中实现,该类的contentView属性可以帮助我们制定一个RemoteViews的布局,通过setProgressBar来实现对RemoteViews的进度指示做刷新工作,如果你做过Android上的Widget,则不会对RemoteViews陌生吧,实现图片和文字的修改可以通过setImageViewResource或setTextViewText方法实现。Android开发网需要说明的是: RemoteViews在构造时第二个参数需要制定一个xml的布局文件。类似RemoteViews(getPackageName(),R.layout.android123); 而对于它的设置进度,4个参数中,第一个为RemoteViews中的ProcessBar ID,第二个参数为进度条的最大范围,第三个是当前的进度指示一般我们在单独的线程中处理逻辑,可以通过Handler实时回调显示状态比如setProgressBar(R.id.myProcessBar,maxProcess, currentPos, false);
Android基础概念Context的作用 Android开发技术
很多初入Android开发的网友向我们问到Context有什么作用,很多地方都用到它,这里Android123给这些新入门的网友做个简单的解释: Context字面意思上下文,位于framework package的android.content.Context中,其实该类为LONG型,类似Win32中的Handle句柄,很多方法需要通过Context才能识别调用者的实例,比如说Toast的第一个参数就是Context,一般在Activity中我们直接用this代替,代表调用者的实例为Activity,而到了一个button的onClick(View view)等方法时,我们用this时就会报错,所以我们可能使用ActivityName.this来解决,主要原因是因为实现Context的类主要有Android特有的几个模型,Activity、Service以及BroadcastReceiver。 常规需要Context实例的方法主要有各种Service实现的类,比如说SensorManager在实例化时需要getSystemService(String)方法就必须由Context的实例执行,还有一些私有的文件系统I/O比如说openFileInput以及常用的Toast的makeText方法。
onSaveInstanceState和onRestoreInstanceState的用处 Android开发技术
很多不明白Activity类中包含的onSaveInstanceState和onRestoreInstanceState有什么用,首先Android123声明下使用这两个方法时一定要注意情况和了解Activity的生命周期,否则有的时候 onSaveInstanceState和onRestoreInstanceState 可能不会被触发,虽然他们都是Activity的重写方法。 他们比较常用到的地方是 Sensor、Land和Port布局的自动切换,过去Android开发网曾经说过解决横屏和竖屏切换带来的数据被置空或者说onCreate被重复调用问题,其实Android提供的onSaveInstanceState方法可以保存当前的窗口状态在即将布局切换前或当前Activity被推入历史栈,其实布局切换也调用过onPause所以被推入Activity的history stack,如果我们的Activity在后台没有因为运行内存吃紧被清理,则切换回时会触发onRestoreInstanceState方法。 这两个方法中参数均为Bundle,可以存放类似 SharedPreferences 的数据,所以使用它们作为当前窗口的状态保存是比较合适的。实际使用代码 @Override protected void onSaveInstanceState(Bundle outState){ outState.putString("lastPath", "/sdcard/android123/cwj/test"); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); String cwjString = savedInstanceState.getString("lastPath"); }
Android开发注意点 Part One Android开发技术
Android已经的很多细节问题我们通过平台开发总结不断完善这个列表,如果你有相关的内容可以联系 android123@163.com . 一、AssetManager – 已知单个文件处理不能大于1MB,所以如果资源很大,建议使用Zip格式压缩存放。 二、ScrollView中嵌入ListView – 这个作法可能会出现你的ListView仅仅显示1行半。 三、Android自带的Zip处理类对文件名编码无法识别,也没有提供显示的设置方法,在zlib中写死了。 四、使用一些资源对象记住关闭,比如对于文件流对象最后 FileOutputStream os = xxx; try { //dosomething } finally { os.close(); //显示的使用finally关闭文件对象。 } 对于Cursor而言,在移动位置时首先判断Cursor是否为空,最终使用完仍然需要 close方法,如果重用,可以使用deactivate方法释放当前资源,通过requery方法再次查询。 五、SDK中标记为 deprecated 字样的,常规情况下是有更好的方法可以替代,短期内可以放心使用。这些方法一般高版本的SDK都可以向上兼容,目前尚未发现Android放弃某些API的支持。 六、Notification的Intent无法传递到目标的Activity,Service和Broardcast没有测试过,中途需要通过PendingIntent,可能这里出现了问题。
Android代码性能优化技巧 Android开发技术
目前来说Android 2.2的JIT性能有了本质的提高,不过对于老版本的程序提高Java执行效率还有很多语言特点来说,今天Android123提到的不是语法糖,而是基础的问题,对于Java 1.5之后将会有明显的改进。下面的例子来自SDK: static class Foo { int mSplat; } Foo[] mArray = … 上面的静态类Foo的执行效果和性能,我们分三个方法zero、one和two来做对比。 public void zero() { //大多数人可能简单直接这样写 int sum = 0; for (int i = 0; i < mArray.length; ++i) { sum += mArray[i].mSplat; } } public void one() { //通过本地对象改进性能 int sum = […]
WordPress 技巧:社会化评论插件多说提速技巧
分享几个社会化评论插件多说的提速技巧:1. 不再查询 WordPress 原生的留言。 2. 不再加载 comment-reply.js,3.把多说的 JavaScript 脚本移到 footer。 不再查询 WordPress 原生的留言 我们知道使用多说这样的社会化评论服务之后,WordPress 本地的留言除了备份之外,其他已经没有什么作用了。但是安装了多说之后,WordPress 还是会去数据库查询当前日志的留言,这样的查询其实已经没有意义了,我们可以通过下面的代码屏蔽这次查询,达到提速的目的。 打开当前主题的 single.php 文件,把以下函数注释掉: comments_template(”, true); 然后添加下面的代码: require( $duoshuoPlugin->commentsTemplate('')); 这样 WordPress 就不会再次去数据库查询当前日志的留言了。 不再加载 comment-reply.js 我们知道 WordPress 在开启 Thread Comments 之后,WordPress 会要求在 head 加载一个叫做 comment-reply.js JavaScript 文件,它是用来实现 WordPress 原生嵌套留言的回复功能,但是我们使用多说之后,多说接管了所有留言的功能,多说也自带了嵌套回复功能的 JS,,所以 comment-reply.js 也就没有必要了,我们可以删除当前主题下的 header 中调用代码实现 WordPress 更快的加载。一般 comment-reply.js 加载代码如下: if ( is_singular() […]
为什么使用 WordPress 给企业建站
我是 2006 年开始使用 WordPress,然后就深深的喜欢上了这个开源的博客程序,测试和使用了上百个 WordPress 插件,并且自己也写几个 WordPress 插件。 更重要的是从 2007 年开始使用 WordPress 给企业或者工作室建站,到今天已经有好几年的经验,其中也有了许多成功的案例,也和其中几个对 WordPress 有相同爱好的朋友一起组建了一个专门使用 WordPress 给企业建站的团队:WordPress JAM。今天就自己这几年的使用 WordPress 给企业建站的经验说下为什么选择 WordPress。 WordPress 使用简单,WordPress 是一个博客系统,它要应对全世界上亿用户的不同的使用习惯,所以它的用户体验是很好的,WordPress 用户界面友好,很快就能上手使用,所以你不也用担心你的老板不会用。 WordPress 建站 SEO 好,收录快,WordPress 具有非常好的 SEO 特性,使用 WordPress 建立的网站可以很快被 Google 和者百度等搜索引擎收录,刚发布的文章最快几分钟就能收录,所以使用 WordPress 建站对企业进行网络推广非常有大的帮助。 WordPress 完全支持中文,WordPress 主要开发者是美国人,所以他的默认语言是英文的。但是对于不懂英文的同学,完全不用考虑语言的问题,WordPress 是本地化做的做的最好的开源程序之一,它完全支持 i18n 协议,各国爱好者也对其进行了本地化,国内有 WordPress 中文团队一直对其进行本地化工作。 WordPress 是可扩展,WordPress 虽然是一个博客程序,但是 WordPress 众多的插件是你可以把它改成任何程序,你可以把你的 WordPress 作为一个 Wiki 程序,也可以作为 […]
多说更新到 1.0 版本:支持社交账号注册和后台统计数据
最好用的社会化评论系统多说的 WordPress 插件更新到 1.0 版本,这个版本开始支持支持社交账号注册和后台统计数据,使得多说向互联网基础设施服务更进一步。1.0 版本的详细更新信息: 社交登录的新用户允许绑定和注册!在注册页面会出现社交登陆按钮,点击进行社交授权之后,会进入 WP 正式注册流程,输入用户名和邮箱,由 WP 发送密码到邮箱完成注册。注册后的账号自动默认绑定之前授权的社交账号。个人建议提供函数,在 WordPres 任何页面也能注册登陆,如果能够提供 API 接口,适用于客户端开发,这样的话多说将更加强大。 评论流实时更新和实时桌面提醒:当本页面有新的评论出现时,不用刷新页面,评论流中会自动显示新的评论,这个功能对直播和互动较强的页面特别有用。当出现新回复的时候,会在浏览器右下角弹出桌面提醒,点击即可转到评论页面。 查看统计数据:直接在WP后台可以查看多说评论统计数据,无需再到多说主站来查看 允许单篇文章或页面启用或禁用多说评论框:在文章或 Page 的编辑页面,开关文章评论的地方,新增“关闭本文多说评论”的勾选项,如果勾上了,则本页显示 WordPress 原始评论框,如果想连 WordPress 原始评论框都关掉,请再勾掉上方的“允许评论” 支持核心代码后置功能:多说的 embed.js 文件加载之前都放在最前,这样做是为了防止网站自身的js文件加载速度慢导致多说加载滞后(如广告js),但有些站长担心多说会阻拦其他进程,因此这个版本中增加了将多说embed.js后置的开关,我前面提供的:把多说的 JavaScript 脚本移到底部的 WordPress 技巧可以不再使用。 标签:WordPress 插件 多说

WP125: WordPress 的 125×125 广告管理插件
现在很多博客都在侧边栏放置 125X125 的广告位,但是怎么管理这些广告位呢:如何实现广告轮转,广告过期了怎么处理?所以我们需要一个高效的广告管理工具,除了可以使用第三方的广告管理工具(比如:Google DFP,百度广告管家)之外,我们还可以使用 WP125 这个 WordPress 插件来管理博客侧边栏 125X125 的广告位。 WP125 介绍 WP125: WordPress 的 125×125 广告管理插件 WP125 插件也是一个高效的广告管理工具,它能帮你非常高效的管理侧边栏 125X125 广告位,让你专心写日志。WP125 会在 WordPress 后台添加一个 “Ads” 顶级菜单,然后有三个子菜单,分别用来调整设置,添加和管理广告位。 WP125 功能 支持一栏或者两栏广告显示,并且支持模板函数。 支持无限的广告位,并且支持手工或者随机顺序。 可以跟踪广告点击次数。 当新建广告位的时候,你需要自己计算那天结束,只需要输入广告显示的天数即可。并且当广告位到期的时候会自动下线。 当一个广告位到期了,这个广告位的记录会被存档,并且以未激活状态保存,你可以查看这个广告位的最终点击数或者恢复广告位运行。 当一个广告位为空的时候,会显示一个你选择的默认的广告图片。一般是“Your Ad here”这样的图片,并且你可以设置默认链接链,一般我们把它设置为链向,广告统计,价格或者一个推荐链接。 可以设置当广告位过期的时候是否有邮件通知,这样你就可以及时知道广告位过期并通知广告商。 WP125 安装 和其他插件安装一样,通过 FTP 直接上传到插件目录,激活即可,也可以直接在 WordPress 后台安装。 如果你的主题支持 Widget,把 WP125 的 Widget 直接拖到侧边栏即可,如果不支持,可以在主题的 sidebar.php 的模板文件中添加 wp125_write_ads(); 这行代码。 WP125 […]
WordPress 技巧:显示同个父页面的其他子页面的链接
假设有一个父页面,然后它有一些子页面。当打开父页面的时候,你想在 sidebar 显示它的子页面的链接。 当打开子页面链接的时候,你还是想要显示它同个父级下的所有一组链接。现在问题是,首先要判断现在的页面时是相同父页面的其他子页面。我们无法通过一个简单 WordPress 函数就能解决这个问题。 <?php global $post; if($post->post_parent){ $children = wp_list_pages("title_li=&child_of=".$post->post_parent."&echo=0"); } else { $children = wp_list_pages("title_li=&child_of=".$post->ID."&echo=0"); } if ($children) { echo '<ul>'; echo $children; echo '</ul>'; } ?> 标签:WordPress 技巧
Android开发基础YesNo对话框构造代码 Android开发技术
很多初入Android开发的网友询问,如何快速的实现一个简单的YesNo对话框,其实我们主要的构造代码如下 AlertDialog.Builder builder = new AlertDialog.Builder(CWJ.this); builder.setTitle("标题"); builder.setMessage("问题描述"); builder.setPositiveButton("是", CWJ.this); builder.setNegativeButton("否", null); builder.setCancelable(true); //设置允许取消 builder.show(); //显示这个消息框 下面我们需要为PositiveButton设计一个Listener实现按下事件的处理。我们在Activity类名后面加入 implements DialogInterface.OnClickListener 实现Dialog的按下事件捕获。重写 onClick 方法,即可 public void onClick(DialogInterface dialog, int which) { //dosomething } 当然Android123还是给大家一个更简单的方法吧,无需实现DialogInterface接口,替换上面的 builder.setPositiveButton("是", CWJ.this); 这句为 builder.setPositiveButton("是", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { //dosomething 即可 } })
SQLite操作,还是raw方法更简洁高效 Android开发技术
对于Android平台上的数据库而言使用了嵌入式越来越流行的SQLite,为了更好的跨平台我们推荐大家使用原始SQL语句直接操作,在代码和处理效率上都有不小的提高,不过要做好SQL语句异常处理。 下面我们说下rawQuery的好处,可以看到查询的代码直接使用SQL语句,通过性能实测效率比Android封装过的类要快不少,但不能配合一些Adapter的使用,不过总体上在跨平台上很突出,下面为本地使用方法的伪代码,没有做任何构造和实例化,希望让项目经理知道rawSQL的优势在Android平台上的使用。 SQLiteDatabase db; String args[] = {id}; ContentValues cv = new ContentValues(); cv.put("android123", id); Cursor c = db.rawQuery("SELECT * FROM table WHERE android123=?", args); 执行本地SQL语句查询 if (c.getCount() != 0) { //dosomething ContentValues cv = new ContentValues(); cv.put("android123","cwj"); db.insert("table", "android123", cv); //插入数据 String args[] = {id}; ContentValues cv2= new […]
根据packageName构造Context Android开发技术
通常情况下获取当前应用的context的方法是getApplicationContext,但是通过根据其他的packageName如何构造Context呢? Android平台的应用实例其实还可以通过其他方式构造。比如代码 try { Context ctx= createPackageContext("com.android123.Cwj", 0); //ctx已经是com.android123.cwj的实例 } catch (NameNotFoundException e) { //可能由于pacakgeName不存在所以必须处理该异常 } 需要注意的是,createPackageContext方法的第二个参数可选为CONTEXT_INCLUDE_CODE 和 CONTEXT_IGNORE_SECURITY ,定义分别为4和2,上面为0。一般忽略安全错误问题可以通过CONTEXT_IGNORE_SECURITY 标记,同时可能还需要处理 SecurityException 异常。
Android蓝牙库1.x和2.x完全不兼容 Android开发技术
Android平台之间差异在1.x和2.x中变化最大的除了Contacts、Launcher外,可能直接能造成Force Close的就是蓝牙库。虽然在Android 1.0到1.6中不支持蓝牙数据传输,但是可以正常的管理蓝牙电源模块中使用android.bluetooth.BluetoothDevice类可以处理相关的开关和状态,但是在Android 2.x中更换为了android.bluetooth.BluetoothAdapter,而过去的android.bluetooth.BluetoothDevice目前变成了处理单个蓝牙模块硬件的属性表示,这点大家需要注意。
自定义Android应用的访问权限 Android开发技术
由于Android部分设计原理较为开放,可能通过Intent或PackageManager就可以解析处理调用其他应用的子类,所以在部分应用中需要做更多的安全处理,保证应用内部的稳定性和安全性。Android123强烈大家仔细阅读本文,这将会对您在构架Android应用时减少一些隐患的发生。 稳定性: 部分类可能没有数值的传入将会导致可能初始化失败,造成Force Close等问题。 安全性: 其他应用调用本程序的SQL数据库等问题,可能会造成一些无法预料到的损失。 一、Android应用内部安全保护 为了考虑内部部分敏感数据处理的安全性加入类ACL访问控制,当然使用了更加灵活的,比如UID、SID、PID等多种方式:今天Android开发网一起和大家谈论下开发过程中的处理细节。 1. 部分私有的配置信息,或相对轻量级的内容,可以使用SharedPreferences接口提供的相关方法处理,并设置为安全标志位私有MODE_PRIVATE,不过需要注意的是该方方仅能但进程调用。 2. SQLite的安全问题,对于Content Provider的处理权限,在Android中可以直接显示的声明,比如在androidmanifest.xml中声明读或写权限,在Provider节点中,声明android:writePermission或android:readPermission属性,当然其他程序声明了这些权限也可以访问,这时我们可以通过 android:authorities属性限制一个类的访问,比如android:authorities="cn.com.android123.cwj" 。最终类似 <provider android:name="cwjProvider" android:authorities="cn.com.android123.cwjProvider" android:writePermission="cn.com.android123.cwj.permission.WRITE_DATABASE" android:readPermission="cn.com.android123.cwj.permission.READ_DATABASE" /> 这里Android123提示大家,数据库本身的读写可以处理多线程问题,但是数据的先后可以考虑同步问题,设置android:multiprocess="true"属性来保证数据的正确性,相关问题不在本文讨论范围内,我们可能会在以后的内容中涉及这部分问题。 3. Activity、Service和Receiver的权限声明方式,可以直接使用android:permission属性,具体的和上面的SQLite安全一样的处理方式,演示代码如下 <activity android:name=".cwj" android:authorities="cn.com.android123" android:permission="cn.com.android123.cwj.permission.ACCESS"/> 二、Permission的声明 <permission android:name="cn.com.android123.cwj.permission.ACCESS" android:protectionLevel="normal" android:label="@string/permission_aceess" android:description="@string/permission_aceess_detail" /> 当然还有可选的属性比如说android:protectionLevel="normal"设置保护权限,还有必须签名signature,当然这里对于权限分组我们可以通过类似permission的方法来声明permissionGroup,或直接使用系统的,比如android:permissionGroup="android.permission-group.SYSTEM_TOOLS"最终其他应用中调用,可以显示的在自己的manifest.xml中声明即可,类似 <uses-permission android:name="cn.com.android123.cwj.permission.ACCESS" /> 三、账户安全声明 […]
androidmanifest.xml高级属性解析 Android开发技术
Android工程的的主配置文件androidmanifest.xml的一些高级属性大多数开发者可能不了解,下面我们一起来看一看。 支持的屏幕大小设置,我们可以显示的指定允许运行在: <supports-screens android:largeScreens="true" //WVGA android:normalScreens="true" //HVGA android:smallScreens="true" //QVGA android:resizable="true" android:anyDensity="true" /> 是否必须支持5位导航键才能使用,一般多用于游戏 <uses-configuration android:reqFiveWayNav="true" /> Android 2.1开始的Live Wallpaper特性要求 <uses-feature android:name="android.software.live_wallpaper" /> 必须保证设备包含了光线感应器 <uses-feature android:name="android.hardware.sensor.light" /> 设备OpenGL的支持版本,值为一个int型的整数。 <uses-feature android:openGlEsVersion="int"> Android开发网提示大家更多的androidmanifest.xml文件相关内容可以查找本站过去归档来了解更多。 引用一个外部的jar,一般在非Eclipse IDE中我们可以直接使用 <uses-library> 来实现。
Android Rootkit相关揭秘 Android开发技术
Android Rootkit可能导致了近期部分安全公司开始涉及Android平台的安全软件研发,比如全球著名的反病毒软件Norton的母公司Symantec赛门铁克推出了一款基于该平台的安全产品。 Rootkit是内核的后门,如果你了解反病毒技术在Win32上我们可能还记得一些敏感的话题,比如说内核驱动,Hook SSDT等技术来实现安全监控,从目前来看Vista以后的UAC以及Linux的ACL控制几乎限制了这些内核驱动在常规账号下的加载,但是Android123提示大家越狱的Root权限手机可能存在十分大的安全漏洞,目前我们可以通过NDK开发一些安全敏感的软件,比如说键盘记录的Rootkit,比如在/dev/input中可以处理用户的一些输入输出事件,对于Root权限的机器可以随便的通过su获取高权限,执行iptables来阻止用户的接入,当然通过chmod改变一些目录的权限,获取其他用户的uid,危急整个Android设备的安全。 对于Android平台上的Rootkit的检测对于普通用户,在类似Win32的Ring3层上很难读取一些敏感指纹数据来判断,不过是后门存在可以断定,必然存在线程,文件系统上还是需要读写的,一般作为后面还是监听一些端口实现远程的控制。 Android平台的Rootkit是如何被植入的呢? 相对于iPhone App Store而言,Android的Market相对自由,同时用户可以从非Market上安装软件,所以少了人工审核出现一些问题是正常的,不过按照目前移动软件的开发人员来看出现病毒开发者短期内还不会出现。
android.text.format文件大小和日期解析类 Android开发技术
很多网友可能直接将自己的J2ME项目生硬的移植到Android平台,其实Google为我们提供好了文件大小和时间日期解析类,它位于android.text.format这个包中,它提供了强大的标准化解析方法: 1. IP地址解析类 在android.text.format.Formatter中提供了String formatIpAddress(int addr) 这个方法可以轻松方便的将socket中的int型转成类似127.0.0.1的IP格式,需要注意的是Linux平台的字节顺序,即小字节序、低字节序little-endian。 2. 文件大小解析类 细心的网友可能还看到了android.text.format.Formatter中的formatFileSize方法,该方法String formatFileSize (Context context, long number) ,第二个参数是long型,一般为File对象的最后修改时间或创建时间的方法,最终返回类似 12KB、5Bytes的值,20MB的字符串。 3. 日期时间解析类 ,该类位于android.text.format.DateFormat这个package中,该类提供了Java中的三种时间对象,Android123提示大家下面三种方法为静态可以直接调用,如下: final static CharSequence format(CharSequence inFormat, Date inDate) //传入Date对象 Given a format string and a Date object, returns a CharSequence containing the requested date. final static CharSequence format(CharSequence inFormat, Calendar inDate) […]
自定义Android应用的访问权限 Android开发技术
由于Android部分设计原理较为开放,可能通过Intent或PackageManager就可以解析处理调用其他应用的子类,所以在部分应用中需要做更多的安全处理,保证应用内部的稳定性和安全性。Android123强烈大家仔细阅读本文,这将会对您在构架Android应用时减少一些隐患的发生。 稳定性: 部分类可能没有数值的传入将会导致可能初始化失败,造成Force Close等问题。 安全性: 其他应用调用本程序的SQL数据库等问题,可能会造成一些无法预料到的损失。 一、Android应用内部安全保护 为了考虑内部部分敏感数据处理的安全性加入类ACL访问控制,当然使用了更加灵活的,比如UID、SID、PID等多种方式:今天Android开发网一起和大家谈论下开发过程中的处理细节。 1. 部分私有的配置信息,或相对轻量级的内容,可以使用SharedPreferences接口提供的相关方法处理,并设置为安全标志位私有MODE_PRIVATE,不过需要注意的是该方方仅能但进程调用。 2. SQLite的安全问题,对于Content Provider的处理权限,在Android中可以直接显示的声明,比如在androidmanifest.xml中声明读或写权限,在Provider节点中,声明android:writePermission或android:readPermission属性,当然其他程序声明了这些权限也可以访问,这时我们可以通过 android:authorities属性限制一个类的访问,比如android:authorities="cn.com.android123.cwj" 。最终类似 <provider android:name="cwjProvider" android:authorities="cn.com.android123.cwjProvider" android:writePermission="cn.com.android123.cwj.permission.WRITE_DATABASE" android:readPermission="cn.com.android123.cwj.permission.READ_DATABASE" /> 这里Android123提示大家,数据库本身的读写可以处理多线程问题,但是数据的先后可以考虑同步问题,设置android:multiprocess="true"属性来保证数据的正确性,相关问题不在本文讨论范围内,我们可能会在以后的内容中涉及这部分问题。 3. Activity、Service和Receiver的权限声明方式,可以直接使用android:permission属性,具体的和上面的SQLite安全一样的处理方式,演示代码如下 <activity android:name=".cwj" android:authorities="cn.com.android123" android:permission="cn.com.android123.cwj.permission.ACCESS"/> 二、Permission的声明 <permission android:name="cn.com.android123.cwj.permission.ACCESS" android:protectionLevel="normal" android:label="@string/permission_aceess" android:description="@string/permission_aceess_detail" /> 当然还有可选的属性比如说android:protectionLevel="normal"设置保护权限,还有必须签名signature,当然这里对于权限分组我们可以通过类似permission的方法来声明permissionGroup,或直接使用系统的,比如android:permissionGroup="android.permission-group.SYSTEM_TOOLS"最终其他应用中调用,可以显示的在自己的manifest.xml中声明即可,类似 <uses-permission android:name="cn.com.android123.cwj.permission.ACCESS" /> 三、账户安全声明 […]

神一样的主题:London Live WordPress Theme
今天看到一条关于 WordPress 的新闻:南非政府:4000万投入换个WordPress网站: 南非自由邦省政府一位负责人称,他们投入了4000万南非兰特(约合人民币2750万)重新设计政府网站,结果却被承包商给涮了,巨额投资的成果竟然是个任何普通站长都能做的 WordPress 站点。 南非政府为此与一家承包商签署了为期三年的合同,但承包商交工之后南非政府就发现被狠狠地骗了,最终建成的网站令人啼笑皆非,用的居然是免费的Wordpress博客软件,以及一个40美元的付费主题:London Live WordPress Theme。 有业内人士评论说,南非政府支付的费用简直荒诞可笑,而这个合同也为该承包商带来了每月350万南非兰特(约合人民币240万)的利润。 看到这条新闻,除了感觉 WordPress 无比强大,南非政府无比弱智之外,我更想观摩下 London Live WordPress Theme 这个神一样的主题。 推荐指数:★★★★★ | London Live WordPress Theme的演示和详细介绍 London Live WordPress Theme 是 ThemeForest 一个付费的主题,价格确实是 40美元,目前已经卖出去了 2500 多份,如果不算 ThemeForest 分成,赚到了超过 10W 美元了,国外做 WordPress 主题确实不错的。这个主题有什么特点呢: 两种不同的导航菜单样式(明和暗) 推荐视频 两种幻灯片选项(长和短) 包含 PSD。 内容页也支持幻灯片 非常容易配置的主题面板 两种类型的列表页(博客和传统新闻类型) 支持 WordPress 3.0 自定义菜单 内建带验证的联系表单 自动图片缩放(timthumb) […]
WordPress 技巧:让作者在后台只看到自己的文章
普通的作者,在 WordPress 后台不能看到太多的内容,我们可以让他们看到自己的文章,代码如下: <?php function wpjam_parse_query_useronly( $wp_query ) { if ( strpos( $_SERVER[ 'REQUEST_URI' ], '/wp-admin/edit.php' ) !== false ) { if ( !current_user_can( 'add_user' ) ) { global $current_user; $wp_query->set( 'author', $current_user->id ); } } } add_filter('parse_query', 'wpjam_parse_query_useronly' ); ?> 标签:WordPress 技巧

使用 WordPress 的子主题(Child Themes)功能快速制作自己的主题
在了解子主题功能之前,先来看一下你在使用 WordPress 的时候是否是这样:不会自己制作主题,只好从网上下载一个,这个主题整体风格比较适合,但是有些小地方不太好,自己只是有一点 CSS 基础,可以修改一些简单的样式。修改的时候,却发现主题文件这么多,里面掺杂各种 PHP、HTML 代码,让人不知道在哪里修改。 太好了,那么我们开始学习子主题吧,子主题就是来解决这个问题的。它可以基于某个主题,继承它的功能和样式,然后让你自己进行简单的代码编写就可以衍生出一个新的版本。你还可以对子主题增加样式、功能等等,不仅仅是修改父主题样式那么简单。 做一个子主题非常简单,只需要用 FTP 什么的新建一个目录,然后增加几个文件就可以。你只需要了解很简单的 HTML 和 CSS 知识就可以修改父主题的样式等,当然当父主题升级之后,子主题样式、功能不会被覆盖失效。所以从这个角度来说,如果你想修改一个主题,你应该用子主题这个功能,而不是直接修改原主题文件。 下面就来具体实践看一下,我们就以 Twenty Twelve 这个主题为例吧,其他的主题都是一样的。 子主题的目录结构 子主题也是一个主题,也跟其他主题一样,放在 wp-content/themes 目录下面的文件夹中,文件夹的名称可以随便定义,为了形象一点,在示例中,我们可以新建 twentytwelve-child 这样一个文件夹存放子主题。这样的话,我们的 themes 文件夹中,至少有两个文件夹:twentytwelve、twentytwelve-child ,因为子主题要基于父主题,所以主题目录肯定要有父主题。 在子主题中,一般有下面几个文件: style.css (这个必须有) functions.php (这个可以有) 其他模板文件 (这个可以有) 其他文件 (这个可以有) style.css 是必须的 这是构建子主题中唯一必须有的文件,因为 WordPress 根据主题中的 style.css 头部信息来获取主题信息。特别是子主题,除了像一般主题一样添加头部信息之外,还需要添加父主题的名称,这样 WordPress 才能获取父主题的资源文件。 style.css 头部信息通常是这样的 /* Theme Name: Twenty Twelve Child Theme […]

为 WordPress 增加按分类搜索功能并自定义外观
如果用 WordPress 做一个小型门户网站,那么可能搜索增加需要“按分类搜索”的功能,这样可以快速搜索到指定分类的文章资讯。同时,我们还要进行外观的修饰,适应我们网站的整体风格。本文就是讲解如何在自己网站上增加一个像下图一样的分类搜索功能: 增加分类搜索功能 强大的 WordPress 的搜索模块,通过一定的参数来实现按照分类搜索。例如下面这个格式: http://blog.wpjam.com/?cat=0&s=搜索内容 对网站的 index.php 发送参数 s 加上内容表示直接搜索所有内容,如果再加上参数 cat 就可以实现相应目录下文章搜索,cat 参数的值为 分类目录对应的 ID。那么思路比较明确,我们在评论模块表单中,增加一个 select 下拉选项,然后输出网站的分类目录让用户可以选择,之后提交给 index.php 就可以了。 WordPress 已经提供了这样一个输出网站分类目录的函数 wp_dropdown_categories ,具体使用说明可以看一下官方文档,对于本例中,我们只需要使用下面一句代码即可输出目录: <?php wp_dropdown_categories("show_option_all=所有分类&hide_empty=0&show_count=0&hierarchical=1&depth=1&name=cat"); ?> 特别要注意的参数 name,因为你只有指定了 name 值为 cat,点击搜索之后,发送到 index.php 文件的搜索链接才有 cat 参数,才能实现搜索对应分类目录的功能。 注意:一定要把这个函数插入到搜索模块表单(form)里面,否则点击搜索按钮之后这个选项不会被提交出去。 这样,我们的按分类搜索模块已经完成了。 自定义样式 这时候,虽然功能实现了,但是外观实在是太丑了,太丑太丑了。 一般的思路就是对输出的这个 select 元素进行直接的 CSS 样式修饰,但是 CSS 只能修改个边框、背景颜色而已,特别是那个难看的三角真没办法修饰。目前网上比较常用的有:包裹几层 div 然后遮盖一下三角、模拟出来一个下拉列表、用一些其他的离奇 JS 手法等等。 当然,直接模拟出来一个下拉列表这种做法是最方便最简单的了,而且可以高度自定义样式。潜行者m 这次就是用的这种方法,下面就来介绍一下。 […]
WordPress 技巧:让 Widget 标题支持简单的 HTML 标签
在默认情况下,WordPress 的 Widget 标题是不支持任何 HTML 标签的,下面的技巧教你使用简单的代码替换实现在 Widget 标题实现支持 HTML 标签。 <?php /* Plugin Name: WPJAM HTML Widget Title Plugin URI: http://blog.wpjam.com/m/simple-html-in-widget-title/ Description: 让 Widget 标题支持简单的 HTML 标签 Version: 0.1 Author: Denis Author URI: http://blog.wpjam.com/ */ add_filter( 'widget_title', 'wpjam_html_widget_title' ); function wpjam_html_widget_title( $title ) { //HTML tag opening/closing brackets $title = str_replace( '[', '<', $title […]
自定义Android应用的访问权限 Android开发技术
由于Android部分设计原理较为开放,可能通过Intent或PackageManager就可以解析处理调用其他应用的子类,所以在部分应用中需要做更多的安全处理,保证应用内部的稳定性和安全性。Android123强烈大家仔细阅读本文,这将会对您在构架Android应用时减少一些隐患的发生。 稳定性: 部分类可能没有数值的传入将会导致可能初始化失败,造成Force Close等问题。 安全性: 其他应用调用本程序的SQL数据库等问题,可能会造成一些无法预料到的损失。 一、Android应用内部安全保护 为了考虑内部部分敏感数据处理的安全性加入类ACL访问控制,当然使用了更加灵活的,比如UID、SID、PID等多种方式:今天Android开发网一起和大家谈论下开发过程中的处理细节。 1. 部分私有的配置信息,或相对轻量级的内容,可以使用SharedPreferences接口提供的相关方法处理,并设置为安全标志位私有MODE_PRIVATE,不过需要注意的是该方方仅能但进程调用。 2. SQLite的安全问题,对于Content Provider的处理权限,在Android中可以直接显示的声明,比如在androidmanifest.xml中声明读或写权限,在Provider节点中,声明android:writePermission或android:readPermission属性,当然其他程序声明了这些权限也可以访问,这时我们可以通过 android:authorities属性限制一个类的访问,比如android:authorities="cn.com.android123.cwj" 。最终类似 <provider android:name="cwjProvider" android:authorities="cn.com.android123.cwjProvider" android:writePermission="cn.com.android123.cwj.permission.WRITE_DATABASE" android:readPermission="cn.com.android123.cwj.permission.READ_DATABASE" /> 这里Android123提示大家,数据库本身的读写可以处理多线程问题,但是数据的先后可以考虑同步问题,设置android:multiprocess="true"属性来保证数据的正确性,相关问题不在本文讨论范围内,我们可能会在以后的内容中涉及这部分问题。 3. Activity、Service和Receiver的权限声明方式,可以直接使用android:permission属性,具体的和上面的SQLite安全一样的处理方式,演示代码如下 <activity android:name=".cwj" android:authorities="cn.com.android123" android:permission="cn.com.android123.cwj.permission.ACCESS"/> 二、Permission的声明 <permission android:name="cn.com.android123.cwj.permission.ACCESS" android:protectionLevel="normal" android:label="@string/permission_aceess" android:description="@string/permission_aceess_detail" /> 当然还有可选的属性比如说android:protectionLevel="normal"设置保护权限,还有必须签名signature,当然这里对于权限分组我们可以通过类似permission的方法来声明permissionGroup,或直接使用系统的,比如android:permissionGroup="android.permission-group.SYSTEM_TOOLS"最终其他应用中调用,可以显示的在自己的manifest.xml中声明即可,类似 <uses-permission android:name="cn.com.android123.cwj.permission.ACCESS" /> 三、账户安全声明 […]
EditText仅允许特定类型数据输入 Android开发技术
很多网友可能在开发Android时发现EditText有时候需要限制用户输入的内容,通常我们可以使用正则表达式直接限制,但是Android已经为我们准备好了EditText的输入类型,这样的比正则要有以下几点优势: 1. 开发更简单,执行速度高效。 2. 输入法默认会根据情况变动,比如说设置为numeric后输入法会自动仅显示数字,不会出现Qwerty中的字母。 下面我们通过EditText的layout xml文件中的相关属性来实现: 1. 密码框属性 android:password="true" 这条可以让EditText显示的内容自动为 星号,输入时内容会在1秒内变成*字样。 2. 纯数字 android:numeric="true" 这条可以让输入法自动变为数字输入键盘,同时仅允许0-9的数字输入 3. 仅允许 android:capitalize="cwj1987" 这样仅允许接受输入cwj1987,一般用于密码验证 下面是一些扩展的风格属性 android:editable="false" 设置EditText不可编辑 android:singleLine="true" 强制输入的内容在单行 android:ellipsize="end" 自动隐藏尾部溢出数据,一般用于文字内容过长一行无法全部显示时。 有关EditText内部的一些bug和样式,Android123将在以后的文章介绍到,感兴趣的网友可以主要分析下它的基类TextView实现代码。
WebView使用技巧和介绍 Android开发技术
在Android的所有控件中,WebView的功能是最强大的作为直接从android.webkit.Webview实现的类可以拥有浏览器所有的功能,Webview可以让开发人员从Java转向html+js这样的方式,如果你掌握ajax可以方便通过这种方式配合远端server来实现一些内容。 Webview中设置字体,可以使用 WebView.getSettings().setDefaultFontSize() 方法,设置屏幕的缩放级别可以使用 WebView.getSettings().setDefaultZoom() 来实现。 目前在Android 2.2中已经加入了Adobe Flash Player功能,我们可以WebView.getSettings().setPluginsEnabled(true); 设置允许Gears插件来实现网页中的Flash动画显示。 Webview可以帮助我们设计内嵌专业的浏览器,相对于部分以省流量需要服务器中转的那种 html解析器来说有本质的区别,因为它们没有JavaScript脚本解析器,Android123认为未来这种方式不会有什么发展空间,代表软件Opera Mini以及国内的一些名为“XX浏览器”。 在WebView中显示AlertDialog窗口提示,这里我们通过JavaScript脚本直接互通,在一个WebView中直接显示js的alert可以重写onJsAlert方法即可。 public boolean onJsAlert(WebView view, String url, String message, final android.webkit.JsResult result) { new AlertDialog.Builder(myApp) .setTitle("Android开发网") .setMessage(message) //从形参中传递的,同时还有String url等等 .setPositiveButton(android.R.string.ok, new AlertDialog.OnClickListener() { public void onClick(DialogInterface dialog, int […]
Android程序完全退出的三种方法 Android开发技术
很多网友可能发现自己的Android程序有很多Activity,比如说主窗口A,调用了子窗口B,在B中如何关闭整个Android应用程序呢? 这里Android123给大家三种比较简单的方法实现。 首先要说明在B中直接使用finish(),接下来手机显示的还是主窗口A,所以一起来看看Android开发网是如何实现的吧. 1. Dalvik VM的本地方法 android.os.Process.killProcess(android.os.Process.myPid()) //获取PID,目前获取自己的也只有该API,否则从/proc中自己的枚举其他进程吧,不过要说明的是,结束其他进程不一定有权限,不然就乱套了。 System.exit(0); //常规java、c#的标准退出法,返回值为0代表正常退出 2. 任务管理器方法 首先要说明该方法运行在Android 1.5 API Level为3以上才可以,同时需要权限android.permission.RESTART_PACKAGES,我们直接结束自己的package即可,直接使用ActivityManager类的restartPackage方法即可,参数为package name,该类通过getSystemService(Context.ACTIVITY_SERVICE)来实例化ActivityManager对象,这种方法系统提供的,但需要显示声明权限,所以使用中需要综合考虑。 3. 根据Activity的声明周期 我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在A窗口打开B窗口时在Intent中直接加入标志Intent.FLAG_ACTIVITY_CLEAR_TOP,这样开启B时将会清除该进程空间的所有Activity。 在A窗口中使用下面的代码调用B窗口 Intent intent = new Intent(); intent.setClass(Android123.this, CWJ.class);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //注意本行的FLAG设置startActivity(intent); 接下来在B窗口中需要退出时直接使用finish方法即可全部退出。 如果您有更好的建议可以联系 android123@163.com 我们及时补充。
自定义ListView行间的分割线 Android开发技术
在Android平台中系统控件提供了灵活的自定义选项,所有基于ListView或者说AbsListView实现的widget控件均可以通过下面的方法设置行间距的分割线,分割线可以自定义颜色、或图片。 在ListView中我们使用属性 android:divider="#FF0000" 定义分隔符为红色,当然这里值可以指向一个drawable图片对象,如果使用了图片可能高度大于系统默认的像素,可以自己设置高度比如6个像素 android:dividerHeight="6px" ,Android开发网提示当然在Java中ListView也有相关方法可以设置。
EditText中显示隐藏Android输入法窗口 Android开发技术
细心的网友可能发现我们在使用EditText时,会自动的弹出输入法面板,这里我们提供多种方法可以不让程序默认升起IME窗口。 1.让EditText失去焦点,使用EditText的clearFocus方法 2. 强制隐藏Android输入法窗口,在IME类中我们通过 InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 实例化输入法控制对象,通过hideSoftInputFromWindow来控制,其中第一个参数绑定的为需要隐藏输入法的EditText对象,比如imm.hideSoftInputFromWindow(etAndroid123.getWindowToken(), 0);
获取和设置ListView的选择项 Android开发技术
获取当前选中项 int curPos = listView.getFirstVisiblePosition(); 当然是用getItemAtPosition(int nPos)方法也可以 ,设置当前选择位置 listView.setSelectedPosition(lastPos); 对于基于AbsListView为基类的ListView等控件均可以使用这种方法。

