Android 使用比例布局

当你在设计屏幕布局的时候,不想写死各子控件的位置大小,又不想在代码里动态布局,可以试试使用layout_weight,通过保持各子控件占据屏幕的比例来自适应屏幕。

基本思路:设置各子控件的layout_weight(改控件所占的比例),然后设置高度为0

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="#FFFF0000"
        android:text="This is TextView 1" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="2"
        android:background="#FF00FF00"
        android:text="This is TextView 2" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="3"
        android:background="#FF0000FF"
        android:text="This is TextView 3" />

</LinearLayout>

获取 Android 内存和进程信息

   ActivityManager mAm = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);

    private  int getAppsRunning() {
        List<RunningAppProcessInfo> runningApps = mAm.getRunningAppProcesses();
        return runningApps.size();
    }
    
    private long getFreeMemory() {
        MemoryInfo mi = new MemoryInfo();
        mAm.getMemoryInfo(mi);
       return mi.availMem;
    }

Android 位置更新最佳实践

监测所选位置提供器的状态,当其不可用时,动态切换到一个新的提供器,当有更适合的提供器可用时,切换到这个更适合的位置提供器

	private void unregisterAllListeners() {
		locationManager.removeUpdates(bestProviderListener);
		locationManager.removeUpdates(bestAvailableProviderListener);
	}
	
	private void registerListener() {
		unregisterAllListeners();
		String bestProvider = locationManager.getBestProvider(criteria, false);
		String bestAvailableProvider = locationManager.getBestProvider(criteria, true);
		
		if(bestProvider == null) {
			Log.d(TAG, "No Location Provider exist on device");
		} else if(bestProvider.equals(bestAvailableProvider)) {
			locationManager.requestLocationUpdates(bestAvailableProvider, minTime, minDistance, bestAvailableProviderListener);
		} else {
			locationManager.requestLocationUpdates(bestProvider, minUpdateTime, minUpdateDistance, bestProviderListener);
		}
		
		if(bestAvailableProvider != null) {
			locationManager.requestLocationUpdates(bestAvailableProvider, minTime, minDistance, bestAvailableProviderListener);
		} else {
			List<String> allProviders = locationManager.getAllProviders();
			for(String provider : allProviders)
				locationManager.requestLocationUpdates(provider, minTime, minDistance, bestProviderListener);
			Log.d(TAG, "No Location Providers currently available.");
		}
	}
	
	private LocationListener bestProviderListener = new LocationListener() {

		@Override
		public void onProviderEnabled(String provider) {
			registerListener();
		}
	}
	
	private LocationListener bestAvailableProviderListener = new LocationListener() {
			
		@Override
		public void onProviderEnabled(String provider) {
			registerListener();
		}
	}

ref: 《Android 4高级编程》 p.474

反编译Android APK

呃~~~ 反编译一般都是作学习用的-_-# OS:Android 4.4.2 HOST: OS X

需要的工具

baksmali / smali: 把odex转换成dex dex2jar: 把dex转换成jar jd-gui: 反编译jar

具体步骤

这里我尝试反编译SystemUI,先使用adb pull把SystemUI.apk和SystemUI.odex从手机中取出到本地的tmp目录中(什么是odex可以google一下)。 整个反编译的过程如下:

odex ----> dex ----> jar ----> java
  • odex —-> dex

    java -jar baksmali-2.0.3.jar -a 19 -x SystemUI.odex -d .
    

    参数说明:

    -a : API Level, 这里4.4.2的API Level为19
    -x : 反编译
    -d : 依赖包目录
    

    上面的命令会产生错误,是因为缺少依赖包,可以根据错误信息一次从手机中把依赖包pull到本地目录中。 当所以依赖都完整后,上面的命令会生成一个out文件夹,可以通过这些文件来生成dex。

    java -jar smali-2.0.3.jar -a 19 -o SystemUI.dex  out
    

    如果上面的命令执行成功,那么现在目录中就有了SystemUI.dex。

  • dex —-> jar

    d2j-dex2jar.sh SystemUI.dex
    

    上面的命令完成后会生成SystemUI-dex2jar.jar,最后就差使用JD-GUI来查看java文件了。

  • jar —-> java 安装正确的JD-GUI,打开上面生成的SystemUI-dex2jar.jar。

反编译Android APK

使用 ext4_utils 解压 Android Image

OS: Linux

  • 下载ext4_utils: make
  • simg2img system.img system.img.ext4
  • mount -o loop -t ext4 system.img.ext4 /mnt

ext4_utils