Android中边角旮旯的小知识,深入理解Android必备

 

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,会多次新建

  1. if (r.resultTo == null && !addingToTask  
  2.        && (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推荐使用第一种方式,要使用第二种方式,建议加一个提示,是否拨打号码,确定后再拨打。
 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值