碎雨(一)

获取状态栏高度

Rect r = new Rect();
button.getWindowVisibleDisplayFrame(r);
int height = r.top;//状态栏高度

ApplicationInfo

        对应着清单文件中的<application>节点。

        dataDir:本应用的私有数据存储目录,/data/data/包名

        sourceDir:本应用apk的存储目录,/data/app/xx.apk

        packageName:应用的包名

        className:继承Application的类名

        processName:当前应用运行的进程名(默认是应用的包名)

        uid:分配给当前应用的user-ID,注意:这个id并不是唯一的,多个应用可能拥有相同的uid

        theme:当前应用所使用的theme(即theme对应的style在R文件中的值)的id。

        loadLabel():当前应用的应用名。对应的是<application>中的label属性值。

杀死进程

      其一:只能用于自杀的:

int pid = android.os.Process.myPid();
				Process.killProcess(pid);//只能用于自杀
     其二:只能用于杀死别人:
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
				manager.killBackgroundProcesses("别的应用的包名");
根据图片名得到图片id值
public int getResId(String name){
		Class<drawable> ds = R.drawable.class;
		try {
			Integer i = ds.getDeclaredField(name).getInt(null);
			return i.intValue();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return R.drawable.ic_launcher;
	}

<xliff:g>标签的使用

        需要声明<xliff>的名称空间:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
         其次,使用的标签是<xliff:g></xliff:g>如:
<string name="imcoming_message_ticker_text">New text message: <xliff:g id="text">%0$s</xliff:g></string> 

形式说明:  

        %n$ms:n代表的是第几个参数,m代表的是要在替换的文字的前面放几个空格(系统自动放,不需要手动添加空格)。如m = 2,而且替换的文字是"aa",那么实际显示是就成了"[空格][空格]aa"。如果不想要空格的话,就直接写成%n$s即可。
         %n$md :同上,只不是这里只能用整数进行替换,而上面是用字符串进行替换。
        %n$0md:这里的m指的是替换后的整数的最低位数。如%1$06d,如果替换的整数是123,那么显示的就是"000123",如果替换的数是123456(或者大于六位数),那么替换后还是原来的数字,不会补零。
         n的解释 :String string = getResources().getString(R.string.test, "哈哈","哼哼");那么哈哈会替换掉n=1的位置,哼哼会替换掉n=2的位置

手机应用图标

         得到手机中的所有应用的图标。示例:
Intent mIntent = new Intent(Intent.ACTION_MAIN);
				mIntent.addCategory(Intent.CATEGORY_LAUNCHER);
				List<ResolveInfo> infos = getPackageManager()
						.queryIntentActivities(mIntent, 0);
				ResolveInfo info = infos.get(0);
				Drawable icon = info.activityInfo.loadIcon(getPackageManager());

三击事件

private long[] items = new long[3];
	//三击事件
	private void threeClick() {
		System.arraycopy(items, 1, items, 0, items.length - 1);
		items[items.length - 1] = SystemClock.uptimeMillis();
		//500ms内点击三次,认为是三击事件
		if(items[0] > SystemClock.uptimeMillis() - 500){
			System.out.println("三击事件");
		}
	}

        在上面的代码中,只需要把long[]的长度修改一下,可以实现任意击事件。如改成4,那么就可以实现四击事件。

创建快捷图标

// 创建快捷图标
	private void createShortcut() {
		Intent i = new Intent();
		i.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
		// 快捷图标的名称
		i.putExtra(Intent.EXTRA_SHORTCUT_NAME, "测试快捷图标");
		// 快捷图标的图标
		ShortcutIconResource iconRes = Intent.ShortcutIconResource.fromContext(
				this.getApplicationContext(), R.drawable.logo);
		i.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconRes);
		// 点击图标时启动的程序。注意这里必须用隐式意图去启动
		Intent intent = new Intent("com.example.xxx.START");
		intent.addCategory(Intent.CATEGORY_DEFAULT);
		i.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
		//防止重复创建
		i.putExtra("duplicate", false);
		sendBroadcast(i);
	}

layoutAnimation

基本

         ViewGroup的子类中,可以在布局文件中设置layoutAnimation属性,该属性主要是用来指定子View在出现时的动画。使用非常简单:只需要在布局文件中android:layoutAnimation="@anim/ani"即可。其中ani为一个动画。
示例:
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
    android:animation="@anim/test"
    android:animationOrder="random"
    android:delay="30%" />

属性

        animation指的是子View出现时的动画效果(比如tween中的移动,缩放,旋转,透明等)。
        animationOrder指的是子View出现的顺序,有三个值:normal指按正常顺序,reverse指按正常顺序的倒序,random指随机。
        delay:指子View出现时的间隔。第一个子View出现后,过30%第二个子View再出现。

GridView

        如果布局中的ViewGroup用的是GridView,那么可以将layoutAnimation的值换成根节点是gridLayoutAnimation的xml文件。示例:
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layoutAnimation="@anim/layout_grid_fade"
layout_grid_fade.xml
<gridLayoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"
    android:animation="@anim/fade"
    android:rowDelay="75%"
    android:columnDelay="0%"
    android:direction="right_to_left|bottom_to_top"
    android:directionPriority="row" />

属性

        directionPriority:指按行显示还是按列显示:column指列,row指行,none指的是默认的。
        rowDelay,columnDelay:指同一行(列)中不同子View显示的延迟时间。
        direction:具体指定子View的显示次序.如上面规定了按行显示,而right_to_left规定了一行中的子View从中右往左显示;bottom_to_top规定了从下往上按行显示。
        上述的方法使所有的item都具有同一个动画,如果想使不同的item具有不同的动画,可以使item调用setAnimation()。该方法是VIew中的,所以每一个View都具有该方法。另外,如果是AdapterView(一般都是ListView,GridView),可以在adapter的getView()中设置。

示例

test.xml的示例(它就是一个普通的动画):
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="1000"
    android:fromXDelta="-100%"
    android:toXDelta="0" >

</translate>
也可以通过代码进行设置,如:
LinearLayout root = (LinearLayout) findViewById(R.id.root);
		//这里加载的是每一个子View出现时的动画
		Animation animation = AnimationUtils.loadAnimation(this, R.anim.test);
		//通过controller设置一些属性
		LayoutAnimationController controller = new LayoutAnimationController(
				animation);
		controller.setDelay(0.3f);
		controller.setOrder(LayoutAnimationController.ORDER_REVERSE);
		root.setLayoutAnimation(controller);

Task与Stack

        task是一系列与用户交互的activity的集合,无论该activity是否属于同一个app,都认为是同一个task。管理这些activity的就是stack(堆),这些activity会被存储到stack中,存储的顺序就是它们打开的顺序。文档如下;


        当用户启动一个应用时,该应用的task会被切换成前台,如果该应用的task不存在,就会创建一个task。同时,应用的main activity会被启动,并且该activity会成为stack的root activity。

        启动新activity时,新activity会被push到stack的顶部并且获取焦点,而旧activity仍旧会被保留在stack中,只不过进行stop状态(onStop()被调用,进入该状态时系统仍会保留着界面)。当点击返回键时,当前activity会从stack顶部popped(弹出,同时被销毁),而先前的activity会resume。当stack中所有的activity都被popped出去后,该task就不存在了。除了push和popped外,在stack中的activity永远不会进行重排。如下图:

反射与注解

        使用别的框架时,通常会使用到注解。其实框架内部是使用了反射进行操作的。示例如下:

定义注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NodeId {

}
使用注解
public class FileBean {
	@NodeId
	private int id;
利用反射
public static <T> List<Node> data2Node(List<T> data)
			throws IllegalAccessException, IllegalArgumentException {
		List<Node> nodes = new ArrayList<Node>();
		Node node = null;
		int id = -1;
		int pid = -1;
		String name = null;
		for (T t : data) {
			Class<? extends Object> clazz = t.getClass();
			Field[] fields = clazz.getDeclaredFields();
			for (Field f : fields) {
				if (f.getAnnotation(NodeId.class) != null) {//得到是否有该注解
					f.setAccessible(true);
					id = f.getInt(t);//如果有,就获取该注解对应的变量的值
				}
				if (f.getAnnotation(NodePid.class) != null) {
					f.setAccessible(true);
					pid = f.getInt(t);
				}
				if (f.getAnnotation(NodeName.class) != null) {
					f.setAccessible(true);
					name = (String) f.get(t);
				}
			}
			node = new Node();
			node.setId(id);
			node.setpId(pid);
			node.setName(name);
			nodes.add(node);
		}

		return nodes;
	}







你可能感兴趣的:(碎雨(一))