Android常见技巧

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 或更低版本,则系统会在安装时要求用户授予权限。再次强调,系统只告诉用户应用需要的权限组,而不告知具体权限。
《Android常见技巧》

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>

6. TraceView

《Android常见技巧》

    原文作者:Android
    原文地址: http://www.caiyeccy.com/android/2016/06/03/Android%E5%B8%B8%E7%94%A8%E6%8A%80%E5%B7%A7
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞