Android小知识总结

onCreate中计算View的高度

可以借助getViewTreeObserver().addOnGlobalLayoutListener()来获得宽度或者高度,示例代码如下:

mWebView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                mWebView.getWidth();
                mWebView.getHeight();
                //防止调用多次
                mWebView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
        });

PopupWindow计算高度

PopupWindow在初始化创建好后,我想知道它的高度和宽度,可以这样计算:

popupWindow.getContentView().measure(0, 0);
popupWindow.getContentView().getMeasuredWidth();
popupWindow.getContentView().getMeasuredHeight();

Theme.NoDisplay

在Android中想进行一些无界面的处理又不适合使用service时,此时可以在项目的AndroidManifest.xml文件中相应的Activity标签中添加这样一行:

android:theme=”@android:style/Theme.NoDisplay

activity父级activity的重建

当我们从其他App跳转到我们应用内部时,可能我们跳转到的不是应用的第一层级页面而是深层次的页面,这时候我们需要在关闭应用内部页面时,对高层的页面进行重建。

  1. 为activity指定父级activity

    <application> 
        <!-- 首层activity -->
        <activity android:name="com.example.Mainactivity"/> 
         <!-- 第二层级activity -->
         <activity android:name="com.example.SecondeActivity" android:parentActivityName="com.example.Mainactivity" > 
             <!-- 父activity的meta-data,用来支持4.0以下版本 -->
             <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.Mainactivity" />
         </activity>
    </application>
    
  2. 二级页面返回时,重建任务栈

    @Override
    public void onBackPressed() { 
        // 获得指向父级activity的intent,NavUtils在support v4 包中 
        Intent upIntent = NavUtils.getParentActivityIntent(this); 
        // 判断是否需要重建任务栈 
        if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
             // 这个activity不是这个app任务的一部分, 所以当向上导航时创建
             // 用合成后退栈(synthesized back stack)创建一个新任务。
              TaskStackBuilder.create(this)
             // 添加这个activity的所有父activity到后退栈中
              .addNextIntentWithParentStack(upIntent)
               // 向上导航到最近的一个父activity
               .startActivities();
         } else {
             // 这个activity是这个app任务的一部分, 所以
             // 向上导航至逻辑父activity.
             NavUtils.navigateUpTo(this, upIntent);
         }
         super.onBackPressed();
    }
    

兼容低版本修改图片的tintColor

drawable.setColorFilter(Color.RED,PorterDuff.Mode.SRC_IN);

使用dumpsys命令查看系统信息

dumpsys命令很强大,可以查看当前系统的信息,用的还比较多,dumpsys常用命令如下:

dumpsys     [options]
             meminfo 显示内存信息
             cpuinfo 显示cpu信息
             account 显示accounts信息
             activity 显示所有的activities信息
             window 显示键盘、窗口信息
             wifi 显示wifi信息

例如:查看某个程序内部内存信息

adb shell dumpsys meminfo 包名 or pid    

再或者查看当前打开app的页面信息,这个很有用

adb shell dumpsys window windows | grep -E 'mCurrentFocus'    

结果类似如下:

mCurrentFocus=Window{43469d60 u0 com.jikexueyuan.geekacademy.debug/com.jikexueyuan.geekacademy.ui.activity.ActivityHomeV3}

Recyleview的LayoutManager设置成StaggeredGridLayoutManager后获取某个字view的spanIndex(也就是在第几列)

private static class MyItemDecoration extends RecyclerView.ItemDecoration {
    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        int index = ((StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams()).getSpanIndex();
    }
}

如果获取当前手机为每个app分配的堆大小,也就是内存大小

ActivityManager manager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);  
int heapSize = manager.getMemoryClass();

注意:这里获得heapSize是M为单位返回的

duplicate entry: android/support/annotation/ColorRes.class

解决方案,只需要在app下的build.gradle加入以下配置就好了:

configurations { all*.exclude group: 'com.android.support', module: 'support-v4' }

方便快捷实现Activity变暗,并带有动画

/**
     * 调整窗口的透明度
     * @param from>=0&&from<=1.0f
     * @param to>=0&&to<=1.0f
     * 
     * */
    private void dimBackground(final float from, final float to) {
        final Window window = getWindow();
        ValueAnimator valueAnimator = ValueAnimator.ofFloat(from, to);
        valueAnimator.setDuration(500);
        valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                WindowManager.LayoutParams params = window.getAttributes();
                params.alpha = (Float) animation.getAnimatedValue();
                window.setAttributes(params);
            }
        });

        valueAnimator.start();
    }

然后这样调用

/** 窗口背景变暗*/
dimBackground(1.0f,0.5f);
/** 窗口背景变亮*/
dimBackground(0.5f,1.0f);

Release模式下借助Proguard清除掉Log类日志

在Proguard配置文件中,确保没有添加 –dontoptimize选项,添加如下代码:

-assumenosideeffects class android.util.Log {
        public static *** d(...);
        public static *** e(...);
        public static *** i(...);
        public static *** v(...);
        public static *** println(...);
        public static *** w(...);
        public static *** wtf(...);
}

待续…