您的位置:首页 > 移动开发 > Android开发

Android tips(二)-->Android比较有用的方法总结

2015-12-04 14:43 495 查看
转载请标明出处:一片枫叶的专栏

这里总结一些android开发过程中中常用方法,知识点等,参考自知乎,微博,等各网站,后期会不定时更新…

Throwable类中的getStackTrace()方法,根据这个方法可以得到函数的逐层调用地址,其返回值为StackTraceElement[],而StackTraceElement类,其中四个方法getClassName(),getFileName(),getLineNumber(),getMethodName()在调试程序打印Log时非常有用。具体可参考我的:Github项目解析(五)–>Android日志框架

android开发中可以使用UncaughtExceptionHandler定义全局异常捕获类,当发生异常情况后可统一处理逻辑。具体可参考我的:在Android中自定义捕获Application全局异常

View中的isShown()方法用于判断当前View是否是展示状态。当然了我们也可以通过getVisibility方法判断:

if (imageSource.getVisibility() == View.VISIBLE) {
...
}


Arrays类中的一系列关于数组操作的工具方法:binarySearch(),asList(),equals(),sort(),toString(),copyOfRange()等;Collections类中的一系列关于集合操作的工具方法:sort(),reverse()等;

android.text.format.Formatter类中formatFileSize(Context, long)方法,用来格式化文件Size(B → KB → MB → GB);

android.media.ThumbnailUtils类,用来获取媒体(图片、视频)缩略图;

String类中的format(String, Object…)方法,用来格式化strings.xml中的字符串;

View类中的三个方法:callOnClick(),performClick(),performLongClick(),用于触发View的点击事件;

TextUtils类中的isEmpty(CharSequence)方法,判断字符串是否为null或”“;

View类中的getDrawingCache()等一系列方法可以用于获取View显示的Bitmap对象;

Activity类其他生命周期回调方法:

onWindowFocusChanged(boolean):Activity获取或者是失去焦点时触发;

onNewIntent(intent):通过设置启动Activity tag为singleTop时触发;

onSaveInstanceState():回调Activity的onStop方法时就会触犯;

View类中获取组件位置的方法:

getLocationInWindow(int[]):用于获取组件在窗口中位置

getLocationOnScreen(int[]):用于获取组件屏幕中的位置

其中传递的参数是大小为2的一维int数组;

TextView类中的setTransformationMethod(TransformationMethod)方法,可用来实现“显示密码”功能;

TextWatcher接口,用来监听文本输入框内容的改变,可用来实现一系列具有特殊功能的文本输入框;在实际的使用过程中通常定义一个TextWatcherAdapter的抽象类,以便其他人在调用的时候不必重写接口中所有的方法;

ListView或GridView类中的setFastScrollEnabled(boolean)方法,用来设置快速滚动滑块是否可见,当然前提是item够多;

ViewPager的页面切换动画可以使用PageTransformer接口实现,主要是用setPageTransformer(boolean, PageTransformer)方法来进行设置;

apache提供的一系列jar包:commons-lang.jar,commons-collections.jar,commons-beanutils.jar等,里面很多方法可能是你曾经用几十几百行代码实现过的,但是执行效率或许要差很多,比如:ArrayUtils,StringUtils……;

AndroidTestCase类,Android单元测试,在AndroidStudio中使用非常方便;具体关于android studio中如何进行单元测试可参考我的:Android studio中的单元测试

ActivityLifecycleCallbacks接口,用于在Application类中监听各Activity的状态变化;

Context类中的createPackageContext(packageName, flags)方法,可用来获取指定包名应用程序的Context对象。

Activity.startActivities() 常用于在应用程序中间启动其他的多个Activity。

比如从Activity a跳转到Activity c,需要在Activity c返回的时候返回到Activity b,就可以调用该方法,启动Activity b和Activity c,这时候Activity c返回的时候就会直接返回到Activity b了。

Html.fromHtml() 用于生成一个Html,参数可以是一个字符串,但是它对渲染从 web 上获取的文字还是很不错的。

Build.VERSION_CODES 这个标明了当前的版本号,在处理兼容性问题的时候经常会用到.点进去可以看到各个版本的不同特性

LayoutInflater.from() 顾名思义,用于Inflate一个layout,参数是layout的id.这个经常写Adapter的人会用的比较多。

Context.getCacheDir() 获取缓存数据文件夹的路径,很简单但是知道的人不多,这个路径通常在SD卡上(这里的SD卡指的是广义上的SD卡,包括外部存储和内部存储)Adnroid/data/您的应用程序包名/cache/ 下面.测试的时候,可以去这里面看是否缓存成功.缓存在这里的好处是:不用自己再去手动创建文件夹,不用担心用户把自己创建的文件夹删掉,在应用程序卸载的时候,这里会被清空,使用第三方的清理工具的时候,这里也会被清空

ValueAnimator.reverse() 这个方法可以很顺利地取消正在运行的动画。

Activity.onBackPressed() 很方便的管理back键的方法,有时候需要自己控制返回键的事件的时候,可以重写一下。比如加入 “点两下back键退出” 功能。

ActivityManager.getMemoryClass() 告诉你你的机器还有多少内存,在计算缓存大小的时候会比较有用。

ViewStub 它是一个初始化不做任何事情的 View,但是之后可以载入一个布局文件。在慢加载 View 中很适合做占位符。唯一的缺点就是不支持标签,所以如果你不太小心的话,可能会在视图结构中加入不需要的嵌套。具体可参考我的:Android中的UI优化

Fragment.setArguments——因为在构建 Fragment 的时候不能加参数,所以这是个很好的东西,可以在创建 Fragment 之前设置参数(即使在 configuration 改变的时候仍然会导致销毁/重建),更多关于如何在Fragment中传递参数可参考我的:Android Fragment生命周期和参数传递

LocalBroadcastManager——这个会比全局的 broadcast 更加安全,简单,快速。像 otto 这样的 Event buses 机制对你的应用场景更加有用。

Activity.recreate ()——强制让 Activity 重建。(感觉很有用的样子,但是没想出需要在什么场景下使用)。

ViewTreeObserver——这是一个很棒的工具。可以进入到 VIew 里面,并监控 View 结构的各种状态,通常我都用来做 View 的测量操作(自定义视图中经常用到)。可以参考我的:Activity启动过程中获取组件宽高的N种方式,中对ViewTreeObserver的运用。

android:scaleType (ImageView)——定义在 ImageView 中怎么缩放/剪裁图片,一般用的比较多。

ViewDragHelper ——视图拖动是一个比较复杂的问题。这个类可以帮助解决不少问题。如果你需要一个例子,DrawerLayout就是利用它实现扫滑。

Context.getExternalFilesDir()———— 申请了SD卡写权限后,你可以在SD的任何地方写数据,把你的数据写在设计好的合适位置会更加有礼貌。这样数据可以及时被清理,也会有更好的用户体验。此外,Android 4.0 Kitkat中在这个文件夹下写数据是不需要权限的,每个用户有自己的独立的数据存储路径。

SparseArray——Map的高效优化版本。推荐了解姐妹类SparseBooleanArray、SparseIntArray和SparseLongArray。PackageManager.setComponentEnabledSetting()——可以用来启动或者禁用程序清单中的组件。对于关闭不需要的功能组件是非常赞的,比如关掉一个当前不用的广播接收器。

ActivityOptions ——方便的定义两个Activity切换的动画。 使用ActivityOptionsCompat 可以很好解决旧版本的兼容问题。更多关于如何实现Activity切换动画的知识,可参考我的:实现Activity跳转动画的五种方式

android:clipChildren 和 android:clipToPadding:clipToPadding就是说控件的绘制区域是否在padding里面的,true的情况下如果你设置了padding那么绘制的区域就往里 缩,clipChildren是指子控件是否超过padding区域,这两个属性默认是true的,所以在设置了padding情况下,默认滚动是在 padding内部的,要达到上面的效果主要把这两个属性设置了false那么这样子控件就能画到padding的区域了。

TouchSlop,系统所能识别出的被认为是最小的滑动距。离,ViewConfiguration.get(context).getScaledTouchSlop()。

getParent().requestDisallowInterceptTouchEvent(true);剥夺父view对touch事件的处理权。

ArgbEvaluator.evaluate(float fraction, Object startValue, Object endValue);用于根据一个起始颜色值和一个结束颜色值以及一个偏移量生成一个新的颜色,分分钟实现类似于微信底部栏滑动颜色渐变。

HandlerThread,代替不停new Thread开子线程的重复体力写法。具体更多关于HandlerThread的知识,可参考我的:Android源码解析之(四)–>HandlerThread

IntentService,一个可以干完活后自己去死且不需要我们去管理子线程的Service。更多关于IntentService相关的知识可参考我的:Android源码解析之(五)–>IntentService

onTrimMemory,在Activity中重写此方法,会在内存紧张的时候回调(支持多个级别),便于我们主动的进行资源释放,避免OOM。更多关于onTrimMemory相关的知识点可参考:Android源码解析(二十五)–>onLowMemory执行流程

通过 WindowManager.addView 在其他app界面添加一个view时,经常会无法显示,特别在miui,emui固件上,需要指定type为LayoutParams.TYPE_TOAST。

android.support.v4.widget.DrawerLayout原生大方的抽屉控件。更多关于DrawerLayout可参考我的:android侧滑菜单-DrawerLayout的基本使用

runOnuithread. 和 view.post省了取handler过程,而其底层其实都是使用的Android的异步消息机制,具体可参考我的:Android源码解析之(二)–>异步消息机制

CountDownTimer android定义的定时操作类,可以很方便实现倒计时功能,比如登录时发送验证码的倒计时。

BaseAdapter.notifyDataSetChanged();用于实现adapter数据的更新操作。

android context获取目录API的具体目录位置:

context.getFilesDir();// /data/data//files

context.getCacheDir();// /data/data//cache

context.getExternalCacheDir(); // /sdcard/Android/data//files

// system/app ——– 系统自带的应用程序,获取adb root权限才能删除

// data/app ——– 用户程序安装时的目录,安装时

// data/data ——– 存放应用程序的数据

// data/dalvik-cache - 将apk中的dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一)

TextView(往往 TextView 派生子类同样适用)调用 setText 方法设置一个 int 型的数据,千万要将该值转为 String,否则在某些设备中它会默认去查询 R 文件中定义的资源(部分设备可能会报空指针异常)。

在 Activity 中尽可能少的创建 Handler 对象,创建一个主线程 Handler,一个后台 HandlerThread 就可以了。

使用线程的地方尽量不要 new Thread,而是使用 AsyncThread 。

要考虑到Activity和进程被杀掉的情况 如了通常情况退出Activity外,还有Activity因其他原因被杀的情况,比如系统内存过低,系统配置变更,有异常等等,要考虑和测试这种情况,特别是Activity处理重要的数据时,做好的数据的保存。

尽量不适用静态全局变量保存核心数据,因为当内存过低时静态全局变量可能会被初始化,具体可参考:尽量不使用静态变量保存数据

用getApplication()来取Context当参数 对于需要使用Context对象作为参数的函数,要使用getApplication()获取Context对象当参数,而不要使用this,除非你需要特定的组件实例!getApplication()返回的Context是属于Application的,它会在整个应用的生命周期内存在,远大于某个组件的生命周期,所以即使某个引用长期持有Context对象也不会引发内存泄露。

主线程只做UI控制和Frameworks回调相关的事。附属线程只做费时的后台操作。交互只通过Handler。这样就可以避免大量的线程问题。

context/getApplicationContext,视你是否需要涉及到ui时候选择合适的context

用Activity来显示出的dialog,popupwindow等控件需要在Activity关闭时候(之前也给关了)

如果代码需要做混淆,请注意接口类、接口方法和反射要调的类和方法不要混淆,可以照着Activity等四大组件如何不混淆去做

在Android Library中不能使用switch-case语句访问资源ID。

不能再Activity没有显示完全时显示PopupWindow和Dialog.

在多进程之间不要用SharedPreferences共享数据,虽然可以(MODE_MULTI_PROCESS),但极不稳定

有些时候不能使用Application的Context,不然会报错(比如启动Activity,显示Dialog等):

当前Activity的onPause方法执行结束后才会执行下一个Activity的onCreate方法,所以在onPause方法中不适合做耗时较长的工作,这会影响到页面之间的跳转效率;

.9图不能通过tinypng压缩,不然会有问题;关于tinypng相关的知识可参考我的:Android产品研发(二十一)–>Android中的UI优化

不同API版本的AsyncTask实现不一样,有的是可以同时执行多个任务,有的API中只能同时执行一个线程,所以在程序中同时执行多个AsyncTask时有可能遇到一个AsyncTask的excute方法后很久都没有执行。调用AsyncTask的excute方法不能立即执行程序的原因分析及改善方案。具体关于AsyncTask相关的知识点可参考:Android源码解析之(三)–>异步任务AsyncTask

以上是关于Android中总结的各类方法及注意事项,后续不定时更行哈。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android