1、线程如何打断
a、设置boolean标志,可加volatile修饰(每次从主内存中获取值)
b、线程wait(线程挂起,释放了锁,要在同步块中使用)、join(当前线程停止执行直到t线程运行完毕)、sleep(没有释放锁,线程睡眠)方法之一阻塞后捕获InterruptException可退出线程
2、& 0xff
&:两个操作数中位都为1,结果才为1,否则结果为0;
|:两个位只要有一个为1,那么结果就是1,否则就为0;
~:如果位为0,结果是1,如果位为1,结果是0;
^:两个操作数的位中,相同则结果为0,不同则结果为1;
java中有三种移位运算符
<< : 左移运算符,num << 1,相当于num乘以2
>> : 右移运算符,num >> 1,相当于num除以2
>>> : 无符号右移,忽略符号位,空位都以0补齐
3、PagerTabStrip(与PagerTitleStrip类似,只是比PagerTitleStrip多了下面的横线) + ViewPager + Fragment
布局:android.support.v4.view.ViewPager里嵌套android.support.v4.view.PagerTabStrip;
Activity:继承FragmentActivity,赋值一个title数组和一个Fragment数据,重写FragmentPagerAdapter(主要重写三个方法:getItem()、getCount()和getPageTitle())
// 设置下划线的颜色
pagerTabStrip.setTabIndicatorColor(0xffffffff);
// 设置背景的颜色
pagerTabStrip.setBackgroundColor(0xff33ccbb);
5、Android里的强制停止程序是如何实现的
6、模板模式(Android中大量采用了模板模式)
模板方法中的方法可以分为两大类:模板方法和基本方法。
模板方法
一个模板方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法或一个总行为的方法。
一个抽象类可以有任意多个模板方法,而不限于一个。每一个模板方法都可以调用任意多个具体方法。
基本方法
基本方法又可以分为三种:抽象方法(Abstract Method)、具体方法(Concrete Method)和钩子方法(Hook Method)。
● 抽象方法:一个抽象方法由抽象类声明,由具体子类实现。在Java语言里抽象方法以abstract关键字标示。
● 具体方法:一个具体方法由抽象类声明并实现,而子类并不实现或置换。
● 钩子方法:一个钩子方法由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现。
在上面的例子中,AbstractTemplate是一个抽象类,它带有三个方法。其中abstractMethod()是一个抽象方法,它由抽象类声明为抽象方法,并由子类实现;hookMethod()是一个钩子方法,它由抽象类声明并提供默认实现,并且由子类置换掉。concreteMethod()是一个具体方法,它由抽象类声明并实现。
默认钩子方法
一个钩子方法常常由抽象类给出一个空实现作为此方法的默认实现。这种空的钩子方法叫做“Do Nothing Hook”。显然,这种默认钩子方法在缺省适配模式里面已经见过了,一个缺省适配模式讲的是一个类为一个接口提供一个默认的空实现,从而使得缺省适配类的子类不必像实现接口那样必须给出所有方法的实现,因为通常一个具体类并不需要所有的方法。
模板模式的关键是:子类可以置换掉父类的可变部分,但是子类却不可以改变模板方法所代表的顶级逻辑。
7、CRC校验8、IPC数据的正确性与安全性
9、MVC
MVC是三个单词的缩写,分别为: 模型(Model),视图(View)和控制Controller)。 MVC模式的目的就是实现Web系统的职能分工。 Model层实现系统中的业务逻辑。 View层用于与用户的交互。 Controller层是Model与View之间沟通的桥梁,它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。
MVC属于框架模式,不同于设计模式,框架是代码重用,设计模式是设计重用;架构介于二者之间:部分代码重用,部分设计重用,有时分析也可重用。
10、完全退出程序
步骤:1、主动抛出一个异常
2、为不弹出程序崩溃框,在Application里面捕捉这个异常,可以处理也可不处理这个异常
3、2之后,可做一些事情了,比如退出程序,比如保存log信息并上传服务器
4、在3中仅仅使用System.exit(0)并不能完全退出程序,需要将程序的所有Context对象收集,并结束它们
5、Demo见资源
6、目前觉得这个完全退出的办法是最可靠最简便的
a、先回到主Home界面,再killProcess或System.exit;这个方法貌似对Service无效
b、利用广播集体退出;集体是不是有点量
c、自己定义Content View栈、或Activity栈;比较繁琐
11、Android L的动画
12、RecyclerView
它是support-v7的新组件,ListView的升级版,将替代ListView、Gallery控件!
13、面向对象的五个原则
a、单一职责原则-----功能要单一
b、开放封闭原则-----开放扩展,封闭修改
c、依赖倒置原则-----依赖于抽象:抽象不依赖于具体,具体依赖于抽象
d、接口隔离原则-----隔离原则是:接口应该是内聚的,要避免“胖”接口
e、里约替换原则-----子类可以完全替代父类,父类可能不能替代子类
14、将View转成Drawable
public Drawable createViewBitmap(View v) {
Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(),
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
v.draw(canvas);
return new BitmapDrawable(mContext.getResources(), bitmap);
}
15、Android 源码----截屏--获取Bitmap
WindowManager mWindowManager;
DisplayMetrics mDisplayMetrics;
Display mDisplay;
mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
mDisplay = mWindowManager.getDefaultDisplay();
mDisplayMetrics = new DisplayMetrics();
mDisplay.getRealMetrics(mDisplayMetrics);
float[] dims = {mDisplayMetrics.widthPixels , mDisplayMetrics.heightPixels };
mScreenBitmap = SurfaceControl.screenshot((int) dims[0], ( int) dims[1]);
16、高斯模糊Bitmap--效率高
public Bitmap blurBitmap(Bitmap bitmap){
//Let's create an empty bitmap with the same size of the bitmap we want to blur
Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
//Instantiate a new Renderscript
RenderScript rs = RenderScript.create(mContext.getApplicationContext());
//Create an Intrinsic Blur Script using the Renderscript
ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
//Create the Allocations (in/out) with the Renderscript and the in/out bitmaps
Allocation allIn = Allocation.createFromBitmap(rs, bitmap);
Allocation allOut = Allocation.createFromBitmap(rs, outBitmap);
//Set the radius of the blur
blurScript.setRadius(25f);
//Perform the Renderscript
blurScript.setInput(allIn);
blurScript.forEach(allOut);
//Copy the final bitmap created by the out Allocation to the outBitmap
allOut.copyTo(outBitmap);
//recycle the original bitmap
bitmap.recycle();
//After finishing everything, we destroy the Renderscript.
rs.destroy();
//加黑色遮罩
Canvas canvas = new Canvas(outBitmap);
canvas.drawColor(0x66000000);
return outBitmap;
}
17、Android 5.0 实现状态栏沉浸式---设置状态栏的颜色
1、当没有ActionBar的时候:
private void setStatusBarTrans() {
getWindow().requestFeature(Window.FEATURE_NO_TITLE);
if(VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
| WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
window.setNavigationBarColor(Color.TRANSPARENT);
}
}
2、有ActionBar的时候(Android 5.0):
a、设置StatusBar的颜色或背景(同上)
b、布局文件加两个属性:android:fitsSystemWindows="true" android:clipToPadding="true"
c、修改ActionBar的颜色或背景
18、文件监听
19、判断点击是否在ViewGroup内:isTransformedTouchPointInView(int x, int y, View child, PointF outLocalPoint);
一般在ViewGroup里引用isTransformedTouchPointInView(x, y, child, null);即可
20、Background之Drawable渲染
animation-list, bitmap, clip, color, corners, gradient, inset, item, layer-list, nine-patch, padding, rotate, scale, selector, shape, size, solid, stroke
21、图像以及图形渲染Shader
Shader包括以下几个子类:
BitmapShader:位图渲染;
LinearGradient:线性渲染;
RadialGradient:环形渲染;
SweepGradient:梯形渲染;
ComposeShader:组合渲染;
22、
23、