Rect r = new Rect(); button.getWindowVisibleDisplayFrame(r); int height = r.top;//状态栏高度
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("别的应用的包名");
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>的名称空间:
<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>
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 xmlns:android="http://schemas.android.com/apk/res/android" android:animation="@anim/test" android:animationOrder="random" android:delay="30%" />
<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" />
<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是一系列与用户交互的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; }