Android 开发中,那些让你觉得相见恨晚的方法、类或接口

http://blog.csdn.net/sbsujjbcy/article/details/47294997(转)


本篇文章内容提取自知乎Android开发中,有哪些让你觉得相见恨晚的方法、类或接口?,其实有一部是JAVA的,但是在android开发中也算常见。大多数的函数自己还是见过的,这里记录一下备忘。同时呢,也推荐一个github项目,里面记录了自己日常开发中见过的比较有用的东西开发中常用的工具、链接

  • Throwable类中的getStackTrace()方法,根据这个方法可以得到函数的逐层调用地址,其返回值为StackTraceElement[],而在StackTraceElement类中有四个方法getClassName()getFileName()getLineNumber()getMethodName()在调试程序打印Log时非常有用。
<code class="hljs avrasm has-numbering">try {
    int num = <span class="hljs-number">1</span> / <span class="hljs-number">0</span><span class="hljs-comment">;</span>
} catch (Exception e) {
    e<span class="hljs-preprocessor">.printStackTrace</span>()<span class="hljs-comment">;</span>
    StackTraceElement[] stackTrace = e<span class="hljs-preprocessor">.getStackTrace</span>()<span class="hljs-comment">;</span>
    for (StackTraceElement element : stackTrace) {
        String className = element<span class="hljs-preprocessor">.getClassName</span>()<span class="hljs-comment">;</span>
        int lineNumber = element<span class="hljs-preprocessor">.getLineNumber</span>()<span class="hljs-comment">;</span>
        String fileName = element<span class="hljs-preprocessor">.getFileName</span>()<span class="hljs-comment">;</span>
        String methodName = element<span class="hljs-preprocessor">.getMethodName</span>()<span class="hljs-comment">;</span>
        Log<span class="hljs-preprocessor">.e</span>(<span class="hljs-string">"TAG"</span>,<span class="hljs-string">"fileName:"</span>+fileName+<span class="hljs-string">" lineNumber:"</span>+lineNumber+<span class="hljs-string">" className:"</span>+className+<span class="hljs-string">" methodName"</span>+methodName)<span class="hljs-comment">;</span>
    }
}</code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • UncaughtExceptionHandler接口,再好的代码异常难免,利用此接口可以处理未捕获的异常。比如NullPointerException空指针异常抛出时,用户没有try catch捕获,那么,Android系统会弹出对话框的“XXX程序异常退出”,给应用的用户体验造成不良影响。为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理。
<code class="hljs java has-numbering">
<span class="hljs-javadoc">/**
 * 异常处理类
 * User:lizhangqu(513163535@qq.com)
 * Date:2015-08-04
 * Time: 14:48
 */</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CrashHandler</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Thread</span>.<span class="hljs-title">UncaughtExceptionHandler</span> {</span>
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String TAG = CrashHandler.class.getSimpleName();
    <span class="hljs-keyword">private</span> Context mContext;
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">volatile</span> CrashHandler instance;
    <span class="hljs-keyword">private</span> Thread.UncaughtExceptionHandler defalutHandler;
    <span class="hljs-keyword">private</span> DateFormat formatter = <span class="hljs-keyword">new</span> SimpleDateFormat(
            <span class="hljs-string">"yyyy-MM-dd_HH-mm-ss.SSS"</span>, Locale.CHINA);
    <span class="hljs-keyword">private</span> <span class="hljs-title">CrashHandler</span>(){

    }
    <span class="hljs-javadoc">/**
     * 获得单例
     *<span class="hljs-javadoctag"> @return</span> 单例
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> CrashHandler <span class="hljs-title">getInstance</span>() {
        <span class="hljs-keyword">if</span> (instance==<span class="hljs-keyword">null</span>){
            <span class="hljs-keyword">synchronized</span> (CrashHandler.class){
                <span class="hljs-keyword">if</span> (instance==<span class="hljs-keyword">null</span>){
                    instance=<span class="hljs-keyword">new</span> CrashHandler();
                }
            }
        }
        <span class="hljs-keyword">return</span> instance;
    }

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">init</span>(Context context){
        mContext=context.getApplicationContext();
        defalutHandler=Thread.getDefaultUncaughtExceptionHandler();
        <span class="hljs-comment">// 获取系统默认的UncaughtException处理器</span>
        Thread.setDefaultUncaughtExceptionHandler(<span class="hljs-keyword">this</span>);
        <span class="hljs-comment">// 设置该CrashHandler为程序的默认处理器</span>
    }
    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">uncaughtException</span>(Thread thread, Throwable ex) {
        <span class="hljs-keyword">boolean</span> hasHandle=handleException(ex);
        <span class="hljs-comment">//是否处理</span>
        <span class="hljs-keyword">if</span> (!hasHandle && defalutHandler!=<span class="hljs-keyword">null</span>){
            defalutHandler.uncaughtException(thread,ex);
            <span class="hljs-comment">//如果用户没有处理则让系统默认的异常处理器来处理</span>
        }<span class="hljs-keyword">else</span>{
            <span class="hljs-keyword">try</span> {
                Thread.sleep(<span class="hljs-number">5000</span>);
            } <span class="hljs-keyword">catch</span> (InterruptedException e) {
                Log.e(TAG, <span class="hljs-string">"error : "</span>, e);
            }
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(<span class="hljs-number">1</span>);
        }


    }


    <span class="hljs-keyword">private</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">handleException</span>(<span class="hljs-keyword">final</span> Throwable ex){
        <span class="hljs-keyword">if</span> (ex==<span class="hljs-keyword">null</span>){
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
        }
        <span class="hljs-keyword">new</span> Thread(){
            <span class="hljs-annotation">@Override</span>
            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span>() {
                Looper.prepare();

                ex.printStackTrace();

                String err=<span class="hljs-string">"["</span>+ex.getMessage()+<span class="hljs-string">"]"</span>;
                Toast.makeText(mContext, <span class="hljs-string">"程序出现异常,5秒后自动退出"</span>, Toast.LENGTH_LONG).show();
                Looper.loop();
            }
        }.start();
        String str = collectDeviceInfo(ex);
        <span class="hljs-comment">// 收集设备参数信息,日志信息</span>
        saveCrashInfoToFile(str);
        <span class="hljs-comment">// 保存日志文件</span>
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
    }

    <span class="hljs-javadoc">/**
     * 收集设备信息,日志信息
     *<span class="hljs-javadoctag"> @param</span> ex Throwable
     *<span class="hljs-javadoctag"> @return</span> 收集的信息
     */</span>
    <span class="hljs-keyword">private</span> String <span class="hljs-title">collectDeviceInfo</span>(Throwable ex){
        Log.e(TAG,<span class="hljs-string">"collectDeviceInfo:"</span>+ex.getMessage());
        StringBuilder builder=<span class="hljs-keyword">new</span> StringBuilder();

        <span class="hljs-keyword">return</span> builder.toString();
    }

    <span class="hljs-javadoc">/**
     * 保存出错信息
     *<span class="hljs-javadoctag"> @param</span> error 待保存的出错信息
     */</span>
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">saveCrashInfoToFile</span>(String error){
        Log.e(TAG,<span class="hljs-string">"saveCrashInfoToFile:"</span>+error);
    }
}
</code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>

程序入口进行初始化,之后未捕获的异常均由此类处理。

<code class="hljs avrasm has-numbering">CrashHandler<span class="hljs-preprocessor">.getInstance</span>()<span class="hljs-preprocessor">.init</span>(this)<span class="hljs-comment">;</span></code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • Resources类中的getIdentifier(name, defType, defPackage)方法,根据资源名称获取其ID,做UI时经常用到。
<code class="hljs java has-numbering"><span class="hljs-javadoc">/**
 * 根据资源名获得资源id
 * User:lizhangqu(513163535@qq.com)
 * Date:2015-08-04
 * Time: 15:18
 */</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ResourcesUtil</span> {</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String LAYTOUT=<span class="hljs-string">"layout"</span>;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String DRAWABLE=<span class="hljs-string">"drawable"</span>;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String MIPMAP=<span class="hljs-string">"mipmap"</span>;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String MENU=<span class="hljs-string">"menu"</span>;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String RAW=<span class="hljs-string">"raw"</span>;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String ANIM=<span class="hljs-string">"anim"</span>;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String STRING=<span class="hljs-string">"string"</span>;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String STYLE=<span class="hljs-string">"style"</span>;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String STYLEABLE=<span class="hljs-string">"styleable"</span>;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String INTEGER=<span class="hljs-string">"integer"</span>;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String ID=<span class="hljs-string">"id"</span>;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String DIMEN=<span class="hljs-string">"dimen"</span>;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String COLOR=<span class="hljs-string">"color"</span>;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String BOOL=<span class="hljs-string">"bool"</span>;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String ATTR=<span class="hljs-string">"attr"</span>;
    <span class="hljs-comment">//TODO please add other strings by yourself</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getResourceId</span>(Context context,String name,String type){
        Resources resources=<span class="hljs-keyword">null</span>;
        PackageManager pm=context.getPackageManager();
        <span class="hljs-keyword">try</span> {
            resources=context.getResources();
            <span class="hljs-keyword">return</span> resources.getIdentifier(name, type, context.getPackageName());
        } <span class="hljs-keyword">catch</span> (Exception e) {
            e.printStackTrace();
        }
        <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
    }
}
</code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>

比如获得主布局的id

<code class="hljs avrasm has-numbering">ResourcesUtil<span class="hljs-preprocessor">.getResourceId</span>(getApplicationContext(),<span class="hljs-string">"activity_main"</span>,ResourcesUtil<span class="hljs-preprocessor">.LAYTOUT</span>)<span class="hljs-comment">;</span></code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • View中的isShown()方法,以前都是用view.getVisibility() == View.VISIBLE来判断的,但是与这个函数还是有区别的。也就是只有当view本身和它的所有父容器都是visible时,isShown()才返回TRUE。而平常我们调用if(view.getVisibility() == View.VISIBLE)只是对view本身而不对父容器的可见性进行判断。

  • 集合与数组的转化,Arrays类中的asList(T… array)方法,数组转List集合;反过来List.toArray()

  • android.text.format.Formatter类中formatFileSize(Context, long)方法,用来格式化文件大小(BKBMBGB

<code class="hljs avrasm has-numbering">android<span class="hljs-preprocessor">.text</span><span class="hljs-preprocessor">.format</span><span class="hljs-preprocessor">.Formatter</span><span class="hljs-preprocessor">.formatFileSize</span>(getApplicationContext(),<span class="hljs-number">1024</span>)<span class="hljs-comment">;</span>
//返回<span class="hljs-number">1.00</span>KB
android<span class="hljs-preprocessor">.text</span><span class="hljs-preprocessor">.format</span><span class="hljs-preprocessor">.Formatter</span><span class="hljs-preprocessor">.formatFileSize</span>(getApplicationContext(),<span class="hljs-number">1024</span>*<span class="hljs-number">1024</span>)
//返回<span class="hljs-number">1.00</span>MB</code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • android.media.ThumbnailUtils类,用来获取媒体(图片、视频)缩略图,该类从Android 2.2开始系统新增,不向下兼容
<code class="hljs scala has-numbering"><span class="hljs-javadoc">/** 
 * 创建一张视频的缩略图 
 * 如果视频已损坏或者格式不支持可能返回null 
 *  
 * <span class="hljs-javadoctag">@param</span> filePath 视频文件路径  如:/sdcard/android.3gp 
 * <span class="hljs-javadoctag">@param</span> kind kind可以为MINI_KIND或MICRO_KIND 
 *  
 */</span> 
ThumbnailUtils.createVideoThumbnail(filePath,kind);
<span class="hljs-javadoc">/** 
 *  
 * 创建一个指定大小的缩略图 
 * <span class="hljs-javadoctag">@param</span> source 源文件(Bitmap类型) 
 * <span class="hljs-javadoctag">@param</span> width  压缩成的宽度 
 * <span class="hljs-javadoctag">@param</span> height 压缩成的高度 
 */</span>
ThumbnailUtils.extractThumbnail(source , width, height);
<span class="hljs-javadoc">/** 
 * 创建一个指定大小居中的缩略图 
 *  
 * <span class="hljs-javadoctag">@param</span> source 源文件(Bitmap类型) 
 * <span class="hljs-javadoctag">@param</span> width  输出缩略图的宽度 
 * <span class="hljs-javadoctag">@param</span> height 输出缩略图的高度 
 * <span class="hljs-javadoctag">@param</span> options 如果options定义为OPTIONS_RECYCLE_INPUT,则回收<span class="hljs-javadoctag">@param</span> source这个资源文件 
 * (除非缩略图等于<span class="hljs-javadoctag">@param</span> source) 
 *  
 */</span>
ThumbnailUtils.extractThumbnail(source , width, height,options);</code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • 格式化字符串,可以使用String类的format(String,Object…)方法,如果要格式化资源文件strings.xml中的字符串,可以使用getResources().getString(int,Object…)方法
<code class="hljs vbnet has-numbering"><span class="hljs-built_in">String</span>.format(<span class="hljs-string">"money:¥%.2f"</span>,<span class="hljs-number">1.00</span>);

<resources>
    <<span class="hljs-built_in">string</span> name=<span class="hljs-string">"format"</span>>money:$%<span class="hljs-number">.2</span>f</<span class="hljs-built_in">string</span>>
</resources>

getResources().getString(R.<span class="hljs-built_in">string</span>.format,<span class="hljs-number">1.00</span>);</code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • View类中的三个方法:callOnClick()performClick()performLongClick(),可以直接用于触发View的点击事件,不用我们手动点击才触发;
<code class="hljs avrasm has-numbering">findViewById(R<span class="hljs-preprocessor">.id</span><span class="hljs-preprocessor">.btn</span>)<span class="hljs-preprocessor">.setOnClickListener</span>(new View<span class="hljs-preprocessor">.OnClickListener</span>() {
    @Override
    public void onClick(View v) {
        Log<span class="hljs-preprocessor">.e</span>(<span class="hljs-string">"TAG"</span>, <span class="hljs-string">"onClick"</span>)<span class="hljs-comment">;</span>

    }
})<span class="hljs-comment">;</span>
findViewById(R<span class="hljs-preprocessor">.id</span><span class="hljs-preprocessor">.btn</span>)<span class="hljs-preprocessor">.setOnLongClickListener</span>(new View<span class="hljs-preprocessor">.OnLongClickListener</span>() {
    @Override
    public boolean onLongClick(View v) {
        Log<span class="hljs-preprocessor">.e</span>(<span class="hljs-string">"TAG"</span>, <span class="hljs-string">"onLongClick"</span>)<span class="hljs-comment">;</span>
        return true<span class="hljs-comment">;</span>
    }
})<span class="hljs-comment">;</span>
findViewById(R<span class="hljs-preprocessor">.id</span><span class="hljs-preprocessor">.btn</span>)<span class="hljs-preprocessor">.callOnClick</span>()<span class="hljs-comment">;</span>
findViewById(R<span class="hljs-preprocessor">.id</span><span class="hljs-preprocessor">.btn</span>)<span class="hljs-preprocessor">.performClick</span>()<span class="hljs-comment">;</span>
findViewById(R<span class="hljs-preprocessor">.id</span><span class="hljs-preprocessor">.btn</span>)<span class="hljs-preprocessor">.performLongClick</span>()<span class="hljs-comment">;</span></code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>

至于callOnClick()和performClick的区别,相信看过源码后你会一目了然。

<code class="hljs java has-numbering">    <span class="hljs-javadoc">/**
     * Call this view's OnClickListener, if it is defined.  Performs all normal
     * actions associated with clicking: reporting accessibility event, playing
     * a sound, etc.
     *
     *<span class="hljs-javadoctag"> @return</span> True there was an assigned OnClickListener that was called, false
     *         otherwise is returned.
     */</span>    
     <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">performClick</span>() {
        sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);

        ListenerInfo li = mListenerInfo;
        <span class="hljs-keyword">if</span> (li != <span class="hljs-keyword">null</span> && li.mOnClickListener != <span class="hljs-keyword">null</span>) {
            playSoundEffect(SoundEffectConstants.CLICK);
            li.mOnClickListener.onClick(<span class="hljs-keyword">this</span>);
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
        }

        <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
    }

    <span class="hljs-javadoc">/**
     * Directly call any attached OnClickListener.  Unlike {@link #performClick()},
     * this only calls the listener, and does not do any associated clicking
     * actions like reporting an accessibility event.
     *
     *<span class="hljs-javadoctag"> @return</span> True there was an assigned OnClickListener that was called, false
     *         otherwise is returned.
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">callOnClick</span>() {
        ListenerInfo li = mListenerInfo;
        <span class="hljs-keyword">if</span> (li != <span class="hljs-keyword">null</span> && li.mOnClickListener != <span class="hljs-keyword">null</span>) {
            li.mOnClickListener.onClick(<span class="hljs-keyword">this</span>);
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">true</span>;
        }
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
    }</code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • TextUtils类中的isEmpty(String)方法,判断字符串是否为null或”“,不要再自己写判断字符串非空的代码了。
<code class="hljs cmake has-numbering"><span class="hljs-keyword">String</span> str = null;
<span class="hljs-keyword">String</span> str1 = <span class="hljs-string">""</span>;
<span class="hljs-keyword">String</span> str2 = <span class="hljs-string">"a"</span>;
Log.e(<span class="hljs-string">"TAG"</span>, TextUtils.isEmpty(str)+<span class="hljs-string">" "</span>+TextUtils.isEmpty(str1)+<span class="hljs-string">" "</span>+TextUtils.isEmpty(str2));
//输出<span class="hljs-keyword">true</span> <span class="hljs-keyword">true</span> <span class="hljs-keyword">false</span></code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>

类似的方法还有TextUtils.isDigitsOnly()是否是纯数字

  • TextView类中的append(String)方法,添加文本,不要再使用getText()方法拿到旧的字符串再拼接,拼接好了之后再调用setText()方法了
<code class="hljs avrasm has-numbering">TextView textview= (TextView) findViewById(R<span class="hljs-preprocessor">.id</span><span class="hljs-preprocessor">.tv</span>)<span class="hljs-comment">;</span>
textview<span class="hljs-preprocessor">.setText</span>(<span class="hljs-string">"aaa"</span>)<span class="hljs-comment">;</span>
textview<span class="hljs-preprocessor">.append</span>(<span class="hljs-string">"bbb"</span>)<span class="hljs-comment">;</span></code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • View类中的getDrawingCache()等一系列方法,目前只知道可以用来截图
<code class="hljs java has-numbering">    <span class="hljs-javadoc">/**
     * / 获取指定Activity的截屏,保存到png文件
     *
     *<span class="hljs-javadoctag"> @param</span> activity activity
     *<span class="hljs-javadoctag"> @return</span> 截屏Bitmap
     */</span>
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> Bitmap <span class="hljs-title">takeScreenShot</span>(Activity activity) {
        <span class="hljs-comment">// View是你需要截图的View</span>
        View view = activity.getWindow().getDecorView();
        view.setDrawingCacheEnabled(<span class="hljs-keyword">true</span>);
        view.buildDrawingCache();
        Bitmap b1 = view.getDrawingCache();

        <span class="hljs-comment">// 获取状态栏高度</span>
        Rect frame = <span class="hljs-keyword">new</span> Rect();
        activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
        <span class="hljs-keyword">int</span> statusBarHeight = frame.top;
        Log.i(<span class="hljs-string">"TAG"</span>, <span class="hljs-string">""</span> + statusBarHeight);

        <span class="hljs-comment">// 获取屏幕长和高</span>
        <span class="hljs-keyword">int</span> width = activity.getWindowManager().getDefaultDisplay().getWidth();
        <span class="hljs-keyword">int</span> height = activity.getWindowManager().getDefaultDisplay()
                .getHeight();
        Bitmap b = Bitmap.createBitmap(b1, <span class="hljs-number">0</span>, statusBarHeight, width, height
                - statusBarHeight);
        view.destroyDrawingCache();
        <span class="hljs-keyword">return</span> b;
    }</code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • DecimalFormat类,用于字串格式化包括指定位数、百分数、科学计数法等
<code class="hljs cs has-numbering">DecimalFormat df=<span class="hljs-keyword">new</span> DecimalFormat(<span class="hljs-string">"0.0"</span>);
df.format(<span class="hljs-number">12.34</span>);</code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • System类中的arraycopy(src, srcPos, dest, destPos, length)方法,用来copy数组;Arrays.copyOf()里的一系列方法也是间接调用System.arraycopy()方法

  • Fragment类中的onHiddenChanged(boolean)方法,使用FragmentTransaction中的hide()show()时貌似Fragment的其它生命周期方法都不会被调用

调用hide或者show你就会发现fragment的生命周期不走了!onPause方法不调用了!onResume只调用一次!这时此时方法onHiddenChanged派上用场
当fragment隐藏时,该方法会调用传入参数为true表示该fragment被隐藏了,
当fragment调用了show方法后,该方法传入的参数为false,表示该fragment正在显示
所以总结起来,如果使用hide/show方法来控制fragment的使用时,原本需要在onResume以及onPause方法做的事情就可以迁移到onHiddenChanged时进行管理

<code class="hljs java has-numbering"><span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onHiddenChanged</span>(<span class="hljs-keyword">boolean</span> hidden) {
    <span class="hljs-keyword">super</span>.onHiddenChanged(hidden);
    <span class="hljs-keyword">if</span>(hidden){
        <span class="hljs-keyword">this</span>.onPause();
    }<span class="hljs-keyword">else</span>{
        <span class="hljs-keyword">this</span>.onResume();
    }

}</code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • Activity类中的onWindowFocusChanged(boolean)方法,使用一个view的getWidth() getHeight() 方法来获取该view的宽和高,返回的值却为0。
    如果这个view的长宽很确定不为0的话,那很可能是你过早的调用这些方法,也就是说在这个view被加入到rootview之前你就调用了这些方法,返回的值自然为0.,解决该问题的方法有很多,主要就是延后调用这些方法。可以试着在onWindowFocusChanged()里面调用这些方法。

  • View类中的getLocationInWindow(int[])方法和getLocationOnScreen(int[])方法,获取View在窗口/屏幕中的位置

<code class="hljs avrasm has-numbering">TextView tv= (TextView) findViewById(R<span class="hljs-preprocessor">.id</span><span class="hljs-preprocessor">.tv</span>)<span class="hljs-comment">;</span>
int loc[]=new int[<span class="hljs-number">2</span>]<span class="hljs-comment">;</span>
tv<span class="hljs-preprocessor">.getLocationInWindow</span>(loc)<span class="hljs-comment">;</span>
Log<span class="hljs-preprocessor">.e</span>(<span class="hljs-string">"TAG"</span>,loc[<span class="hljs-number">0</span>]+<span class="hljs-string">" "</span>+loc[<span class="hljs-number">1</span>])<span class="hljs-comment">;</span></code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • TextView类中的setTransformationMethod(TransformationMethod)方法,可用来实现“显示密码”功能;
<code class="hljs avrasm has-numbering">TextView tv= (TextView) findViewById(R<span class="hljs-preprocessor">.id</span><span class="hljs-preprocessor">.tv</span>)<span class="hljs-comment">;</span>
tv<span class="hljs-preprocessor">.setText</span>(<span class="hljs-string">"123456"</span>)<span class="hljs-comment">;</span>
tv<span class="hljs-preprocessor">.setTransformationMethod</span>(PasswordTransformationMethod<span class="hljs-preprocessor">.getInstance</span>())<span class="hljs-comment">;</span></code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • TextWatcher接口,用来监听文本输入框内容的改变,可以做的事很多

  • View类中的setSelected(boolean)方法结合android:state_selected=”“用来实现图片选中效果

  • Surface设置透明,但是会挡住其它控件

<code class="hljs avrasm has-numbering">SurfaceView<span class="hljs-preprocessor">.setZOrderOnTop</span>(true)<span class="hljs-comment">;</span>
SurfaceView<span class="hljs-preprocessor">.getHolder</span>()<span class="hljs-preprocessor">.setFormat</span>(PixelFormat<span class="hljs-preprocessor">.TRANSLUCENT</span>)<span class="hljs-comment">;</span></code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • ListView或GridView类中的setFastScrollEnabled(boolean)方法,用来设置快速滚动滑块是否可见,当然前提是item够多

  • PageTransformer接口,用来自定义ViewPager页面切换动画,用setPageTransformer(boolean, PageTransformer)方法来进行设置

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

  • AndroidTestCase类,Android单元测试

  • Activity类中的onNewIntent(intent)方法,具体看这篇文章Android:onNewIntent()触发机制及注意事项

  • Activity.startActivities() 常用于在应用程序中间启动其他的Activity。和startActivity()类似,startActivities也是界面跳转,但是传入的intent是一个数组,也就是说是多个。假设我传入的是两个intent: I1和I2,则调用startActivities之后,直接到I2界面,按返回键,到I1界面。其中到I2的过程中,不会经过I1界面,也就是说,不过存在I1的生命周期之说。

  • Html.fromHtml() 用于生成一个Html,参数可以是一个字符串.但是它不是很快,所以不要经常去用.取而代之的是请手动构建 Spannable 来替换 Html.fromHtml,但是它对渲染从 web 上获取的文字还是很不错的。

  • TextView.setError() 在验证用户输入的时候很棒

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

  • Log.getStackTraceString() 方便的日志类工具,方法Log.v()、Log.d()、Log.i()、Log.w()和Log.e()都是将信息打印到LogCat中,有时候需要将出错的信息插入到数据库或一个自定义的日志文件中,那么这种情况就需要将出错的信息以字符串的形式返回来,也就是使用static String getStackTraceString(Throwable tr)方法的时候。

  • LayoutInflater.from() 顾名思义,用于Inflate一个layout,参数是layout的id.很多地方都会用到

<code class="hljs cs has-numbering">LayoutInflater.<span class="hljs-keyword">from</span>(getApplicationContext()).inflate(<span class="hljs-keyword">int</span> resource, ViewGroup root, boolean attachToRoot)</code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • ViewConfiguration.getScaledTouchSlop() 使用 ViewConfiguration 中提供的值以保证所有触摸是的交互都统一的。这个方法获取的值表示:用户的手滑动这个距离后,才判定为正在进行滑动.当然这个值也可以自己来决定.但是为了一致性,还是使用标准的值较好。

  • PhoneNumberUtils.convertKeypadLettersToDigits 顾名思义.将字母转换为数字,类似于T9输入法

<code class="hljs lasso has-numbering"><span class="hljs-built_in">String</span> abcd <span class="hljs-subst">=</span> PhoneNumberUtils<span class="hljs-built_in">.</span>convertKeypadLettersToDigits(<span class="hljs-string">"abcd"</span>);
<span class="hljs-keyword">Log</span><span class="hljs-built_in">.</span>e(<span class="hljs-string">"TAG"</span>,abcd);
<span class="hljs-comment">//结果为2223</span></code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • Context.getCacheDir() 获取缓存数据文件夹的路径,这个路径通常在SD卡上(这里的SD卡指的是广义上的SD卡,包括外部存储和内部存储)Adnroid/data/您的应用程序包名/cache/ 下面.测试的时候,可以去这里面看是否缓存成功.缓存在这里的好处是:不用自己再去手动创建文件夹,不用担心用户把自己创建的文件夹删掉,在应用程序卸载的时候,这里会被清空,使用第三方的清理工具的时候,这里也会被清空。

  • ArgbEvaluator 用于处理颜色的渐变。在使用动画的时候可能用的比较多。可以看下他的实现

<code class="hljs vala has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-built_in">Object</span> evaluate(<span class="hljs-keyword">float</span> fraction, <span class="hljs-built_in">Object</span> startValue, <span class="hljs-built_in">Object</span> endValue) {
        <span class="hljs-keyword">int</span> startInt = (Integer) startValue;
        <span class="hljs-keyword">int</span> startA = (startInt >> <span class="hljs-number">24</span>) & <span class="hljs-number">0xff</span>;
        <span class="hljs-keyword">int</span> startR = (startInt >> <span class="hljs-number">16</span>) & <span class="hljs-number">0xff</span>;
        <span class="hljs-keyword">int</span> startG = (startInt >> <span class="hljs-number">8</span>) & <span class="hljs-number">0xff</span>;
        <span class="hljs-keyword">int</span> startB = startInt & <span class="hljs-number">0xff</span>;

        <span class="hljs-keyword">int</span> endInt = (Integer) endValue;
        <span class="hljs-keyword">int</span> endA = (endInt >> <span class="hljs-number">24</span>) & <span class="hljs-number">0xff</span>;
        <span class="hljs-keyword">int</span> endR = (endInt >> <span class="hljs-number">16</span>) & <span class="hljs-number">0xff</span>;
        <span class="hljs-keyword">int</span> endG = (endInt >> <span class="hljs-number">8</span>) & <span class="hljs-number">0xff</span>;
        <span class="hljs-keyword">int</span> endB = endInt & <span class="hljs-number">0xff</span>;

        <span class="hljs-keyword">return</span> (<span class="hljs-keyword">int</span>)((startA + (<span class="hljs-keyword">int</span>)(fraction * (endA - startA))) << <span class="hljs-number">24</span>) |
                (<span class="hljs-keyword">int</span>)((startR + (<span class="hljs-keyword">int</span>)(fraction * (endR - startR))) << <span class="hljs-number">16</span>) |
                (<span class="hljs-keyword">int</span>)((startG + (<span class="hljs-keyword">int</span>)(fraction * (endG - startG))) << <span class="hljs-number">8</span>) |
                (<span class="hljs-keyword">int</span>)((startB + (<span class="hljs-keyword">int</span>)(fraction * (endB - startB))));
    }</code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • ContextThemeWrapper 方便在运行的时候修改主题。这里以改变系统自带Dialog字体大小为例
<code class="hljs avrasm has-numbering">//将一个style的parent设置为@android:style/Theme<span class="hljs-preprocessor">.Dialog</span>
//修改其中的 <item name=<span class="hljs-string">"android:textSize"</span>><span class="hljs-number">30</span>sp</item>
//利用context和该style生成ContextThemeWrapper
//利用ContextThemeWrapper生产Builder对象
ContextThemeWrapper contextThemeWrapper = new ContextThemeWrapper(MainActivity<span class="hljs-preprocessor">.this</span>, R<span class="hljs-preprocessor">.style</span><span class="hljs-preprocessor">.dialog</span>)<span class="hljs-comment">;</span>
AlertDialog<span class="hljs-preprocessor">.Builder</span> builder =  new AlertDialog<span class="hljs-preprocessor">.Builder</span>(contextThemeWrapper)<span class="hljs-comment">;</span>
Dialog dialog=builder<span class="hljs-preprocessor">.create</span>()<span class="hljs-comment">;</span></code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • Space 它是Android 4.0中新增的一个控件,它实际上可以用来分隔不同的控件,其中形成一个空白的区域.这是一个轻量级的视图组件,它可以跳过Draw,对于需要占位符的任何场景来说都是很棒的。
<code class="hljs xml has-numbering"><<span class="hljs-title">Space
</span>    <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"match_parent"</span>
    <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"10dp"</span>/></code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • ValueAnimator.reverse() 用在动画中,将动画逆向。

  • EditText类的setKeyListener(KeyListener)方法,设置DigitsKeyListener类将只能输入数字,通过DigitsKeyListener.getInstance(String accepted)方法即可指定EditText可输入的字符集。

  • DateUtils.formatDateTime() 用来进行区域格式化工作,输出格式化和本地化的时间或者日期。

<code class="hljs avrasm has-numbering">android<span class="hljs-preprocessor">.text</span><span class="hljs-preprocessor">.format</span><span class="hljs-preprocessor">.DateUtils</span><span class="hljs-preprocessor">.formatDateTime</span>(getApplicationContext(),System<span class="hljs-preprocessor">.currentTimeMillis</span>(), DateUtils<span class="hljs-preprocessor">.FORMAT</span>_SHOW_DATE|DateUtils<span class="hljs-preprocessor">.FORMAT</span>_SHOW_YEAR|DateUtils<span class="hljs-preprocessor">.FORMAT</span>_SHOW_TIME)<span class="hljs-comment">;</span></code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • Linkify.addLinks() 在Text上添加链接。很实用。比如将TextView中的超链接识别为可点击进入浏览器的链接。
<code class="hljs avrasm has-numbering">TextView tv= (TextView) findViewById(R<span class="hljs-preprocessor">.id</span><span class="hljs-preprocessor">.tv</span>)<span class="hljs-comment">;</span>
Linkify<span class="hljs-preprocessor">.addLinks</span>(tv,Linkify<span class="hljs-preprocessor">.WEB</span>_URLS)<span class="hljs-comment">;</span></code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • StaticLayout 在自定义 View 中渲染文字的时候很实用。
    使用Canvas的drawText绘制文本是不会自动换行的,即使一个很长很长的字符串,drawText也只显示一行,超出部分被隐藏在屏幕之外。可以逐个计算每个字符的宽度,通过一定的算法将字符串分割成多个部分,然后分别调用drawText一部分一部分的显示, 但是这种显示效率会很低。
    StaticLayout是android中处理文字换行的一个工具类,StaticLayout已经实现了文本绘制换行处理

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

  • GestureDetector 用来监听和相应对应的手势事件,比如点击,长按,慢滑动,快滑动,用起来很简单,比你自己实现要方便许多。

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

  • ViewStub 它是一个初始化不做任何事情的 View,但是之后可以载入一个布局文件。在慢加载 View 中很适合做占位符。

  • SystemClock.sleep() 这个方法在保证一定时间的 sleep 时很方便,通常用来进行 debug 和模拟网络延时。

Thread.sleep()是java提供的函数。在调用该函数的过程中可能会发生InterruptedException异常。
SystemClock.sleep()是android提供的函数。在调用该函数的过程中不会发生InterruptedException异常。

  • DisplayMetrics.density 这个方法你可以获取设备像素密度,大部分时候最好让系统来自动进行缩放资源之类的操作,但是有时候控制的效果会更好一些.(尤其是在自定义View的时候)。

  • Pair.create(),这个类在v4包下也存在,内部就两个泛型对象,一个叫first,一个叫second,可以类比map,一个为key,一个为value,但是这个Pair不是key,value,而是一组数据

  • Fragment.setArguments,因为在构建 Fragment 的时候不建议加参数,所以这是个很好的东西,可以在创建 Fragment 之前设置参数

<code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">BlankFragment</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Fragment</span> {</span>
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String ARG_PARAM1 = <span class="hljs-string">"param1"</span>;
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String ARG_PARAM2 = <span class="hljs-string">"param2"</span>;

    <span class="hljs-keyword">private</span> String mParam1;
    <span class="hljs-keyword">private</span> String mParam2;

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> BlankFragment <span class="hljs-title">newInstance</span>(String param1, String param2) {
        BlankFragment fragment = <span class="hljs-keyword">new</span> BlankFragment();
        Bundle args = <span class="hljs-keyword">new</span> Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        <span class="hljs-keyword">return</span> fragment;
    }

    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
        <span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
        <span class="hljs-keyword">if</span> (getArguments() != <span class="hljs-keyword">null</span>) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

}
</code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • DialogFragment.setShowsDialog () 这是一个很巧妙的方式,DialogFragment 可以作为Dialog显示。可以参考这篇文章Android 官方推荐 : DialogFragment 创建对话框

  • FragmentManager.enableDebugLogging () 在需要观察 Fragment 状态的时候会有帮助。可以通过getFragmentManager().enableDebugLogging(true);来提供相关的debug功能。

  • LocalBroadcastManager 这个会比全局的 broadcast 更加安全,简单,快速。一个简单的应用就是退出程序。

<code class="hljs java has-numbering"><span class="hljs-javadoc">/**
 * 全局Application基类
 * User:lizhangqu(513163535@qq.com)
 * Date:2015-07-22
 * Time: 09:35
 */</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">BaseApplication</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Application</span> {</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">static</span> String ACTION_EXIT_APP = <span class="hljs-string">"package.exit"</span>;
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> LocalBroadcastManager mLocalBroadcatManager;
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> Context mContext;
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> BaseApplication instance;

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> Context <span class="hljs-title">getContext</span>() {
        <span class="hljs-keyword">return</span> mContext;
    }

    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>() {
        <span class="hljs-keyword">super</span>.onCreate();
        instance = <span class="hljs-keyword">this</span>;
        mContext = <span class="hljs-keyword">this</span>.getApplicationContext();
        CorePageManager.getInstance().init(<span class="hljs-keyword">this</span>);
    }

    <span class="hljs-javadoc">/**
     * 发送本地广播退出程序
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">exitApp</span>() {
        Intent intent = <span class="hljs-keyword">new</span> Intent();
        intent.setAction(ACTION_EXIT_APP);
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        BaseApplication.getLocalBroadcastManager().sendBroadcast(intent);
        BaseActivity.unInit();
    }

    <span class="hljs-javadoc">/**
     * 获得LocalBroadcastManager对象
     *<span class="hljs-javadoctag"> @return</span> LocalBroadcastManager对象
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> LocalBroadcastManager <span class="hljs-title">getLocalBroadcastManager</span>() {
        <span class="hljs-keyword">if</span> (mLocalBroadcatManager == <span class="hljs-keyword">null</span>) {
            mLocalBroadcatManager = LocalBroadcastManager.getInstance(mContext);
        }
        <span class="hljs-keyword">return</span> mLocalBroadcatManager;
    }
}
</code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
<code class="hljs java has-numbering">
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">BaseActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">FragmentActivity</span>{</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">static</span> String ACTION_EXIT_APP = <span class="hljs-string">"package.exit"</span>;
    <span class="hljs-javadoc">/**
     * 仅用于接受应用退出广播,程序退出时有机会做一些必要的清理工作
     */</span>
    <span class="hljs-keyword">private</span> BroadcastReceiver mExitReceiver = <span class="hljs-keyword">new</span> BroadcastReceiver() {

        <span class="hljs-annotation">@Override</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onReceive</span>(Context context, Intent intent) {
            String action = intent.getAction();
            <span class="hljs-keyword">if</span> (action.equals(ACTION_EXIT_APP)) {
                Log.d(TAG,<span class="hljs-string">"exit from broadcast"</span>);
                finish();
            }
        }
    };



    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
        <span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);

        IntentFilter filter = <span class="hljs-keyword">new</span> IntentFilter();
        filter.addAction(Config.ACTION_EXIT_APP);
        filter.addCategory(Intent.CATEGORY_DEFAULT);
        BaseApplication.getLocalBroadcastManager().registerReceiver(mExitReceiver, filter);
        <span class="hljs-comment">//注册本地广播,接收程序退出广播</span>
    }


}
</code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • Application.registerActivityLifecycleCallbacks 就是注册 Activity 的生命周期的一些回调方法,就是一个方便的工具

Application通过此接口提供了一套回调方法,用于让开发者对Activity的生命周期事件进行集中处理。
以往若需监测Activity的生命周期事件代码,你可能是这样做的,重写每一个Acivity的onResume(),然后作统计和处理。

<code class="hljs r has-numbering">@Override  
protected void onResume() {  
  super.onResume();  
  //TODO 处理和统计代码  
  Log.v(TAG, <span class="hljs-string">"onResume"</span>);  
  Logger.v(TAG, <span class="hljs-string">"onResume"</span>);  
  Logging.v(TAG, <span class="hljs-string">"onResume"</span>);  
  <span class="hljs-keyword">...</span>  
} </code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>

ActivityLifecycleCallbacks接口回调可以简化这一繁琐过程,在一个类中作统一处理

android.app.Application.ActivityLifecycleCallbacks 它要求API 14+ (Android 4.0+),在我们自定义的Application注册回调。

<code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>() {  
  <span class="hljs-keyword">super</span>.onCreate();  
  <span class="hljs-keyword">this</span>.registerActivityLifecycleCallbacks(<span class="hljs-keyword">new</span> ActivityLifecycleCallbacks() {  

    <span class="hljs-annotation">@Override</span>  
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onActivityStopped</span>(Activity activity) {  
        Logger.v(activity, <span class="hljs-string">"onActivityStopped"</span>);  
    }  

    <span class="hljs-annotation">@Override</span>  
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onActivityStarted</span>(Activity activity) {  
        Logger.v(activity, <span class="hljs-string">"onActivityStarted"</span>);  
    }  

    <span class="hljs-annotation">@Override</span>  
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onActivitySaveInstanceState</span>(Activity activity, Bundle outState) {  
        Logger.v(activity, <span class="hljs-string">"onActivitySaveInstanceState"</span>);  
    }  

    <span class="hljs-annotation">@Override</span>  
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onActivityResumed</span>(Activity activity) {  
        Logger.v(activity, <span class="hljs-string">"onActivityResumed"</span>);  
    }  

    <span class="hljs-annotation">@Override</span>  
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onActivityPaused</span>(Activity activity) {  
        Logger.v(activity, <span class="hljs-string">"onActivityPaused"</span>);  
    }  

    <span class="hljs-annotation">@Override</span>  
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onActivityDestroyed</span>(Activity activity) {  
        Logger.v(activity, <span class="hljs-string">"onActivityDestroyed"</span>);  
    }  

    <span class="hljs-annotation">@Override</span>  
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onActivityCreated</span>(Activity activity, Bundle savedInstanceState) {  
        Logger.v(activity, <span class="hljs-string">"onActivityCreated"</span>);  
    }  
  });  
};  </code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>

这里只是使用Log日志工具作简要测试,如需满足较复杂的统计或调试需求时,此法可能会大大减少插入代码量,提高效率,更多详情请看这个项目AndroidLifecyle

  • versionNameSuffix这个 gradle 设置可以让你在基于不同构建类型的 manifest 中修改版本名这个属性,例如,如果需要在在 debug 版本中以”-SNAPSHOT”结尾,那么就可以轻松的看出当前是 debug 版还是 release 版。
<code class="hljs bash has-numbering">buildTypes {
    release {
        versionNameSuffix <span class="hljs-string">"sample"</span> 
    }

}</code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • -nodpi 在没有特别定义的情况下,很多修饰符(-mdpi,-hdpi,-xdpi等等)都会默认自动缩放 assets/dimensions,有时候我们需要保持显示一致,这种情况下就可以使用 -nodpi。

    • Activity.recreate () 强制让 Activity 重建

    • BroadcastRecevier.setDebugUnregister ()什么用不知道,调试用的。

    • android:weightSum (LinearLayout)这个很有用,在百分比布局没有出来前,基本上就是通过这个属性以及layout_weight属性来间接达到百分比。

    • android:duplicateParentState (View) 此方法可以使得子 View 可以复制父 View 的状态。比如如果一个 ViewGroup 是可点击的,那么可以用这个方法在它被点击的时候让它的子 View 都改变状态。

    • android:tileMode (BitmapDrawable)可以指定图片使用重复填充的模式。

    • android:enterFadeDuration/android:exitFadeDuration (Drawables)此属性在 Drawable 具有多种状态的时候,可以定义它展示前的淡入淡出效果。

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

    • Merge此标签可以在另一个布局文件中包含别的布局文件,而不用再新建一个 ViewGroup,对于自定义 ViewGroup 的时候也需要用到;可以通过载入一个带有标签的布局文件来自动定义它的子部件。

    • AtomicFile通过使用备份文件进行文件的原子化操作的类

    • ViewDragHelper视图拖动是一个比较复杂的问题。这个类可以帮助解决不少问题。可以参考这篇文章Android ViewDragHelper完全解析 自定义ViewGroup神器

    • **PopupWindow**Android到处都在使用PopupWindow ,甚至你都没有意识到(标题导航条ActionBar,自动补全AutoComplete,编辑框错误提醒Edittext Errors)。这个类是创建浮层内容的主要方法。

    • **SparseArray**Map的高效优化版本。推荐了解姐妹类SparseBooleanArray、SparseIntArray和SparseLongArray。在编写通用适配器的时候SparseArray可能会用到

    • PackageManager.setComponentEnabledSetting()可以用来启动或者禁用程序清单中的组件。对于关闭不需要的功能组件是非常赞的,比如关掉一个当前不用的广播接收器。

    • SQLiteDatabase.yieldIfContendedSafely()让你暂时停止一个数据库事务, 这样你可以就不会占用太多的系统资源。

    • Environment.getExternalStoragePublicDirectory()还是那句话,用户期望在SD卡上得到统一的用户体验。用这个方法可以获得在用户设备上放置指定类型文件(音乐、图片等)的正确目录。

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

    • View.generateViewId()每次我都想要推荐动态生成控件的ID。需要注意的是,不要和已经存在的控件ID或者其他已经生成的控件ID重复。

    • ActivityManager.clearApplicationUserData() 一键清理你的app产生的用户数据,可能是做用户退出登录功能,有史以来最简单的方式了。以前自己的做法真是不忍直视啊。

    • ActivityOptions方便的定义两个Activity切换的动画。 使用ActivityOptionsCompat 可以很好解决旧版本的兼容问题。使用ActivityOptionsCompat 类可以很方便的实现Material Design的切换动画

    • ViewParent.requestDisallowInterceptTouchEvent() Android系统触摸事件机制大多时候能够默认处理,不过有时候你需要使用这个方法来剥夺父级控件的控制权。

    • Fragment 的 setUserVisibleHint方法,可实现 fragment 对用户可见时才加载资源(延迟加载)

    • IntentService一个可以干完活后自己去死且不需要我们去管理子线程的Service

    • Executors. newSingleThreadExecutor()单线程顺序执行的任务队列

    • **android:animateLayoutChanges=”true”**LinearLayout中添加View的动画的办法,支持通过setLayoutTransition()自定义动画

    • GradientDrawable渐变,可实现阴影效果

    • PointF,graphics包中的一个类,我们经常见到在处理Touch事件的时候分别定义一个downX,一个downY用来存储一个坐标,如果坐标少还好,如果要记录的坐标过多那代码就不好看了。用PointF(float x, float y);来描述一个坐标点会清楚很多。

    • StateListDrawable,定义Selector通常的办法都是xml文件,但是有的时候我们的图片资源可能是从服务器动态获取的,比如很多app所谓的皮肤,这种时候就只能通StateListDrawable来完成了,各种addState即可。

    • includeFontPadding=”false”,TextView默认上下是有一定的padding的,有时候我们可能不需要上下这部分留白,加上它即可。

    • onTrimMemory,在Activity中重写此方法,会在内存紧张的时候回调(支持多个级别),便于我们主动的进行资源释放,避免OOM。

    • Fragment在onAttach方法中接收回调

<code class="hljs java has-numbering"><span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onAttach</span>(Activity activity) {
        <span class="hljs-keyword">super</span>.onAttach(activity);
        <span class="hljs-keyword">try</span> {
            mPageSelectedListener = (PageSelectedListener) activity;
            mMenuBtnOnclickListener = (MenuBtnOnClickListener) activity;
            mCommitBtnOnClickListener = (CommitBtnOnClickListener) activity;
        } <span class="hljs-keyword">catch</span> (ClassCastException e) {
            <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> ClassCastException(activity.toString() + <span class="hljs-string">"must implements listener"</span>);
        }
    }</code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • 通过 WindowManager.addView 在其他app界面添加一个view时,经常会无法显示,特别在miui,emui固件上,需要指定type为LayoutParams.TYPE_TOAST。

  • Paint.setXfermode(porterDuffXfermode),在ApiDemo里面有专门的介绍,实现了穿透,叠加,覆盖等多种绘制效果,非常实用。在自定义View中用的比较多。

  • 通过View.getDrawingCache()可以获取截图,但是需要setDrawingCacheEnabled(true)频繁使用可能会oom,还有一种方法直接用canvas

<code class="hljs mel has-numbering">Bitmap bm = Bitmap.createBitmap((<span class="hljs-keyword">int</span>) (w * <span class="hljs-keyword">scale</span>), (<span class="hljs-keyword">int</span>) (h<span class="hljs-variable">*scale</span>), Bitmap.Config.ARGB_8888);
Canvas <span class="hljs-keyword">canvas</span> = new Canvas();
<span class="hljs-keyword">canvas</span>.setBitmap(bm);
View.draw(<span class="hljs-keyword">canvas</span>);
<span class="hljs-keyword">return</span> bm;</code><ul class="pre-numbering" style="ZOOM: 1; FILTER:  "><li>1</li></ul>
  • 由于fragment的缓存机制决定的。默认情况下,viewpager切换页面时会缓存上一个页面,非相邻页面被销毁,可以使用viewPaper.setOffscreenPageLimit()函数来解决

  • support library 里的任何东西你都值得去看看

  • fragment嵌套时,内部fragment的manager通过getChildFragmentManager()获得

  • 布局中,view.bringTofont(),把该view在层叠布局中置于最前面。通样的viewgroup的bringChildtoFont(),都是一样的效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值