随着Android应用的不断增多,虽然Google一直不断的限制应用的底层执行力但是安全仍然存在问题,Android123作为开发杀毒软件出身的团队讲述下一般应用的安全可靠性问题。一般通过PackageManager的getPackageInfo获取该应用的PackageInfo信息来获取该程序的权限。 目前Android开发时相关的Permission定义在androidmanifest.xml中,PackageInfo类的permissions属性可以返回一个PermissionInfo[]的数组,这里可以详细处理安全问题,而常规的描述可以通过requestedPermissions属性返回的String[]数组来获取。
软件应用教程
ArrayList LinkedList Set HashMap介绍 Android开发技术
在Android开发中我们经常需要对数据进行分类和操作,对于轻量级的数据存储我们可能不需要动用SQLite或效率以及类库不完善的XML,由于SharedPreferences不具备数据枚举方法,如果仅仅是一个String或Int数组可以通过一个标记分割设计外,我们还是主要来看看Android或者说Java提供的基础数据类型辅助类ArrayList LinkedList Set HashMap的介绍,如果你熟悉C++的STL或Boost库可以略过本文。 在Java中提供了Collection和Map接口。其中List和Set继承了Collection接口;同时用Vector、ArrayList、LinkedList三个类实现List接口,HashSet、TreeSet实现Set接口。直接有HashTable、HashMap、TreeMap实现Map接口。 Vector基于Array的List,性能也就不可能超越Array,并且Vector是“sychronized”的,这个也是Vector和ArrayList的唯一的区别。 ArrayList:同Vector一样是一个基于Array的,但是不同的是ArrayList不是同步的。所以在性能上要比Vector优越一些。Android123提示大家适用于顺序性的查找 LinkedList:不同于前面两种List,它不是基于Array的,作为链表数据结构方式,所以不受Array性能的限制。当对LinkedList做添加,删除动作的时候只要更改nextNode的相关信息就可以实现了所以它适合于进行频繁进行插入和删除操作。这就是LinkedList的优势,当然对于元素的位置获取等方面就逊色很多。 List: 1. 所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。例如:[ tom,1,c ]; 2. 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ]; 3. 所有的List中可以有null元素,例如[ tom,null,1 ]; 4. 基于Array的List(Vector,ArrayList)适合查询,而LinkedList(链表)适合添加,删除操作。 虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是在HashMap的基础上来实现的,这个就是Set和List的根本区别。 HashSet:HashSet的存储方式是把HashMap中的Key作为Set的对应存储项,HashMap的key是不能有重复的。HashSet能快速定位一个元素,但是放到HashSet中的对象需要实现hashCode()方法0。 TreeSet:将放入其中的元素按序存放,这就要求你放入其中的对象是可排序的。TreeSet不同于HashSet的根本是TreeSet是有序的。它是通过SortedMap来实现的。 Set总结: 1. Set实现的基础是Map(HashMap); 2. Set中的元素是不能重复的,如果使用add(Object obj)方法添加已经存在的对象,则会覆盖前面的对象,不能包含两个元素e1、e2(e1.equals(e2))。 Map是一种把键对象和值对象进行关联的容器,Map有两种比较常用的实现: HashTable、HashMap和TreeMap。 HashMap也用到了哈希码的算法,以便快速查找一个键, TreeMap则是对键按序存放,因此它有一些扩展的方法,比如firstKey(),lastKey()等。 HashMap和Hashtable的区别。 […]
Android软件开发方向指导 Android开发技术
目前Google Android平台可能算是第一阶段的成功,但是给开发者的感觉仍然是雷声大雨点小,利润方面和iPhone App Store还相差甚远,下面Android123主要谈下未来发展趋势以及更高的盈利方法。 1. Android目前精品游戏相当稀少,总体游戏数量和质量远远少于iPhone主要原因是设备的消费群体问题,如果你的技术够硬,数据结构算法过关的话沉着冷静开发一款像样的游戏可以带来不小的收获。 2. 界面技术单一,未来的趋势仍然是3D开发,目前手机CPU已经达到了GHz级别,同时GPU和硬件加速都已经有了雏形,视觉冲击将是未来的主要竞争力所以OpenGL一定要学习牢固,如果你的数学和物理不好有必要先补充下。 3. 本地语言开发,未来在一些核心处理上仍然需要借助NDK的支持Native C++可以在3D OpenGL ES上有很重要的用处,对于视频编码等方面这都是托管语言无法表达的问题。
ConditionVariable Android线程同步 Android开发技术
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().
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 = […]
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" /> 三、账户安全声明 […]
自定义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等控件均可以使用这种方法。
TextView多行本文滚动轻松实现 Android开发技术
Android中我们为了实现文本的滚动可以在ScrollView中嵌入一个TextView,其实TextView自己也可以实现多行滚动的,毕竟ScrollView必须只能有一个直接的子类布局。只要在layout中简单设置几个属性就可以轻松实现 <TextView android:id="@+id/tvCWJ" android:layout_width="fill_parent" android:layout_height="wrap_content" android:scrollbars="vertical" <!–垂直滚动条 –> android:singleLine="false" <!–实现多行 –> android:maxLines="15" <!–最多不超过15行 –> android:textColor="#FF0000" /> 当然我们为了让TextView动起来,还需要用到TextView的setMovementMethod方法设置一个滚动实例,代码如下 TextView tvAndroid123 = (TextView)findViewById(R.id.tvCWJ); tvAndroid123.setMovementMethod(ScrollingMovementMethod.getInstance()); // Android开发网提示相关的可以查看SDK中android.text.method分支了解更多
Android中内嵌字体实现个性化 Android开发技术
在Android中我们的应用可以灵活的内嵌自己的字体文件,实现各个手机上可以正常的显示个性化文字,我们都知道TextView的setTypeface方法可以设置目标文字的显示特性,比如字体、颜色、粗体、斜体等。我们直接找一个TrueTypeFont的字体文件即.ttf,对于Win32系统的用户可以直接在Windows/fonts文件夹中能找到很多。比如微软雅黑就不错,可是体积太大,由于Android的Assets类有单个文件1MB体积的限制,我们先找个英文字体做测试。这里我们将字体文件android123.ttf放到工程的assets文件夹的fonts目录中。 Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/android123.ttf"); TextView tv = (TextView)findViewById(R.id.text); tv.setTypeface(tf); //设置TextView的风格 tv.setText("CWJ Test"); tv.setTextSize(12); tv.setTextColor(Color.RED);
Odex文件的作用以及介绍 Android开发技术
细心的网友可能发现Android的ROM中有很多odex文件,相对于APK中的dex文件而言这个odex有什么作用呢? Android123提示大家,如果你仔细观察会发现文件名时一一对应的,同时那些对应的apk文件中没有dex文件。这样做可以使其厂商保证一定的反盗版,因为没有没有dex文件的apk是无法正常安装的,而厂商直接将odex和不完整的apk文件放到手机rom固化到/system/bin中可以让一般用户无法正常导出使用。 很多网友可能想到的是合并odex和apk变成apk中包含dex文件的,这样合并后最终apk文件安装在/data/中,而rom存放时在/system/bin中,所以最终导致了用户可装在Android手机中的软件会变少,占用系统空间。 一、APK生成odex文件方法: 编译开源GIT上的build/tools/dexpreopt/dexopt-wrapper这个,使用dexopt-wrapper即可,操作步骤 将dexopt-wrapper放到/data/local目录中,使用adb shell执行linux命令行,使用cd命令进入/data/local目录, cd /data/local ./dexopt-wrapper android123.apk android123.odex 二、合并odex和 少dex的apk 为完整的apk文件 1. 下载 http://smali.googlecode.com/files/smali-1.2.2.jar 和 http://smali.googlecode.com/files/baksmali-1.2.2.jar,既然是需要盗版,还需要odex所在rom中的一些引用类,一般在 /system/framework 目录中 2 . 通过odex生成class文件 java -jar baksmali-1.2.2.jar -x android123.odex 执行完上面这行命令后,会生成一个out 文件夹里面是android123.odex的class文件。出现问题,根据提示可以从rom的 /system/framework 中的xxx.jar放到pc上的java环境变量中一起生成。 3. 通过class生成classes.dex 文件。 java -Xmx512M -jar smali-1.2.2.jar out -o classes.dex 4. 将classes.dex放到apk文件 […]
Android中Intent对应的category列表大全 Android开发技术
在Android中使用Intent对应的category列表最全版本如下,更新到了Android 2.2 API Level8,Android123提示注意后面部分固件必须相应版本才可以调用 Android 1.5、1.6 android.intent.category.ALTERNATIVE android.intent.category.BROWSABLE android.intent.category.DEFAULTandroid.intent.category.DEVELOPMENT_PREFERENCE android.intent.category.EMBED android.intent.category.HOME android.intent.category.INFO android.intent.category.LAUNCHER android.intent.category.MONKEY android.intent.category.OPENABLE android.intent.category.PREFERENCE android.intent.category.SELECTED_ALTERNATIVE android.intent.category.TAB Android 2.0,2.0.1,2.1 新增车座和充电座 android.intent.category.CAR_DOCK android.intent.category.DESK_DOCK Android 2.2 新增行车模式 android.intent.category.CAR_MODE
Android Intent大全更新到API Level8 Android开发技术
对于Android开发者而言Intent可以帮助我们快速的处理隐式调用,相关的action列表大全如下,可以帮助最近给Android123邮件的网友解决一些问题: Android 1.5 API Level3 android.intent.action.ALL_APPS android.intent.action.ANSWER android.intent.action.ATTACH_DATA android.intent.action.BUG_REPORT android.intent.action.CALL android.intent.action.CALL_BUTTON android.intent.action.CHOOSER android.intent.action.CREATE_LIVE_FOLDER android.intent.action.CREATE_SHORTCUT android.intent.action.DELETE android.intent.action.DIAL android.intent.action.EDIT android.intent.action.GET_CONTENT android.intent.action.INSERT android.intent.action.INSERT_OR_EDIT android.intent.action.MAIN android.intent.action.MEDIA_SEARCH android.intent.action.PICK android.intent.action.PICK_ACTIVITY android.intent.action.RINGTONE_PICKER android.intent.action.RUN android.intent.action.SEARCH android.intent.action.SEARCH_LONG_PRESS android.intent.action.SEND android.intent.action.SENDTO android.intent.action.SET_WALLPAPER android.intent.action.SYNC android.intent.action.SYSTEM_TUTORIAL android.intent.action.VIEW android.intent.action.VOICE_COMMAND android.intent.action.WEB_SEARCH android.net.wifi.PICK_WIFI_NETWORK android.settings.AIRPLANE_MODE_SETTINGS android.settings.APN_SETTINGS android.settings.APPLICATION_DEVELOPMENT_SETTINGS android.settings.APPLICATION_SETTINGS android.settings.BLUETOOTH_SETTINGS android.settings.DATA_ROAMING_SETTINGS android.settings.DATE_SETTINGS android.settings.DISPLAY_SETTINGS android.settings.INPUT_METHOD_SETTINGS android.settings.INTERNAL_STORAGE_SETTINGS android.settings.LOCALE_SETTINGS android.settings.LOCATION_SOURCE_SETTINGS android.settings.MANAGE_APPLICATIONS_SETTINGS android.settings.MEMORY_CARD_SETTINGS android.settings.NETWORK_OPERATOR_SETTINGS android.settings.QUICK_LAUNCH_SETTINGS […]
Android按键事件映射表和转义符对照 Android开发技术
很多开发者表示不知道如何在Android的layout布局文件中输入类似&这样的符号,下面Android123整理了下一些案件事件映射和转义符对照表,比如说 & 在layout.xml中应该\uff06同时,从下表可以看到&和7在键盘上是同一个位置。 KeyEvent.KEYCODE_UNKNOWN, KeyEvent.KEYCODE_SOFT_LEFT, KeyEvent.KEYCODE_SOFT_RIGHT, KeyEvent.KEYCODE_HOME, KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_CALL, KeyEvent.KEYCODE_ENDCALL, KeyEvent.KEYCODE_0 | (‘\uff09’ << SHIFT_FWCH), // ) KeyEvent.KEYCODE_1 | (‘\uff01’ << SHIFT_FWCH), // ! KeyEvent.KEYCODE_2 | (‘\uff20’ << SHIFT_FWCH), // @ KeyEvent.KEYCODE_3 | (‘\uff03’ << SHIFT_FWCH), // # KeyEvent.KEYCODE_4 | (‘\uffe5’ << SHIFT_FWCH), // $ – fullwidth Yuan KeyEvent.KEYCODE_5 | (‘\uff05’ << SHIFT_FWCH), // % KeyEvent.KEYCODE_6 […]
Android程序内存管理必读 Android开发技术
很多开发者都是从J2ME或J2EE上过来的,对于内存的使用和理解并不是很到位,Android开发网本次给大家一些架构上的指导,防止出现豆腐渣工程的出现。Android作为以Java语言为主的智能平台对于我们开发一些高性能和质量的软件来说了解Android程序内存管理机制是必须的。 Android的Dalvik VM在基础方面和Sun JVM没有什么大的区别仅仅是字节码的优化,我们要知道什么时候用gc什么时候用recycle以及到底用不用finalization,因为Java对内存的分配只需要new开发者不需要显示的释放内存,但是这样造成的内存泄露问题的几率反而更高。 1.对于常规开发者而言需要了解 Java的四种引用方式,比如强引用,软引用,弱引用以及虚引用。一些复杂些的程序在长期运行很可能出现类似OutOfMemoryError的异常。 2.并不要过多的指望gc,不用的对象可以显示的设置为空,比如obj=null,这里Android123提示大家,java的gc使用的是一个有向图,判断一个对象是否有效看的是其他的对象能到达这个对象的顶点,有向图的相对于链表、二叉树来说开销是可想而知。 3.Android为每个程序分配的对内存可以通过Runtime类的totalMemory() freeMemory() 两个方法获取VM的一些内存信息,对于系统heap内存获取,可以通过Dalvik.VMRuntime类的getMinimumHeapSize() 方法获取最小可用堆内存,同时显示释放软引用可以调用该类的gcSoftReferences() 方法,获取更多的运行内存。 4.对于多线程的处理,如果并发的线程很多,同时有频繁的创建和释放,可以通过concurrent类的线程池解决线程创建的效率瓶颈。 5. 不要在循环中创建过多的本地变量。 有关Android和Java的系统性能分析,Android123将在以后的文章中详细讲述如何调试Java分析内存泄露以及Android上的gdb调试器分析得出内存性能改进。

