1. TimingLogger工具使用方法
/** * adb shell setprop log.tag.TEST_TIME VERBOSE */
private void testTimeConsume(){
TimingLogger logger = new TimingLogger("TEST_TIME","consume");
funA();
logger.addSplit("funA");
funB();
logger.addSplit("funB");
funC();
logger.addSplit("funC");
logger.dumpToLog();
}
2. 初始化ArrayList
public void initList(){
/** * method 1 */
List<String> list1 = new ArrayList<>();
list1.add("yesterday");
list1.add("today");
list1.add("tomorrow");
/** * method 2 */
List<String> list2 = new ArrayList<>(Arrays.asList("yesterday","today","tomorrow"));
/** * method 3 */
List<String> list3 = new ArrayList<String>();
/** * method 4 */
List<String> list4 = createArrayList("yesterday","today","tomorrow");
/** * method 5 */
List<String> list5 = Arrays.asList("yesterday","today","tomorrow");
}
public static <T> ArrayList<T> createArrayList(T ... e){
ArrayList<T> list = new ArrayList<>();
for(T t : e){
list.add(t);
}
return list;
}
3. 危险权限
所有危险的 Android 系统权限都属于权限组。如果设备运行的是 Android 6.0(API 级别 23),并且应用的 targetSdkVersion 是 23 或更高版本,则当用户请求危险权限时系统会发生以下行为:
如果应用请求其清单中列出的危险权限,而应用目前在权限组中没有任何权限,则系统会向用户显示一个对话框,描述应用要访问的权限组。对话框不描述该组内的具体权限。例如,如果应用请求 READ_CONTACTS 权限,系统对话框只说明该应用需要访问设备的联系信息。如果用户批准,系统将向应用授予其请求的权限。
如果应用请求其清单中列出的危险权限,而应用在同一权限组中已有另一项危险权限,则系统会立即授予该权限,而无需与用户进行任何交互。例如,如果某应用已经请求并且被授予了 READ_CONTACTS 权限,然后它又请求 WRITE_CONTACTS,系统将立即授予该权限。
任何权限都可属于一个权限组,包括正常权限和应用定义的权限。但权限组仅当权限危险时才影响用户体验。可以忽略正常权限的权限组。
如果设备运行的是 Android 5.1(API 级别 22)或更低版本,并且应用的 targetSdkVersion 是 22 或更低版本,则系统会在安装时要求用户授予权限。再次强调,系统只告诉用户应用需要的权限组,而不告知具体权限。
4. 强制每次都弹出Intent响应界面
Intent sendIntent = new Intent(Intent.ACTION_SEND);
...
// Always use string resources for UI text.
// This says something like "Share this photo with"
String title = getResources().getString(R.string.chooser_title);
// Create intent to show the chooser dialog
Intent chooser = Intent.createChooser(sendIntent, title);
// Verify the original intent will resolve to at least one activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
startActivity(chooser);
}
5. Intent和intent-filter
5.1 Intent 中包含的主要信息如下:
- 组件名
- Action
- Data
- Type
- Flag
5.2 intent-filter中包含的信息如下:
- < action> 在 name 属性中,声明接受的 Intent 操作。该值必须是操作的文本字符串值,而不是类常量。
- < data> 使用一个或多个指定数据 URI 各个方面(scheme、host、port、path 等)和 MIME 类型的属性,声明接受的数据类型。
- < category> 在 name 属性中,声明接受的 Intent 类别。该值必须是操作的文本字符串值,而不是类常量。
注意:为了接收隐式 Intent,必须将 CATEGORY_DEFAULT 类别包括在 Intent 过滤器中。 方法 startActivity() 和 startActivityForResult() 将按照已申明 CATEGORY_DEFAULT 类别的方式处理所有 Intent。 如果未在 Intent 过滤器中声明此类别,则隐式 Intent 不会解析为您的 Activity。
<activity android:name="ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>