1.在设置按钮背景图片时,尽量使用占用空间小的图片,这是因为Android系统在执行Oncreat方法时 绘制VIew,要把对应的背景图片解析成bitmap放在内存中,如果图片过大,会导致解析的进程耗时过长,因为setcontent是在UI线程中,所以会导致卡顿。
2.R.drowable下的文件加载通常不会导致OOM,因为Android系统有一定机制。
3.养成Bipmap使用完recycle的好习惯,一般Android内存中使用的对象再多都不会导致OOM。然而Bitmap例外,Bitmap在内存中的存储格式为byre[],我们使用mat软件进行内存分析即可看到,Bitmap占用了系统分配的很大内存空间。
4.安卓系统设置延迟功能代码:
SystemClock.sleep(1000);
会使代码运行到这里窗【冻结】1秒如果超过15秒会导致ANR;
延迟执行但是不会导致ANR的代码:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
textview.settext("刷新成功")//5秒后执行
}
}, 5000);
5.drawerlayout 设置主内容与菜单之间颜色透明Mydrawer.setScrimColor(Color.TRANSPARENT);
6.ListView使用ViewHolder极简写法
public static <T extends View> T getAdapterView(View convertView, int id) {
SparseArray<View> viewHolder = (SparseArray<View>) convertView.getTag();
if (viewHolder == null) {
viewHolder = new SparseArray<View>();
convertView.setTag(viewHolder);
}
View childView = viewHolder.get(id);
if (childView == null) {
childView = convertView.findViewById(id);
viewHolder.put(id, childView);
}
return (T) childView;
}
用法:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_feed_item, parent, false);
}
ImageView thumnailView = getAdapterView(convertView, R.id.video_thumbnail);
ImageView avatarView = getAdapterView(convertView, R.id.user_avatar);
ImageView appIconView = getAdapterView(convertView, R.id.app_icon);
7.
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);//切换到非全屏
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);//切换到全屏
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);//清除
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);//透明状态栏
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//透明状导航栏
如果4.4的机器设置透明状态栏白条,则需要在XML里设置去掉以下两个属性:
android:clipToPadding="true"
android:fitsSystemWindows="true"
8.像素转dip
public int DipToPixels(Context context, int dip) {
final float SCALE = context.getResources().getDisplayMetrics().density;
float valueDips = dip;
int valuePixels = (int) (valueDips * SCALE + 0.5f);
return valuePixels;
}
dip转像素
public static float PixelsToDip(Context context,int Pixels) {
final float SCALE = context.getResources().getDisplayMetrics().density;
float dips =Pixels / SCALE ;
return dips;
}
9.在那里startActivityForResult就在哪里写回调onActivityResult ,例如在Fragment1里写startActivityForResult,回调方法onActivityResult 就要写在Fragment1里。
10.一、ActivityManagerService提供的主要功能:
(1)统一调度各应用程序的Activity
(2)内存管理
(3)进程管理
当用户单击某个应用图标后,执行程序会在该图标的onClick()事件中调用startActivity()方法,该方法会调用startActivityForResult(),在这个方法内部会调用Instrumentation对象的executeStartActivity()方法,每个Activity内部都有一个Instrumentation对象的引用,它就是一个管家,ActivityThread要创建或者暂停某个Activity都是通过它实现的。
11.介绍下实现一个自定义view的基本流程
明确需求,确定你想实现的效果 2.确定是使用组合控件的形式还是全新自定义的形式,组合控件即使用多个系统控件来合成一个新控件,你比如titilebar,这种形式相对简单, 参考 3.如果是完全自定义一个view的话,你首先需要考虑继承哪个类,是View呢,还是ImageView等子类。 4.根据需要去复写View#onDraw、View#onMeasure、View#onLayout方法 5.根据需要去复写dispatchTouchEvent、onTouchEvent方法 6.根据需要为你的自定义view提供自定义属性,即编写attr.xml,然后在代码中通过TypedArray等类获取到自定义属性值 7.需要处理滑动冲突、像素转换等问题
12.可见,Java较Native端实现简单很多,通过Aidl工具来实现类似功能。所以,要实现一个Java端的service,只需要做以下几件事情:
1.写一个.aidl文件,里面用AIDL语言定义一个接口类IXXX。
2.在Android.mk里加入该文件,这样编译系统会自动生成一个IXXX.java, 放在out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core 下面。
3.在服务端,写一个类,扩展IXXX.Stub,具体实现IXXX的接口函数。
Android线程间通信的基本方式
使用管道流Pipes
共享内存
使用Hander和Message
本文原创,转载请说明出处,谢谢。