return String.format(GlobalValue.sApplicationContext.getString(R.string.greeting_for_old_user), nick);
古人云:知其然须知其所以然,然后可造其然。感觉现在很多Android开发者都是复制粘贴的苦力,我也深有体会,很多东西只知道应该是这样子写,但是究竟为何这样写,就不知道了。想起原因,还是因为基础不牢固,快餐式学习,急功近利,所以有必要整理一下很多人都忽视的Android小知识,本博客要随时增量更新。
废话不多说,直入正题。
1、所谓的异步,指的是函数的调用并不直接返回执行的结果,而往往是通过回调函数异步的执行。异步的主要目的就是处理非阻塞。解决异步的五种模式:回调,消息,观察者模式(事件),promise,有限状态机(FMS)。
2、/res/values-v11、/res/values-v14——分别包含了API级别11和14的主题。
3、Proguard-project.txt —— 定义了proguard如何优化应用程序代码,proguard是一个去除无用代码并优化android应用程序的工具,可以提高其运行性能,它还能混淆代码,有助于防止代码被反编译。
4、project.properties——eclipse和adt插件用到的build文件,它包含了诸如build target之类的项目配置,可以用此文件来修改各种项目属性,如果需要修改,不要直接编辑此文件,而要用eclipse内的编辑器来进行编辑。
5、BroadcastReceive:广播接收器的生命周期只有十秒左右,如果在onReceive()内做超过十秒内的事,就会报ANR程序无响应错误.他的生命周期为从回调onReceive()方法开始到该方法返回结果后结束。
6、fragmentTransaction.commit();提交不会立即发生,有可能会有延迟直至线程就绪。由于commit()方法中可能会存在延时,因此不要刚创建完fragment就试图立即访问它。findFragmentById()方法只能是识别已加入activity layout的fragment,不然的话还是要用findFragmentByTag()更合适。
7、蓝牙和wifi是两种主要的无线技术标准,蓝牙是用于短距离无线环境下交换数据的标准,他使用了低功率电波来连接手机、计算机和其他网络设备,类似的,wifi是一种易于设置且成本低廉的无线网络技术,他不需要发送方和接收方存在物理连接,而是用无线电波来组成一个无线网络,包括高速互联网连接。
8、传感器是一种检测装置,他们测温度气压速度音量光线等的变化,并转化为数字信号,以便进一步进行必要的处理,绝大部分android设备内置了测量运动,温度,重力,方位及其他设备外围环境变化的硬件传感器。SensorManager是访问传感器的类,SensorManager是android的系统服务,它侦听传感器的数据变化,SensorManager sensorManager = (SensorManager)genSystemService(SENSOR_SERVICE);
9、ViewStub是实现延迟加载视图的类,如果需要根据上下文选择隐藏或者显示一个视图,都可以用ViewStub实现如果视图树层次很深就会感觉到性能上的差距。
10、觉使用su命令将自己变成root用户,在使用chmod 777 sdcard来改变权限,发现结果依然无效的话可以试试
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jjx.test"
android:versionCode="1"
android:versionName="1.0">
//重点
<span style="color:#ff0000;"><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/></span>
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name">
//重点,这句不能少
<span style="color:#ff0000;"><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/></span>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="8" />
</manifest>
11、public void notifyDataSetChanged ()这个方法内部在每个观察者上面调用onChanged事件,每当发现数据集有改变的时候,或者读取数据的新状态的时候,就调用此方法。重绘当前可见区域。
public void notifyDateSetInvalidated()该方法内部实现了在每个观察者上面调用onInvalidated事件,每当发现数据集监控有改变的情况,比如该数据集不再有效,就会调用该方法。会重绘控件(还原到初始状态)。
12、LinearLayout中有一个属性用得比较少,但是还是要知道:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:background="#00000000"
android:baselineAligned="_baseline"
android:orientation="vertical" >
baselineAligned默认属性是true,即是linearlayout中的各个不同子控件都对齐基线,设为false的话要是子控件高度不同的时候基线就对不齐了很难看。
13、android:process=":remote",代表在应用程序里,当需要该service时,会自动创建新的进程。而如果是android:process="remote",没有“:”分号的,则创建全局进程,不同的应用程序共享该进程。
14、在Android中,任何View都可以显示出ScrollBar,唯一的条件是自身高度不足以显示全部内容。在UI元素上,ScrollBar由两部分组成,一个是Track(滑道),一个是Thumb(滑块),这两部分都是可以定制的(指定自定义的drawable),另外ScrollBar的宽度(对于竖向滚动条来说)或高度(对于横向滚动条来说)也是可以控制的,相关的控制属性是:
android:scrollbarThumbHorizontal android:scrollbarThumbVertical android:scrollbarTrackHorizontal android:scrollbarTrackVertical android:scrollbarSize
ScrollBar分为竖向的和横向的,也可以强制去掉,控制这一点的属性是:android:scrollbars。android:scrollbarStyle控制着ScrollBar的显示位置和样式,可取的值如下:insideOverlay、insideInset、outsideOverlay、outsideInset,inside表示显示在padding区域的内侧,outside表示显示在padding区域的外侧。Inset表示将自动增加padding以显示ScrollBar(这意味着内容区域将缩小),Overlay表示不会增加padding以显示ScrollBar,而是浮动在内容上面(可能会遮住内容)。
横向滚动条只能显示在下面。竖向滚动条可以设置ScrollView的滚动条的位置,设置到左边是
mScrollView.setVerticalScrollbarPosition(View.SCROLLBAR_POSITION_LEFT);
14、startActivityForResult方式启动singleTop模式的Aty时,B(singleTop)启动他自己B,会多次新建
- if (r.resultTo == null && !addingToTask
- && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
15、android匹配资源文件字符串
return String.format(mContext.getString(R.string.greeting_for_old_user), nickName);
<string name="greeting_for_old_user">Welcome Back,%s!</string>
16、性能优化
降低执行时间:
缓存:主要包括对象缓存(减少内存的分配),io缓存(减少磁盘的读写次数)、网络缓存(减少网络传输),db缓存(减少datebase的访问次数), 线程池 图片缓存、 消息缓存,网络缓存 listview缓存 layout缓存
数据存储优化:数据类型选择 数据结构选择
算法优化:
JNI:
逻辑、需求 优化:
异步,利用多线程:
延迟提前操作:
网络优化:图片必须缓存,最好根据机型做图片做图形适配。
所有http请求必须添加httptimeout
17、
Intent intent = new Intent(Intent.ACTION_DIAL);
Uri data = Uri.parse("tel:" + "135xxxxxxxx");
intent.setData(data);
startActivity(intent);
去到了拨号界面,实际的拨号是由用户点击实现的
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:" + "135xxxxxxxx");
intent.setData(data);
startActivity(intent);
直接拨打了你所输入的号码,对于用户没有直接的提示效果。
Android推荐使用第一种方式,要使用第二种方式,建议加一个提示,是否拨打号码,确定后再拨打。