现在的位置: 首页 > 综合 > 正文

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

2017年02月25日 ⁄ 综合 ⁄ 共 3814字 ⁄ 字号 评论关闭

古人云:知其然须知其所以然,然后可造其然。感觉现在很多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) {


抱歉!评论已关闭.