读书笔记之Android篇

本博客地址:http://blog.csdn.net/talentclass_ctt/article/details/54773278

勿忘初心!人生每个阶段都有每个阶段该干的事,你当下能做的就是踏踏实实做好现在的事,最好你能比你身边的人更努力些,不用太着急,你想要的,岁月都会给你!

之前一直忙着做项目,压力有点大,没什么精力写博客,现在觉得在忙也要写博客,因为这是自己成长的足迹。
下面这些是自己开发过程中的笔记,说不定某天忘了某个知识点时在这里看得到,没有分类,但我还是想记录下来,而且会持续更新。
1、用沉浸式状态栏时在style里加上
<item name="android:fitsSystemWindows">true</item>
<item name="android:clipToPadding">true</item>
此时Toast的Context参数要传入getapplicationcontext(),除非自定义Toast,不然文字不会在吐丝中间而是偏上。
2、用单例模式时,如果有context,要写成context.getApplicationContext(),防止内存泄漏;
3、对于SharedPreferences来说,使用MODE_APPEND是没有意义的,MODE_PRIVATE 也是加进去,效果一样的(测试过了),所以全写MODE_PRIVATE就好了;
每个应用有一个默认的偏好文件preferences.xml,使用PreferenceManager.getDefaultSharedPreferences获取,自定义的一些偏好设置用getSharedPreferences来获取,
4、在用Fragment时要注意Fragment和Activity之间的跳转,尽量不让下层直接控制上层;
5、android:animateLayoutChanges="true"为ViewGroup对象的动画显示提供支持,这时会有默认的入场、出场动画;
6、// 字体大小,最后表示16sp
   private float textSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics());
7、mListView.smoothScrollToPosition(int 移动的位置);
mListView.smoothScrollToPosition(0);//移动到首部
mListView.smoothScrollToPosition(listView.getCount() - 1);//移动到尾部
8、ExpandableListView设置子View的行高时要在子View里面设最小高度,否则高度设多少均无效
9、AndroidStudio导入httpmime jar编译不通过的解决办法:在build.gradle的Android{...}里面加上
packagingOptions {  
        exclude 'META-INF/DEPENDENCIES'  
        exclude 'META-INF/NOTICE'  
        exclude 'META-INF/LICENSE'  
        exclude 'META-INF/LICENSE.txt'  
        exclude 'META-INF/NOTICE.txt'  
    } 
10、android中调用activity的finish就会关掉当前的Activity,包含关掉了fragment。
在Android中,Activity有个栈,一个Activity结束掉,会回到上一个Activity,并不是退出应用程序。
11、Android中,退出应用程序的方式:
1)通过pid
int pid = android.os.Process.myPid(); //获取当前应用程序的PID
android.os.Process.killProcess(pid); //杀死当前进程
这种方法退出应用,是会保留某些后进程,例如:Service,Notifications等。
2)通过ActivityManager
ActivityManager manager = (ActivityManager)context.getSystemService(ACTIVITY_SERVICE); //获取应用程序管理器 
manager.killBackgroundProcesses(getPackageName()); //强制结束当前应用程序
这种方式退出应用,会结束本应用程序的一切活动,因为本方法会根据应用程序的包名杀死所有进程包括Activity,Service,Notifications等。
11、现在默认继承的是AppCompatActivity,这样Fragment的addToBackStack()方法无效,继承Activity就可以。
12、xutil3:有上传文件时使用multipart表单, 否则上传原始文件流,即:params.setMultipart(true);
13、不要让生命周期长于Activity的对象持有到Activity的引用
尽量使用Application的Context而不是Activity的Context
尽量不要在Activity中使用非静态内部类,因为非静态内部类会隐式持有外部类实例的引用(具体可以查看细话Java:”失效”的private修饰符了解)。如果使用静态内部类,将外部实例引用作为弱引用持有。
垃圾回收不能解决内存泄露,了解Android中垃圾回收机制
14、SearchViewImageView改变图标: searchButton = (ImageView)mSearchView.findViewById(R.id.search_button);
searchButton.setImageResource(R.drawble.your_search_image_id);
15、onViewCreated在onCreateView执行完后立即执行.
onCreateView返回的就是fragment要显示的view.
16、界面进入时卡顿,先检查布局是否优化,再考虑数据加载是否优化。
17、使用ScrollView属性fillViewport解决android布局不能撑满全屏的问题:ScrollView中 android:fillViewport="true"
18、ScrollView嵌套ListView时,让界面一开始就显示在最顶端的方法:mListView.setFocusable(false);
19、TextView也可以加图片的:drawableLeft、drawableTop、drawableRight、drawableBottom
20、 点击时不会整个变色:mGridView.setSelector(new ColorDrawable(Color.TRANSPARENT));
21、目前获取毫秒值大概有下面三种方法:
//方法 一  (最快)
System.currentTimeMillis();   
//方法 二  (最慢)
Calendar.getInstance().getTimeInMillis();  
//方法 三  
new Date().getTime();  
22、对于ArrayList这种集合,自己手写的循环要比增强型for循环更快,而其他的集合就没有这种情况。
因此,对于我们来说,默认情况下可以都使用增强型for循环,而遍历ArrayList时就还是使用传统的循环方式吧
23、性能优化:
1)避免创建不必要的对象
2)静态优于抽象
3)对常量使用static final修饰符
4)使用增强型for循环语法(注意:对于ArrayList这种集合,自己手写的循环要比增强型for循环更快,而其他的集合就没有这种情况。
因此,对于我们来说,默认情况下可以都使用增强型for循环,而遍历ArrayList时就还是使用传统的循环方式吧。)
5)多使用系统封装好的API
6)避免在内部调用Getters/Setters方法
24、数据库不能建在根目录,有些机器会报错
25、让listview自动滚动到最底部:msgListView.setSelection(msgListView.getBottom());  
26、DAO层一般有接口和该接口的实现类:
接口用于规范实现类,实现类一般用于用于操作搜索数据库。
一般操作修改,添加,删除数据库操作的步骤很相似,就写了一个公共类DAO类 ,修改,添加,删除数据库操作时 直接调用公共类DAO类!
DAO 模式是标准 J2EE 设计模式之一。开发人员用这种模式将底层数据访问操作与高层业务逻辑分离开。一个典型的 DAO 实现有以下组件:
一个 DAO 工厂类、一个 DAO 接口、一个实现了 DAO 接口的具体类、数据传输对象(有时称为值对象)。
具体的 DAO 类包含访问特定数据源的数据的逻辑。
27、当点击下面的文本框时弹出软键盘,这时需要将listview上移并显示最后一条,只需要设置listview的属性为 android:transcriptMode="normal",就能很好的解决。
28、超过部分显示...(省略号)
android:singleLine="true"  
android:ellipsize="end"  
29、可以通过这种方式打开Activity:
    public static void start(Context context, Intent extras) {
        Intent intent = new Intent();
        intent.setClass(context, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        if (extras != null) {
            intent.putExtras(extras);
        }
        context.startActivity(intent);
    }
30、推荐的单例模式的写法:
单例三部曲:
private static T mInstance;
    private T(){}
    // 双检索式单例
    public static T getInstance(){
        if (mInstance==null){// 过滤,减少同步处理的量,提高速率
            // 可能还是有多个线程同时走到这里,所以加锁
            synchronized (T.class){
                if (mInstance==null){// 二重判断
                    mInstance = new T();
                }
            }
        }
        return mInstance;
    }
31、我们日常使用的很多Android应用(如QQ、微信、微博),在应用的主界面按下返回键,应用并没有退出,而是进入后台运行。
那么,开发中是如何实现的呢?我找到了两种方法:
@Override
public void onBackPressed() {
    //方式一:将此任务转向后台
    moveTaskToBack(false);


    //方式二:返回手机的主屏幕
    /*Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addCategory(Intent.CATEGORY_HOME);
    startActivity(intent);*/

32、xutils3.0图片处理
ImageOptions options=new ImageOptions.Builder()  //设置加载过程中的图片  
.setLoadingDrawableId(R.drawable.ic_launcher)  //设置加载失败后的图片  
.setFailureDrawableId(R.drawable.ic_launcher)  //设置使用缓存  
.setUseMemCache(true)  //设置显示圆形图片  
.setCircular(true)  //设置支持gif 
 .setIgnoreGif(false)  
 .build(); 
 publicImageOptions.BuildersetAnimation(Animation animation)  
//——给图片设置动画  
  
publicImageOptions.BuildersetAutoRotate(booleanautoRotate)  
//——根据图片的属性设置图片的自动旋转。应用场景是,一些手机拍照后照片会旋转,调用此方法会再将照片旋转回正确的角度。  
  
publicImageOptions.BuildersetCircular(booleancircular)  
//——设置为true时图片将会以圆形呈现出来。  
  
publicImageOptions.BuildersetConfig(Config config)  
//——此方法设置图片质量config的取值范围为Bitmap.Config.RGB_565(XUtil默认)、  
Bitmap.Config.ALPHA_8、Bitmap.Config.ARGB_4444、Bitmap.Config.ARGB_8888  
  
publicImageOptions.BuildersetCrop(booleancrop)  
//——此方法与setSize()方法合用,此方法设置为true,setSize才能生效。  
  
publicImageOptions.BuildersetSize(intwidth,intheight)  
//——此方法与setCrop()方法合用,setCrop设置为true,此方法才能生效。  
  
publicImageOptions.BuildersetFadeIn(booleanfadeIn)  
//——展示图片时淡入效果  
  
publicImageOptions.BuildersetFailureDrawable(Drawable failureDrawable)  
//——通过drawable方式设置加载失败时显示的图片。  
  
publicImageOptions.BuildersetFailureDrawableId(intfailureDrawableId)  
//——通过资源ID的方式设置加载失败时显示的图片。  
  
publicImageOptions.BuildersetForceLoadingDrawable(booleanforceLoadingDrawable)  
//——与setLoadingDrawable、setLoadingDrawableId合用,默认为true,表示显示加载时的图片,设置为false则表示不显示setLoadingDrawable设置的加载时图片。  
  
publicImageOptions.BuildersetLoadingDrawable(Drawable loadingDrawable)  
//—— 与setForceLoadingDrawable方法合用,此方法通过drawable方式设置加载过程中显示的图片。  
  
publicImageOptions.BuildersetLoadingDrawableId(intloadingDrawableId)  
//—— 与setForceLoadingDrawable方法合用,此方法通过资源id方式设置加载过程中显示的图片。  
  
publicImageOptions.BuildersetIgnoreGif(booleanignoreGif)  
//—— 设置是否忽略gif图,默认忽略。  
  
publicImageOptions.BuildersetImageScaleType(ScaleType imageScaleType)  
//——这是ImageView中的方法,可参考ImageView。  
  
publicImageOptions.BuildersetParamsBuilder(ImageOptions.ParamsBuilder paramsBuilder)  
//——这是重点的方法。既然图片加载也是网络请求,那么我们就可以给这个请求添加参数,就是通过此方法实现。ParamsBuilder实例创建如下:  
new ImageOptions.ParamsBuilder() {  
@Override  
public RequestParams buildParams(RequestParamsparams, ImageOptions options) {  
//在此设置RequestParams参数,参见网络模块  
return params;//返回设置好的RequestParams实例  
  
publicImageOptions.BuildersetPlaceholderScaleType(ScaleType placeholderScaleType)  
//—— 设置加载失败(setFailureDrawable)、加载中(setLoadingDrawable)图片的scaleType。  
  
publicImageOptions.BuildersetRadius(intradius)  
//——设置圆角弧度。  
  
publicImageOptions.BuildersetSquare(booleansquare)  
//——设置为true,则显示正方形图片。  
  
publicImageOptions.BuildersetUseMemCache(booleanuseMemCache)  
//—— 设置是否将图片放入MemCache缓存中。默认为true。
33、TextView显示图片
Drawable drawable = getResources().getDrawable(StringUtil.getFlagResourceID(mContext, location));
    drawable.setBounds(0, 0, 50, 50); //必须设置图片大小,否则不显示
34、混淆时annotation   reflect   这些功能 在代码混淆时候 都会出现问题, 在有用到反射功能的地方也要保护起来
35、用Android Studio做 .9 图:
一、准备好一张普通的图放到mipmap里;
二、右键图片,选择 “Create 9-Patch file...”,这时就会弹窗让你选择存放位置和名字;
36、为了符合代码的规范,在继承Fragment的时候,如果要传递参数,必须要使用对象实例化,否则在打release版本的时候会报
Error:This fragment should provide a default constructor (a public constructor with no arguments) (adsviewpager.DetailFragment) [ValidFragment]?

Error:Error: Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead [ValidFragment]?
目的是为了?防止 数据丢失;
所以不要用构造方法来传数据而是用setArguments。
37、需要给不同的singleTask指定不同的taskAffinity,如果不指定,后来打开的singleTask模式的Activity就不会起作用。
38、未必靠谱的出栈方法remove()
如果你想让某一个Fragment出栈,使用remove()在加入回退栈时并不靠谱。
如果你在add的同时将Fragment加入回退栈:addToBackStack(name)的情况下,它并不能真正将Fragment从栈内移除,
如果你在2秒后(确保Fragment事务已经完成)打印getSupportFragmentManager().getFragments(),会发现该Fragment依然存在,并且依然可以返回到被remove的Fragment,而且是空白页面。
如果你没有将Fragment加入回退栈,remove方法可以正常出栈。
如果你加入了回退栈,popBackStack()系列方法才能真正出栈,这也就引入下一个深坑,popBackStack(String tag,int flags)等系列方法的BUG。
39、一些使用建议
1、对Fragment传递数据,建议使用setArguments(Bundle args),而后在onCreate中使用getArguments()取出,在 “内存重启”前,系统会帮你保存数据,不会造成数据的丢失。和Activity的Intent原理一致。
2、使用newInstance(参数) 创建Fragment对象,优点是调用者只需要关系传递的哪些数据,而无需关心传递数据的Key是什么。
3、如果你需要在Fragment中用到宿主Activity对象,建议在你的基类Fragment定义一个Activity的全局变量,在onAttach中初始化,这不是最好的解决办法,但这可以有效避免一些意外Crash。
40、mGridView.setSelector(new ColorDrawable(Color.TRANSPARENT));去掉点击的背景
41、 设置渐变阴影:android:elevation="5dp";
默认情况下,阴影是由background提供的,如果控件没有设置background,则需要加上 
android:outlineProvider="bounds"
使用elevation时有以下要求:
1. 控件必须设置背景色,且不能为透明。
2. 阴影是绘制于父控件上的,所以控件与父控件的边界之间需有足够空间绘制出阴影才行。
42、解决Android 5.0以上Button自带阴影的问题:
方法1、自定义个Button的Style,继承@style/Widget.AppCompat.Button.Borderless样式即可。
方法2、style="?android:attr/borderlessButtonStyle" 
43、在android的输入框里,如果要修改光标的颜色及粗细步骤如下两步即可搞定:
1.在资源文件drawable下新建一个光标控制color_cursor.xml
<?xml version="1.0" encoding="utf-8"?>  
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">  
    <size android:width="1dp" />  
    <solid android:color="#008000"  />  
</shape>  
2.设置EditText:android:textCursorDrawable="@drawable/color_cursor"
44、  @Override
    public boolean onTouchEvent(MotionEvent event) {
        if(null != this.getCurrentFocus()){
            // 点击空白位置 退出界面
            InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
            finish();
            return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0);
        }
        return super.onTouchEvent(event);
    }
45、想在某Activity做到手机无法截屏,甚至是ADB也拿不到,那么可以在Activity中加入:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
46、ScrollView中的组件设置android:layout_height="fill_parent"不起作用的解决办法
在ScrollView中添加一个 android:fillViewport="true"属性就可以了。顾名思义,这个属性允许 ScrollView中的组件去充满它。 
当ScrollView没有 android:fillViewport="true"时, 里面的元素(比如LinearLayout)会按照wrap_content来计算(不论它是否设了"fill_parent"),而如果LinearLayout的元素设置了fill_parent,那么也是不管用的,
因为LinearLayout依赖里面的元素,而里面的元素又依赖LinearLayout,这样自相矛盾.所以里面元素设置了fill_parent,也会当做wrap_content来计算.
47、 /**
     * PopupWindow 设置添加屏幕的背景透明度
     * @param bgAlpha
     */
    public void backgroundAlpha(Activity context, float bgAlpha) {
        WindowManager.LayoutParams lp = context.getWindow().getAttributes();
        lp.alpha = bgAlpha;
        context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        context.getWindow().setAttributes(lp);
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值