怎样释放Android手机存储空间

怎样释放Android手机存储空间

算法语言 7个月前 (02-23) 浏览: 170 评论: 0

Android应用在运行之中会产生一些数据,比如图片的缓存,数据库文件,配置文件等等。我们开发时可能会有这样的一个需求清除应用内缓存的数据,可以让用户选择删除应用内产生的数据,这也是比较人性化的设计点。过多的缓存会占用手机的存储空间,据说也会降低手机的IO性能。 下面这是简书Android APP中提供了清除缓存的设计: 那么Android应用在运行中会产生哪些数据呢?它们都被存放在哪里?然后我们根据产生数据的位置实现清除功能 首先简单讲讲Android的四种数据存储方式 1、SharePreferenc 一种轻型的数据存储方式,实际上是基于XML文件存储的“key-value”键值对数据;通常用来存储程序的一些配置信息。 SharePreference的存储目录: 其存储在“data/data/程序包名/shared_prefs目录下。 SharePreference修改和存储数据 根据Context的getSharedPrerences(key, [模式])方法获取SharedPreference对象; 利用SharedPreference的editor()方法获取Editor对象; 通过Editor的putXXX()方法,将键值对存储数据; 通过Editor的commit()方法将数据提交到SharedPreference内 2、SQLite SQLite是一个轻量级关系型数据库,既然是关系型数据库,那操作起来其实跟mysql、sql server差不多的。 Android提供了强大数据库管理库,同时也支持运行哦原生命令,实现数据库的增删改查 3、 File Android中可以在设备本身的存储设备或外接的存储设备中创建用于保存数据的文件。在默认状态下,文件是不能在不同程序间共享的。 File可以通过FileInputStream和FileOutputStream对文件进行操作。 4、ContentProvider ContentProvider相对于其它的方式比较复杂,当然其功能相对于其它的方式也是革命性的改变。它能够实现跨应用之间的数据操作。利用ContentResolver对象的delete、update、insert、query等方法去操ContentProvider的对象,让ContentProvider对象的方法去对数据操作。 实现方式为: 在A程序中定义一个ContentProvider,重载其增删查改等方法; 在A程序中的AndroidManifest.xml中注册ContentProvider; 在B程序中通过ContentResolver和Uri来获取ContentProvider的数据,同样利用Resolver的增删查改方法来获得和处理数据 Android应用的数据存储路径 应用内数据的所有路径和对应的数据清除代码: /data/data/com.xxx.xxx/cache - 应用内缓存(注:对应方法getCacheDir() )   /data/data/com.xxx.xxx/databases - 应用内数据库   /data/data/com.xxx.xxx/shared_prefs - 应用内配置文件   /data/data/com.xxx.xxx/files - 应用内文件(注:对应方法getFilesDir())   由于Android应用数据存储的权限比较宽泛,一个Android应用几乎可以在SD卡任意位置创建一个目录和文件,所以上面的几个存储路径只是Android应用最基本的存储路径。更多的清除代码实现在下面的清除工具类中将于更详细的讲解 清除工具类的代码实现 为了方便使用,下面时我封装好的数据清除工具类:   系统设置应用管理的”清除数据“的实现方法 在Android系统设置的应用管理中,提供了”清除数据“的功能,这一功能对应用数据的清除更加彻底,我们可以在代码中实现类似的需求,不过下面代码的执行将使应用退出:  

【图片去霾算法实践】NDK下二维数组的传递

【图片去霾算法实践】NDK下二维数组的传递

算法语言 8个月前 (01-16) 浏览: 232 评论: 1

最近看到了一篇关于图片“去霾算法”的文章,一下子就有了兴趣,所以想着能不能实现。由于数学能力捉急,无法理解文章的思想和相关论文。于是在Github上找到了相关的Java代码,算法的效果十分明显: 去霾前的图片 去霾算法处理后的图片 不知道是不是算法太复杂,还是Java效率相对较低的缘故,一个3M的JPG图片处理下来需要近20秒的时间。 效果明显的算法让我萌生了开发一款去霾相机的想法,为了获得更快的处理速度,在研究Java去霾算法代码后,我决定将其写成C++代码,然后通过NDK(Android原生开发)移植到Android平台。 项目的基本思想是在Android/Java下获得图片的Bitmap将其像素点转成二维的int二维数组,然后将int二维数组传入JNI层,交给NDK层C++代码处理,NDK层处理完毕后返回去霾后的int二维数组,由Java层转成Bitmap重新显示或保存。 经过一天的奋斗,我终于实现了用C++代码实现“去霾”算法并顺利移植到Android原生开发中。效果已实现,目前还有很多BUG,图片大小稍大时算法耗费的时间和内存过大. Android 图片去霾 本文预计会写一个系列,后续根据情况可能会开源。如果你对去霾算法实践感兴趣,可以关注我的简书和博客:http://wangbaiyuan.cn ,后续将持续更新 本篇文章介绍NDK和Java层怎样互传二维数组 NDK->C++ ndkArray[mHeight][mWidth]->cppArray[mHeight][mWidth]   C++->NDK cppArray[mHeight][mWidth]->ndkArray[mHeight][mWidth]  

一个简单的局域网UDP实时视频

一个简单的局域网UDP实时视频

算法语言 1年前 (2016-04-12) 浏览: 717 评论: 1

之前一直有打算做一个局域网上基于UDP通信的视频通话软件,一直不知道视频流在网络上以怎样的形式传输,虽然知道几个视频流的编码格式,但是其实一直没有进行付诸实践; 最近在学习安卓手表开发时,在github上看到一个将手机的实时视频传输到手表的项目,发现一个似乎低级但是在局域网应该还是比较实用的局域网视频传输方法:直接将从摄像头获取的图像压缩以后进行发送。本项目GitHub主页:https://github.com/retravel/AndroidRealTimeVideo 获取摄像头实时图片、UDP发送图片  UDP server  

百度地图API位置偏移的校准算法

百度地图API位置偏移的校准算法

算法语言 软件开发 2年前 (2016-02-17) 浏览: 2012 评论: 0

在开始使用百度地图API进行开发时可能会遇到一件相当奇怪的事情,使用百度定位的经纬度在地图上显示相当不准确,这一问题我在微信开发和安卓开始时都遇到过。第一次使用百度地图api获取位置并在地图上显示是在微信开发的时候,那是不知道具体原因无奈在微信获取的地理位置上加了一个偏移量进行校准,虽能勉强解决,但是不太准确。后来在安卓开始也同样遇到了这个问题,才发现百度地图API定位偏移已经不是一个偶然问题了。 百度地图API定位偏移的原因 以下来自互联网: 一、坐标体系 首先我们要明白,开发者能接触到哪些坐标体系呢? 第一种分类: 1、 GPS,WGS-84,原始坐标体系。一般用国际标准的GPS记录仪记录下来的坐标,都是GPS的坐标。很可惜,在中国,任何一个地图产品都不允许使用GPS坐标,据说是为了保密。GPS坐标形式如图,度分秒形式的经纬度:   2、 GCJ-02,国测局02年发布的坐标体系。又称“火星坐标”。在中国,必须至少使用GCJ-02的坐标体系。比如谷歌,腾讯,高德都在用这个坐标体系。GCJ-02也是国内最广泛使用的坐标体系。 3、 其他坐标体系。一般都是由GCJ-02进过偏移算法得到的。这种体系就根据每个公司的不同,坐标体系都不一样了。比如,百度和搜狗就使用自己的坐标体系,与其他坐标体系不兼容。 第二种分类: 首先明白,所有坐标体系的原点,都是非洲。 1、 经纬度。这个是球面坐标,对于北京来说,就是(116.38817139.935961)这样的坐标。比如腾讯、高德、百度都是这样的经纬度坐标。谷歌是经纬度顺序写反的经纬度坐标。 如果是度分秒坐标,需要进行转换,才能得到这样的经纬度坐标。详见坐标转换。 2、 墨卡托坐标。平面坐标,相当于是直线距离,数字一般都比较大,像这样的。(215362.00021333335 99526.00034912192) 墨卡托坐标,主要用于程序的后台计算。直线距离嘛,加加减减几乎计算方便。 搜狗地图API就是直接使用的墨卡托坐标。 二、坐标转换 在各种web端平台,或者高德、腾讯、百度上取到的坐标,都不是GPS坐标,都是GCJ-02坐标,或者自己的偏移坐标系。 比如,你在谷歌地图API,高德地图API,腾讯地图API上取到的,都是GCJ-02坐标,他们三家都是通用的,也适用于大部分地图API产品,以及他们的地图产品。 例外,百度API上取到的,是BD-09坐标,只适用于百度地图相关产品。 例外,搜狗API上取到的,是搜狗坐标,只适用于搜狗地图相关产品。 例外,谷歌地球,google earth上取到的,是GPS坐标,而且是度分秒形式的经纬度坐标。在国内不允许使用。必须转换为GCJ-02坐标。 1、度分秒坐标转换为经纬度 比如,在GPS记录仪,或者google earth上采集到的是39°31'20.51,那么应该这样换算,31分就是31/60度,20.51秒就是20.51/3600度,结果就是39 + 31/60 + 20.51/3600 度。 2、 GPS转换为GCJ-02坐标 谷歌,高德,腾讯的地图API官网上,都不直接提供这样的坐标转换。如果要得到GCJ-02坐标,最好在他们的地图上直接取点,或者通过地址解析得到。(这个工具我后续会贴出来的。我就爱干这样的事情,哈哈。) 不过,在网上搜到了这样的接口,该接口的type=1就是GPS转到GCJ-02的墨卡托坐标。请大家对接口保密,哈哈。详见: http://map.sogou.com/api/documentation/javascript/api2.5/interface_translate.html#late_intro 3、GCJ-02与BD-09之间互转 国测局GCJ-02坐标体系(谷歌、高德、腾讯),与百度坐标BD-09体系的转换,在CSDN上有很详细的讲解: http://blog.csdn.net/coolypf/article/details/8569813 不过也有更简单的算法,线性算法(lat和lng是经纬度,球面坐标): To_B是转到百度,To_G是转到GCJ-02。 var TO_BLNG = function(lng){return lng+0.0065;}; var TO_BLAT = function(lat){return lat+0.0060;}; var TO_GLNG = function(lng){return lng-0.0065;}; var TO_GLAT = function(lat){return lat-0.0060;}; 4、经纬纬度转成墨卡托 网上也有详细讲解: http://bbs.esrichina-bj.cn/esri/viewthread.php?tid=78245 (大家发现没,高德是api,腾讯和百度是mapapi,说明什么?) 三、坐标偏移 如果您的坐标在转换之后,还有偏移,那么考虑以下几个方面。 A、原始坐标系弄错,比如以为自己是GPS坐标,但其实已经是GCJ-02坐标。 解决方案:请确保采集到的数据是哪个坐标体系,需要转换到哪个坐标系,再进行坐标转换。 B、原始坐标准确度不够 解决方案:如果您是GPS坐标,请确保采集GPS数据时,搜到至少4颗以上的卫星。并且GPS数据准不准,还取决于周围建筑物的高度,越高越不准,因为有遮挡。 如果本来就是GCJ-02坐标,在不同地图放大级别的时候,看到的地方可能不一样。比如你在地图级别4(国家)取到的坐标,放大到地图12级(街道)时,坐标就偏了。请确保在地图最大放大级别时,拾取坐标。 C、度分秒的概念混淆 比如,在google earth上采集到的是39°31'20.51,那么应该这样换算,31分就是31/60度,20.51秒就是20.51/3600度,结果就是39 + 31/60 + 20.51/3600 度。 D、经纬度顺序写反了 有些公司(比如高德,百度,腾讯)是先经度,再纬度,即Point(lng lat)。但谷歌坐标的顺序恰好相反,是(lat lng)。 相关问题的百度解释:http://developer.baidu.com/map/question.htm 百度地图API位置偏移的校准算法 C++算法  

Android模拟点击按钮

Android模拟点击按钮

算法语言 软件开发 2年前 (2015-10-02) 浏览: 527 评论: 0

在安卓开发过程中,常常会出现在不同的环境的情况下执行相同的操作,当然我们很容易想到的方法就是将相同的操作抽出来放在一个函数中,在执行相同或者类似的操作中只需要届时运行函数即可。如果执行的函数在不同的类或者activity(当然activity也是类),我们只需要将函数的访问等级定义为public static即可。 上面的相信即使是最基础的开发者都知道,似乎极客人在此没有什么说的必要。在一个类A中调用另一个类B的公用静态方法b时,如果方法b中使用了类B的其他变量c、d、f等等,在修改方法b为公用静态时还要将类B的变量c、d、f一并修改为静态变量,因为静态方法不允许调用非静态变量,这一改往往牵一发而动全身。 有时候我们常常会恰巧遇到这种情况:类B中执行的操作就是点击Activity某一个按钮所进行的操作。比如我们在开发一个安卓app时常常有一个应用更新的功能,进入MainActivity时,app往往在后台神不知鬼不觉地执行一下检查更新的操作,同时在APP的“关于”页面我们还能让用户手动点击button然后“检查更新”。其实这两个检查更新的执行动作是一模一样的,如果重复写在两个Activity中将十分麻烦。,这个时候我们不妨尝试一下安卓按钮的模拟点击,实现代码模拟人手点击按钮。 代码: 调用performClick()可引发 Click 事件

Android(Java)解析有道翻译API-Json数据

Android(Java)解析有道翻译API-Json数据

软件开发 2年前 (2015-08-24) 浏览: 965 评论: 0

由于百度翻译、有道翻译等翻译服务都开放了自己的API,开发者可以使用它们提供的API很简单就能开发出自己的翻译软件。自己开发的软件可能在功能上不及它们强大,但是翻译的结果是一样的,同时不会内置其它偷跑流量的进程,同时界面也相对简洁,随心所欲地进行修改。 首先在有道API进行申请API ID和KEY后,将下列程序中clientID和clientSecret替换为ID和KEY,通过GET请求获得字符串进行解析。下面是我使用java解析JSON数据的代码: Android(Java)解析有道翻译API-Json数据  

Android开发权限大全

Android开发权限大全

软件开发 2年前 (2015-08-23) 浏览: 215 评论: 0

在安卓开发中,应用在访问手机硬件资源如SD读写、网络访问、定位、调用摄像头,或者联系人、打电话等系统服务时都要向android系统申请权限。权限机制有利于保护使用者的手机安全。曾经碰到许多木马软件在后台给你发短信,神不知鬼不觉就扣了话费。这种木马软件能发送短信的前提就是向android系统申请了发送短信的权限。现在许多的安全软件都有禁止应用权限的功能,即使 手机应用在申请了访问一些手机资源的权限也可以强行禁止访问。 对于开发者,为应用申请权限的方法就是在项目清单文件中<manifest />添加如: <uses-permission android:name="android.permission.CALL_PHONE(权限名)" /> 下面是安卓开发应用权限大全: Android开发权限大全 访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限 获取错略位置 android.permission.ACCESS_COARSE_LOCATION,通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米 获取精确位置 android.permission.ACCESS_FINE_LOCATION,通过GPS芯片接收卫星的定位信息,定位精度达10米以内 访问定位额外命令 android.permission.ACCESS_LOCATION_EXTRA_COMMANDS,允许程序访问额外的定位提供者指令 获取模拟定位信息 android.permission.ACCESS_MOCK_LOCATION,获取模拟定位信息,一般用于帮助开发者调试应用 获取网络状态 android.permission.ACCESS_NETWORK_STATE,获取网络信息状态,如当前的网络连接是否有效 访问Surface Flinger android.permission.ACCESS_SURFACE_FLINGER,Android平台上底层的图形显示支持,一般用于游戏或照相机预览界面和底层模式的屏幕截图 获取WiFi状态 android.permission.ACCESS_WIFI_STATE,获取当前WiFi接入的状态以及WLAN热点的信息 账户管理 android.permission.ACCOUNT_MANAGER,获取账户验证信息,主要为GMail账户信息,只有系统级进程才能访问的权限 验证账户 android.permission.AUTHENTICATE_ACCOUNTS,允许一个程序通过账户验证方式访问账户管理ACCOUNT_MANAGER相关信息 电量统计 android.permission.BATTERY_STATS,获取电池电量统计信息 绑定小插件 android.permission.BIND_APPWIDGET,允许一个程序告诉appWidget服务需要访问小插件的数据库,只有非常少的应用才用到此权限 绑定设备管理 android.permission.BIND_DEVICE_ADMIN,请求系统管理员接收者receiver,只有系统才能使用 绑定输入法 android.permission.BIND_INPUT_METHOD ,请求InputMethodService服务,只有系统才能使用 绑定RemoteView android.permission.BIND_REMOTEVIEWS,必须通过RemoteViewsService服务来请求,只有系统才能用 绑定壁纸 android.permission.BIND_WALLPAPER,必须通过WallpaperService服务来请求,只有系统才能用 使用蓝牙 android.permission.BLUETOOTH,允许程序连接配对过的蓝牙设备 蓝牙管理 android.permission.BLUETOOTH_ADMIN,允许程序进行发现和配对新的蓝牙设备 变成砖头 android.permission.BRICK,能够禁用手机,非常危险,顾名思义就是让手机变成砖头 应用删除时广播 android.permission.BROADCAST_PACKAGE_REMOVED,当一个应用在删除时触发一个广播 收到短信时广播 android.permission.BROADCAST_SMS,当收到短信时触发一个广播 连续广播 android.permission.BROADCAST_STICKY,允许一个程序收到广播后快速收到下一个广播 WAP PUSH广播 android.permission.BROADCAST_WAP_PUSH,WAP PUSH服务收到后触发一个广播 拨打电话 android.permission.CALL_PHONE,允许程序从非系统拨号器里输入电话号码 通话权限 android.permission.CALL_PRIVILEGED,允许程序拨打电话,替换系统的拨号器界面 拍照权限 android.permission.CAMERA,允许访问摄像头进行拍照 改变组件状态 android.permission.CHANGE_COMPONENT_ENABLED_STATE,改变组件是否启用状态 改变配置 android.permission.CHANGE_CONFIGURATION,允许当前应用改变配置,如定位 改变网络状态 android.permission.CHANGE_NETWORK_STATE,改变网络状态如是否能联网 改变WiFi多播状态 android.permission.CHANGE_WIFI_MULTICAST_STATE,改变WiFi多播状态 改变WiFi状态 android.permission.CHANGE_WIFI_STATE,改变WiFi状态 清除应用缓存 android.permission.CLEAR_APP_CACHE,清除应用缓存 清除用户数据 android.permission.CLEAR_APP_USER_DATA,清除应用的用户数据 底层访问权限 android.permission.CWJ_GROUP,允许CWJ账户组访问底层信息 手机优化大师扩展权限 android.permission.CELL_PHONE_MASTER_EX,手机优化大师扩展权限 控制定位更新 android.permission.CONTROL_LOCATION_UPDATES,允许获得移动网络定位信息改变 删除缓存文件 android.permission.DELETE_CACHE_FILES,允许应用删除缓存文件 删除应用 android.permission.DELETE_PACKAGES,允许程序删除应用 电源管理 android.permission.DEVICE_POWER,允许访问底层电源管理 应用诊断 android.permission.DIAGNOSTIC,允许程序到RW到诊断资源 禁用键盘锁 android.permission.DISABLE_KEYGUARD,允许程序禁用键盘锁 转存系统信息 android.permission.DUMP,允许程序获取系统dump信息从系统服务 状态栏控制 android.permission.EXPAND_STATUS_BAR,允许程序扩展或收缩状态栏 工厂测试模式 android.permission.FACTORY_TEST,允许程序运行工厂测试模式 使用闪光灯 android.permission.FLASHLIGHT,允许访问闪光灯 强制后退 android.permission.FORCE_BACK,允许程序强制使用back后退按键,无论Activity是否在顶层 访问账户Gmail列表 android.permission.GET_ACCOUNTS,访问GMail账户列表 获取应用大小 android.permission.GET_PACKAGE_SIZE,获取应用的文件大小 获取任务信息 android.permission.GET_TASKS,允许程序获取当前或最近运行的应用 允许全局搜索 android.permission.GLOBAL_SEARCH,允许程序使用全局搜索功能 硬件测试 android.permission.HARDWARE_TEST,访问硬件辅助设备,用于硬件测试 注射事件 android.permission.INJECT_EVENTS,允许访问本程序的底层事件,获取按键、轨迹球的事件流 安装定位提供 android.permission.INSTALL_LOCATION_PROVIDER,安装定位提供 安装应用程序 android.permission.INSTALL_PACKAGES,允许程序安装应用 内部系统窗口 android.permission.INTERNAL_SYSTEM_WINDOW,允许程序打开内部窗口,不对第三方应用程序开放此权限 访问网络 android.permission.INTERNET,访问网络连接,可能产生GPRS流量 结束后台进程 android.permission.KILL_BACKGROUND_PROCESSES,允许程序调用killBackgroundProcesses(String).方法结束后台进程 管理账户 android.permission.MANAGE_ACCOUNTS,允许程序管理AccountManager中的账户列表 管理程序引用 android.permission.MANAGE_APP_TOKENS,管理创建、摧毁、Z轴顺序,仅用于系统 高级权限 android.permission.MTWEAK_USER,允许mTweak用户访问高级系统权限 社区权限 android.permission.MTWEAK_FORUM,允许使用mTweak社区权限 软格式化 android.permission.MASTER_CLEAR,允许程序执行软格式化,删除系统配置信息 修改声音设置 android.permission.MODIFY_AUDIO_SETTINGS,修改声音设置信息 修改电话状态 android.permission.MODIFY_PHONE_STATE,修改电话状态,如飞行模式,但不包含替换系统拨号器界面 格式化文件系统 android.permission.MOUNT_FORMAT_FILESYSTEMS,格式化可移动文件系统,比如格式化清空SD卡 挂载文件系统 android.permission.MOUNT_UNMOUNT_FILESYSTEMS,挂载、反挂载外部文件系统 允许NFC通讯 android.permission.NFC,允许程序执行NFC近距离通讯操作,用于移动支持 永久Activity android.permission.PERSISTENT_ACTIVITY,创建一个永久的Activity,该功能标记为将来将被移除 处理拨出电话 android.permission.PROCESS_OUTGOING_CALLS,允许程序监视,修改或放弃播出电话 读取日程提醒 android.permission.READ_CALENDAR,允许程序读取用户的日程信息 读取联系人 android.permission.READ_CONTACTS,允许应用访问联系人通讯录信息 屏幕截图 android.permission.READ_FRAME_BUFFER,读取帧缓存用于屏幕截图 读取收藏夹和历史记录 com.android.browser.permission.READ_HISTORY_BOOKMARKS,读取浏览器收藏夹和历史记录 读取输入状态 android.permission.READ_INPUT_STATE,读取当前键的输入状态,仅用于系统 读取系统日志 android.permission.READ_LOGS,读取系统底层日志 读取电话状态 android.permission.READ_PHONE_STATE,访问电话状态 读取短信内容 android.permission.READ_SMS,读取短信内容 读取同步设置 android.permission.READ_SYNC_SETTINGS,读取同步设置,读取Google在线同步设置 读取同步状态 android.permission.READ_SYNC_STATS,读取同步状态,获得Google在线同步状态 重启设备 android.permission.REBOOT,允许程序重新启动设备 开机自动允许 android.permission.RECEIVE_BOOT_COMPLETED,允许程序开机自动运行 接收彩信 android.permission.RECEIVE_MMS,接收彩信 接收短信 android.permission.RECEIVE_SMS,接收短信 接收Wap Push android.permission.RECEIVE_WAP_PUSH,接收WAP PUSH信息 录音 android.permission.RECORD_AUDIO,录制声音通过手机或耳机的麦克 排序系统任务 android.permission.REORDER_TASKS,重新排序系统Z轴运行中的任务 结束系统任务 android.permission.RESTART_PACKAGES,结束任务通过restartPackage(String)方法,该方式将在外来放弃 发送短信 android.permission.SEND_SMS,发送短信 设置Activity观察其 android.permission.SET_ACTIVITY_WATCHER,设置Activity观察器一般用于monkey测试 设置闹铃提醒 com.android.alarm.permission.SET_ALARM,设置闹铃提醒 设置总是退出 android.permission.SET_ALWAYS_FINISH,设置程序在后台是否总是退出 设置动画缩放 android.permission.SET_ANIMATION_SCALE,设置全局动画缩放

androidStudio开发安卓应用设置版本号

androidStudio开发安卓应用设置版本号

软件开发 2年前 (2015-08-22) 浏览: 6526 评论: 0

Android:versionCode和android:versionName 在eclipse中,修改我们开发的应用的版本号只需要在清单文件AndroidManifest.xml中manifest 标签节点中加入android:versionCode和android:versionName的值即可设置应用的版本号。如以下代码: 上述代码表示应用的包名为cn.wangbaiyuan.translate,版本号code:2,版本名Name:1.1;前者一般是给开发者比较版本是否有升级用的,后者是展示给用户看的。 在Eclipse中使用修改AndroidManifest.xml修改版本号是完全没有问题的,但是极客人在Android Studio上试过仅仅修改AndroidManifest.xml内容是没有效果的,虽然我把android:versionName赋值为1.1,但是在手机上显示的版本号始终是之前的1.0.。 androidStudio开发安卓应用设置版本号 后来才发现是Android Studio中build.gradle(Module:app)配置文件同样设置了它的版本号,在和AndroidManifest.xml填写的版本号冲突的情况下,编译后的APK使用了build.gradle(Module:app)里面的配置: build.gradle(Module:app) 解决方法 在项目文件夹下找到build.gradle(Module:app)文件,删除defaultConfig里面VersionCode 和VersionName这两行;或者直接在这里修改版本号。

安卓实现倒计时按钮效果

安卓实现倒计时按钮效果

前端与界面 算法语言 软件开发 2年前 (2015-08-20) 浏览: 224 评论: 5

安卓手机管家类软件,在对手机的应用权限进行管理时常常会跳出这样的弹出框。 这样的按钮出现在很多场合,系统会给一定时间比如30s提示用户选择操作“禁止”还是“允许”,并设置倒计时,并在倒计时为零后系统会为用户选择默认行为执行。这个设计十分智能化,在无人使用手机时实现了自动化处理。下面介绍使用handler和Runnable实现这样的按钮是效果: 安卓实现倒计时按钮效果 在极客人的一篇转载文章《Android使用线程更新UI的几种方法》中,提到了用在Android里使用 Runnable和 Handler.PostDelayed(Runnable,Time) 定时更新界面。下面我讲解的便是使用Runnable和 Handler.PostDelayed(Runnable,Time) 实现倒计时效果的按钮。 假设点击倒计时按钮的动作为运行函数 function(),按钮变量名为forbiddenBtn下面是实现的代码: 原理 上面代码实现的原理是使用timeHander.postDelayed(context,int)函数定时调用一个Runnable呢,这里是延时1000ms执行一下timerRunnable。调用上述倒计时的代码为: 即立即执行timerRunnable;当执行timerRunnable时,由于second初始化为30s,if语句执行else部分,second在button上显示出来后执行减1,然后通过timerHandler.postDelayed(this, 1000); 在1秒后再次执行timerRunnable,此时second=29……依此类推,当second=0时,就会执行function(),执行倒计时归零后的默认操作,

Android使用线程更新UI的几种方法

Android使用线程更新UI的几种方法

算法语言 软件开发 2年前 (2015-08-18) 浏览: 180 评论: 0

方法一:(java习惯,在android不推荐使用) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 可以实现功能,刷新UI界面。但是这样是不行的,因为它违背了单线程模型:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。 方法二:(Thread+Handler) 查阅了文档和apidemo后,发觉常用的方法是利用Handler来实现UI线程的更新的。 Handler来根据接收的消息,处理UI更新。Thread线程发出Handler消息,通知更新UI。   方法三:(java习惯,不推荐) 在Android平台中需要反复按周期执行方法可以使用Java上自带的TimerTask类,TimerTask相对于Thread来说对于资源消耗的更低,除了使用Android自带的AlarmManager使用Timer定时器是一种更好的解决方法。 我们需要引入import java.util.Timer; 和 import java.util.TimerTask;   方法四:(TimerTask + Handler) 实际上这样做是不行的,这跟Android的线程安全有关!应该通过配合Handler来实现timer功能的!   方法五:( Runnable + Handler.postDelayed(runnable,time) ) 在Android里定时更新 UI,通常使用的是 java.util.Timer, java.util.TimerTask, android.os.Handler组合。实际上Handler 自身已经提供了定时的功能。   然后在其他地方调用 ================================================ 知识点总结补充: 很多初入Android或Java开发的新手对Thread、Looper、Handler和Message仍然比较迷惑,衍生的有HandlerThread、java.util.concurrent、Task、AsyncTask由于目前市面上的书籍等资料都没有谈到这些问题,今天就这一问题做更系统性的总结。我们创建的Service、Activity以及Broadcast均是一个主线程处理,这里我们可以理解为UI线程。但是在操作一些耗时操作时,比如I/O读写的大文件读写,数据库操作以及网络下载需要很长时间,为了不阻塞用户界面,出现ANR的响应提示窗口,这个时候我们可以考虑使用Thread线程来解决。 对于从事过J2ME开发的程序员来说Thread比较简单,直接匿名创建重写run方法,调用start方法执行即可。或者从Runnable接口继承,但对于Android平台来说UI控件都没有设计成为线程安全类型,所以需要引入一些同步的机制来使其刷新,这点Google在设计Android时倒是参考了下Win32的消息处理机制。  1. 对于线程中的刷新一个View为基类的界面,可以使用postInvalidate()方法在线程中来处理,其中还提供了一些重写方法比如postInvalidate(int left,int top,int right,int bottom) 来刷新一个矩形区域,以及延时执行,比如postInvalidateDelayed(long delayMilliseconds)或postInvalidateDelayed(long delayMilliseconds,int left,int top,int right,int bottom) 方法,其中第一个参数为毫秒  2. 当然推荐的方法是通过一个Handler来处理这些,可以在一个线程的run方法中调用handler对象的 postMessage或sendMessage方法来实现,Android程序内部维护着一个消息队列,会轮训处理这些,如果你是Win32程序员可以很好理解这些消息处理,不过相对于Android来说没有提供 PreTranslateMessage这些干涉内部的方法。 3. Looper又是什么呢? ,其实Android中每一个Thread都跟着一个Looper,Looper可以帮助Thread维护一个消息队列,但是Looper和Handler没有什么关系,我们从开源的代码可以看到Android还提供了一个Thread继承类HanderThread可以帮助我们处理,在HandlerThread对象中可以通过getLooper方法获取一个Looper对象控制句柄,我们可以将其这个Looper对象映射到一个Handler中去来实现一个线程同步机制,Looper对象的执行需要初始化Looper.prepare方法就是昨天我们看到的问题,同时推出时还要释放资源,使用Looper.release方法。 4.Message 在Android是什么呢? 对于Android中Handler可以传递一些内容,通过Bundle对象可以封装String、Integer以及Blob二进制对象,我们通过在线程中使用Handler对象的sendEmptyMessage或sendMessage方法来传递一个Bundle对象到Handler处理器。对于Handler类提供了重写方法handleMessage(Message msg) 来判断,通过msg.what来区分每条信息。将Bundle解包来实现Handler类更新UI线程中的内容实现控件的刷新操作。相关的Handler对象有关消息发送sendXXXX相关方法如下,同时还有postXXXX相关方法,这些和Win32中的道理基本一致,一个为发送后直接返回,一个为处理后才返回 . 5. java.util.concurrent对象分析,对于过去从事Java开发的程序员不会对Concurrent对象感到陌生吧,他是JDK 1.5以后新增的重要特性作为掌上设备,我们不提倡使用该类,考虑到Android为我们已经设计好的Task机制,这里不做过多的赘述,相关原因参考下面的介绍: 6. 在Android中还提供了一种有别于线程的处理方式,就是Task以及AsyncTask,从开源代码中可以看到是针对Concurrent的封装,开发人员可以方便的处理这些异步任务。

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

切换登录

注册