package声明程序的包名,该名称将用作进程的名字和google market唯一的标识。
original-package声明项目源代码所在的包。
包名可以和源码包名不同,但此时在Manifest文件中书写Application,activity,service,provider时android:name就不能只写.MainActivity了这样就会报错,必须写全。
R文件的生成目录是根据package属性的。如果我们想打包两个不同的版本专业版和免费版同时上传到市场就必须有不同的应用ID(包名),这样就必须修改package属性,但是修改了package后R文件的地址也变了,代码中所有引用R文件的地方都必须重新导入。
在Gradle中使用applicationId分解了package属性的作用,在build.gradle中的applicationId负责代表应用的ID而package属性现在仅仅负责源码的目录。在gradle中打包两个不同的版本只需要在flavor中定义不同的applicationID,不用去修改package和代码。
支持从右向左的布局,默认的布局都是从左到右。设置为true的同时sdk的版本要大于16才能生效。
设置activity的别名,可以通过别名生成多个程序入口。
这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互。如果设置为true,则能够被调用或交互,否则不能。设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。
它的默认值依赖与该服务所包含的过滤器。没有过滤器则意味着该服务只能通过指定明确的类名来调用,这样就是说该服务只能在应用程序的内部使用(因为其他外部使用者不会知道该服务的类名),因此这种情况下,这个属性的默认值是false。另一方面,如果至少包含了一个过滤器,则意味着该服务可以给外部的其他应用提供服务,因此默认值是true。
这个属性不是限制把服务暴露给其他应用程序的唯一方法。还可以使用权限来限制能够跟该服务交互的外部实体。
引用自http://blog.csdn.net/id19870510/article/details/8141803
设置为false则不出现在最近应用列表
是否显示在锁屏界面上面(qq 咕咚有这功能,锁屏之后也能看见信息)
四种launchMode:
1.standard:默认的模式,每次启动一个activity都会创建一个新的实例。
2.singleTop:当需要启动的activity已经存在于这个task的栈顶的时候不会创建新实例。
3.singleTask:当需要启动的activity存在于这个task中,则弹出这个activity之上所有的activity,让该activity位于栈顶。
4.singleInstance:在新的task中创建该实例并且该task只有该task。
当使用了上述不会重新创建实例的模式时,也就不会重新走onCreate->onStart->onResume.流程。而是onNewIntent->onRestart->onStart->onResume(前一个实例执行了onStop情况,如果没有执行onStop只调用onNewIntent->onResume。).但是如果该activity被系统回收掉了的话还是会走正常的onCreate流程。
注意:onNewIntent中需要调用setIntent(newIntent)设置新的Intent。否则getntent()获取到的数据仍然是最开始的intent,也就拿不到新的数据。
当该activity**可能**被系统销毁的时候会调用onSaveInstanceState来保存临时状态(如屏幕旋转,从该activity启动新的activity,按Home和关机键的时候系统不知到这个activity会不会销毁所以保存textview里的内容,checkbox选中状态)。如果该activity真的被系统非正常销毁再返回该界面才会调用onRestoreInstance用户正常返回退出则不会调用onSaveInstance()。onSaveInstanceState调用在onPause之后,onStop之前,onRestoreInstanceState调用在onStart和onPostCreate之间。
onPause在新的Activity创建之前调用,onStop在新的activity调用创建完成,执行完onResume之后调用
要理解lambda表达式,首先要了解的是函数式接口(functional interface)。简单来说,函数式接口是只包含一个抽象方法的接口。比如Java标准库中的java.lang.Runnable和java.util.Comparator都是典型的函数式接口。对于函数式接口,除了可以使用Java中标准的方法来创建实现对象之外,还可以使用lambda表达式来创建实现对象。这可以在很大程度上简化代码的实现。在使用lambda表达式时,只需要提供形式参数和方法体。由于函数式接口只有一个抽象方法,所以通过lambda表达式声明的方法体就肯定是这个唯一的抽象方法的实现,而且形式参数的类型可以根据方法的类型声明进行自动推断。
以Runnable接口为例来进行说明,传统的创建一个线程并运行的方式如下所示:
public void runThread() {
new Thread(new Runnable() {
public void run() {
System.out.println("Run!");
}
}).start();}
在上面的代码中,首先需要创建一个匿名内部类实现Runnable接口,还需要实现接口中的run方法。如果使用lambda表达式来完成同样的功能,得到的代码非常简洁,如下面所示:
public void runThreadUseLambda() {
new Thread(() -> {
System.out.println("Run!");
}).start();
}
API21引入,用来定义一个View的outline,比如可以返回矩形或者圆形的outline。这个outline可以用在view的阴影投射和裁剪内容区域。
在pagerfragmentadapter中的getItem时先判断这个fragment是否存在,如果存在直接返回。
需要给这个fragment设置唯一的tag。
@Override
public Fragment getItem(int position) {
// Because this public method is called outside many times,
// check if it exits first before creating a new one.
final String name = makeFragmentName(R.id.desk_clock_pager, position);
Fragment fragment = getFragmentManager().findFragmentByTag(name);
if (fragment == null) {
TabInfo info = mTabs.get(getRtlPosition(position));
fragment = Fragment.instantiate(mContext, info.clss.getName(), info.args);
if (fragment instanceof TimerFragment) {
((TimerFragment) fragment).setFabAppearance();
((TimerFragment) fragment).setLeftRightButtonAppearance();
}
}
return fragment;
}
private String makeFragmentName(int viewId, int index) {
return "android:switcher:" + viewId + ":" + index;
}
API18加入的代码DateFormat.getBestDateTimePattern(Locale locale, String skeleton)
可以根据Locale返回一个最适合你本地的字符串日期格式。
For example, “MMMMd” will return “MMMM d” in the en_US locale, but “d. MMMM” in the de_CH locale