From de0b32e9054f9271aa00bea1b832b436145d6418 Mon Sep 17 00:00:00 2001 From: Omooo <869759698@qq.com> Date: Sun, 10 Feb 2019 11:16:19 +0800 Subject: [PATCH] opt --- blogs/Activity.md | 38 -- blogs/{ => Android}/Animator.md | 0 blogs/Android/AsyncTask.md | 25 ++ blogs/Android/Bundle.md | 30 +- blogs/Android/ContextProvider.md | 376 ++++++++++++++++++ .../Android/Dalvik \\ ART.md" | 0 blogs/Android/HandlerThread.md | 172 ++++++++ blogs/Android/IntentService.md | 194 +++++++++ blogs/{ => Android}/RecyclerView.md | 0 blogs/{ => Android}/SQLite.md | 0 blogs/{ => Android}/SharedPreferences.md | 0 blogs/{ => Android}/WebView.md | 0 blogs/{ => Android/埋点}/AOP_AspectJ.md | 0 blogs/{ => Android/埋点}/埋点.md | 0 .../埋点之代理 View.OnClickListener.md | 0 .../埋点}/埋点之应用前后台判断.md | 0 blogs/Android/屏幕适配.md | 18 + .../Android/性能优化/I\\O 优化.md" | 0 blogs/Android/热修复.md | 40 +- blogs/{ => Java}/String.md | 0 blogs/{ => Java}/final.md | 0 blogs/{ => Java}/反射.md | 0 blogs/{ => Java}/泛型.md | 0 blogs/{ => Java}/注解.md | 4 +- images/{ => Android}/AOP_AspectJ.png | Bin images/{ => Android}/Android 虚拟机.png | Bin images/{ => Android}/Animator.png | Bin images/Android/ContentProvider.png | Bin 0 -> 78208 bytes images/{ => Android}/Context 类层次.png | Bin images/{ => Android}/Context.png | Bin images/{ => Android}/DeceAcceInterpolator.gif | Bin .../Android/I\\O 流程.png" | Bin .../Android/I\\O 请求流程.png" | Bin .../Android/Linux I\\O 模型.png" | Bin images/{ => Android}/RecyclerView.png | Bin images/{ => Android}/SharedPreferences.png | Bin images/{ => Android}/SnapView.png | Bin images/{ => Android}/TypeEvaluator.gif | Bin images/{ => Android}/WebView.png | Bin images/{ => Java}/String.png | Bin images/{ => Java}/compact_after.png | Bin images/{ => Java}/compact_before.png | Bin images/{ => Java}/反射.png | Bin images/{ => Java}/泛型.png | Bin 44 files changed, 846 insertions(+), 51 deletions(-) delete mode 100644 blogs/Activity.md rename blogs/{ => Android}/Animator.md (100%) create mode 100644 blogs/Android/AsyncTask.md create mode 100644 blogs/Android/ContextProvider.md rename "blogs/Dalvik \\ ART.md" => "blogs/Android/Dalvik \\ ART.md" (100%) create mode 100644 blogs/Android/HandlerThread.md create mode 100644 blogs/Android/IntentService.md rename blogs/{ => Android}/RecyclerView.md (100%) rename blogs/{ => Android}/SQLite.md (100%) rename blogs/{ => Android}/SharedPreferences.md (100%) rename blogs/{ => Android}/WebView.md (100%) rename blogs/{ => Android/埋点}/AOP_AspectJ.md (100%) rename blogs/{ => Android/埋点}/埋点.md (100%) rename blogs/{ => Android/埋点}/埋点之代理 View.OnClickListener.md (100%) rename blogs/{ => Android/埋点}/埋点之应用前后台判断.md (100%) create mode 100644 blogs/Android/屏幕适配.md rename "blogs/I\\O 优化.md" => "blogs/Android/性能优化/I\\O 优化.md" (100%) rename blogs/{ => Java}/String.md (100%) rename blogs/{ => Java}/final.md (100%) rename blogs/{ => Java}/反射.md (100%) rename blogs/{ => Java}/泛型.md (100%) rename blogs/{ => Java}/注解.md (98%) rename images/{ => Android}/AOP_AspectJ.png (100%) rename images/{ => Android}/Android 虚拟机.png (100%) rename images/{ => Android}/Animator.png (100%) create mode 100644 images/Android/ContentProvider.png rename images/{ => Android}/Context 类层次.png (100%) rename images/{ => Android}/Context.png (100%) rename images/{ => Android}/DeceAcceInterpolator.gif (100%) rename "images/I\\O 流程.png" => "images/Android/I\\O 流程.png" (100%) rename "images/I\\O 请求流程.png" => "images/Android/I\\O 请求流程.png" (100%) rename "images/Linux I\\O 模型.png" => "images/Android/Linux I\\O 模型.png" (100%) rename images/{ => Android}/RecyclerView.png (100%) rename images/{ => Android}/SharedPreferences.png (100%) rename images/{ => Android}/SnapView.png (100%) rename images/{ => Android}/TypeEvaluator.gif (100%) rename images/{ => Android}/WebView.png (100%) rename images/{ => Java}/String.png (100%) rename images/{ => Java}/compact_after.png (100%) rename images/{ => Java}/compact_before.png (100%) rename images/{ => Java}/反射.png (100%) rename images/{ => Java}/泛型.png (100%) diff --git a/blogs/Activity.md b/blogs/Activity.md deleted file mode 100644 index 64e6405..0000000 --- a/blogs/Activity.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -Activity ---- - -#### 目录 - -1. 思维导图 -2. 基本使用 - - - Activity 启动以及生命周期 - - Activity 启动 - - 显式启动 - - 隐式启动 - - 生命周期 - - 正常生命周期 - - 异常生命周期 - - 横竖屏切换 - - 异常退出 - - 启动模式 - - standard - - singleTop - - singleTask - - singleInstance - - 常用回调函数 - - - setResult / onActivityResult - - - onNewIntent - - onConfigurationChanged - - onSaveInstanceState / onRestoreInstanceState - - onTrimMemory - - 通信交互 - - - 与 Activity 通信 - - 与 Fragment 通信 - - 与 Service 通信 -3. 高级玩法 - - 根 Activity 启动流程 \ No newline at end of file diff --git a/blogs/Animator.md b/blogs/Android/Animator.md similarity index 100% rename from blogs/Animator.md rename to blogs/Android/Animator.md diff --git a/blogs/Android/AsyncTask.md b/blogs/Android/AsyncTask.md new file mode 100644 index 0000000..0484e16 --- /dev/null +++ b/blogs/Android/AsyncTask.md @@ -0,0 +1,25 @@ +--- +AsyncTask +--- + +#### 目录 + +1. 思维导图 +2. 概述 +3. 具体使用 +4. 源码分析 +5. 参考 + +#### 思维导图 + +#### 概述 + +AsyncTask 是一个轻量级的异步任务类、抽象泛型类。 + +#### 具体使用 + +#### 源码分析 + +#### 参考 + +[译文:Android中糟糕的AsyncTask](https://droidyue.com/blog/2014/11/08/bad-smell-of-asynctask-in-android/) \ No newline at end of file diff --git a/blogs/Android/Bundle.md b/blogs/Android/Bundle.md index a51b87f..956c98f 100644 --- a/blogs/Android/Bundle.md +++ b/blogs/Android/Bundle.md @@ -7,6 +7,9 @@ Bundle、ArrayMap、SparseArray 1. 思维导图 2. Bundle 3. ArrayMap + - 概述 + - 源码分析 + - 注意事项 4. SparseArray 5. 参考 @@ -25,18 +28,41 @@ Android 为什么要设计出 Bundle 而不是直接使用 HashMap 来进行数 #### ArrayMap -ArrayMap 的内部实现是两个数组,一个 int 数组存储 key 的哈希值,一个对象数组保存 key 和 value,内部使用二分法对 key 进行排序,所以在添加、删除、查找数据的时候,都会使用二分法查找,适合小数据量操作,如果在数据量比较大的情况下,那么它的性能将退化。而 HashMap 内部则是数组+链表结构,所以在数据量较小的时候,HashMap 的 Entry Array 比 ArrayMap 占用更多的内存。同时,ArrayMap 避免了自动装箱。 +##### 概述 + +ArrayMap 的内部实现是两个数组,一个 int 数组存储 key 的哈希值,一个对象数组保存 key 和 value,内部使用二分法对 key 进行排序,所以在添加、删除、查找数据的时候,都会使用二分法查找,适合小数据量操作,如果在数据量比较大的情况下,那么它的性能将退化。而 HashMap 内部则是数组+链表结构,所以在数据量较小的时候,HashMap 的 Entry Array 比 ArrayMap 占用更多的内存。 在 Android 中,建议用 ArrayMap 来替换 HashMap。 +##### 源码分析 + +```java +public class SimpleArrayMap { + + int[] mHashes; //由 key 的 hashCode 所组成的数组,从小到大排序 + Object[] mArray; //由 key-value 对所组成的数据,是 mHashes 大小的两倍 + int mSize; // + } +``` + +![](http://gityuan.com/images/arraymap/arrayMap.jpg) + +其中 mSize 记录着该 ArrayMap 对象中有多少对数据,执行 put 或者 append 操作,则 mSize 会加一,执行 remove,mSize 则减一。mSize 往往小于 mHashes.length,如果大于或等于,则说明需要扩容。 + +更多源码分析可以参考:[深度解读ArrayMap优势与缺陷](http://gityuan.com/2019/01/13/arraymap/) + #### SparseArray -SparseArray 和 ArrayMap 类似,但是 SparseArray 只能存储 key 为 int 型的,它比 ArrayMap 少了计算 key 的哈希值,建议用 SparseArray\ 替换 HashMap\。 +SparseArray 和 ArrayMap 类似,但是 SparseArray 只能存储 key 为 int 型的,它比 ArrayMap 少了计算 key 的哈希值,同时对象数组只需要存 value 即可,这也就避免了 key 的装箱操作和分配空间,,建议用 SparseArray\ 替换 HashMap\。 类似的还有 SparseIntArray 代替 HashMap\ 等。 +![](http://gityuan.com/images/arraymap/SparseArray.jpg) + #### 参考 [Android为什么要设计出Bundle而不是直接使用HashMap来进行数据传递](https://github.com/ZhaoKaiQiang/AndroidDifficultAnalysis/blob/master/02.Android%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E8%AE%BE%E8%AE%A1%E5%87%BABundle%E8%80%8C%E4%B8%8D%E6%98%AF%E7%9B%B4%E6%8E%A5%E4%BD%BF%E7%94%A8HashMap%E6%9D%A5%E8%BF%9B%E8%A1%8C%E6%95%B0%E6%8D%AE%E4%BC%A0%E9%80%92.md) +[深度解读ArrayMap优势与缺陷](http://gityuan.com/2019/01/13/arraymap/) + [如何通过 ArrayMap 和 SparseArray 优化 Android App](https://github.com/xitu/gold-miner/blob/master/TODO/android-app-optimization-using-arraymap-and-sparsearray.md) \ No newline at end of file diff --git a/blogs/Android/ContextProvider.md b/blogs/Android/ContextProvider.md new file mode 100644 index 0000000..ab36ec9 --- /dev/null +++ b/blogs/Android/ContextProvider.md @@ -0,0 +1,376 @@ +--- +ContentProvider +--- + +#### 目录 + +1. 思维导图 +2. 概述 +3. 统一资源标识符(URI) +4. MIME 数据类型 +5. ContentProvider + - 组织数据方式 + - 主要方法 +6. 辅助工具类 + - ContentResolver + - ContentUris + - UriMatcher + - ContentObserver +7. 实例 + - 获取手机通讯录信息 + - 结合 SQLite +8. 参考 + +#### 思维导图 + +![](https://i.loli.net/2019/02/05/5c597c4f25157.png) + +#### 概述 + +ContextProvider 为存储和获取数据提供了统一的接口,可以在不同的应用程序之间安全的共享数据。它允许把自己的应用数据根据需求开放给其他应用进行增删改查。数据的存储方式还是之前的方式,它只是提供了一个统一的接口去访问数据。 + +#### 统一资源标识符 + +统一资源标识符即 URI,用来唯一标识 ContentProvider 其中的数据,外界进程通过 URI 找到对应的 ContentProvider 其中的数据,在进行数据操作。 + +URI 分为系统预置和自定义,分别对应系统内置的数据(如通讯录等)和自定义数据库。 + +##### 系统内置 URI + +比如获取通讯录信息所需要的 URI:ContactsContract.CommonDataKinds.Phone.CONTENT_URI。 + +##### 自定义 URI + +```java +格式:content://authority/path/id +authority:授权信息,用以区分不同的 ContentProvider +path:表名,用以区分 ContentProvider 中不同的数据表 +id: ID号,用以区别表中的不同数据 +示例:content://com.example.omooo.demoproject/User/1 +上述 URI 指向的资源是:名为 com.example.omooo.demoproject 的 ContentProvider 中表名为 User 中 id 为 1 的数据。 +``` + +注意,URI 也存在匹配通配符:* & # + +#### MIME 数据类型 + +它是用来指定某个扩展名的文件用某种应用程序来打开。 + +可以通过 ContentProvider.getType(uri) 来获得。 + +每种 MIME 类型由两部分组成:类型 + 子类型。 + +示例:text/html、application/pdf + +#### ContentProvider + +##### 组织数据方式 + +ContentProvider 主要以表格的形式组织数据,同时也支持文件数据,只是表格形式用的比较多,每个表格中包含多张表,每张表包含行和列,分别对应数据。 + +##### 主要方法 + +```java +public class MyProvider extends ContentProvider { + + @Override + public boolean onCreate() { + return false; + } + + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { + return null; + } + + @Override + public String getType(Uri uri) { + return null; + } + + @Override + public Uri insert(Uri uri, ContentValues values) { + return null; + } + + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + return 0; + } + + @Override + public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { + return 0; + } +} +``` + +#### 辅助工具类 + +##### ContentResolver + +统一管理不同的 ContentProvider 间的操作。 + +1. 即通过 URI 即可操作不同的 ContentProvider 中的数据 +2. 外部进程通过 ContentResolver 类从而与 ContentProvider 类进行交互 + +一般来说,一款应用要使用多个 ContentProvider,若需要了解每个 ContentProvider 的不同实现从而在完成数据交互,操作成本高且难度大,所以在 ContentProvider 类上多加一个 ContentResolver 类对所有的 ContentProvider 进行统一管理。 + +ContentResolver 类提供了与 ContentProvider 类相同名字和作用的四个方法: + +```java +// 外部进程向 ContentProvider 中添加数据 +public Uri insert(Uri uri, ContentValues values)  + +// 外部进程 删除 ContentProvider 中的数据 +public int delete(Uri uri, String selection, String[] selectionArgs) + +// 外部进程更新 ContentProvider 中的数据 +public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)  + +// 外部应用 获取 ContentProvider 中的数据 +public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) +``` + +```java +// 使用ContentResolver前,需要先获取ContentResolver +// 可通过在所有继承Context的类中 通过调用getContentResolver()来获得ContentResolver +ContentResolver resolver = getContentResolver(); + +// 设置ContentProvider的URI +Uri uri = Uri.parse("content://cn.scu.myprovider/user"); + +// 根据URI 操作 ContentProvider中的数据 +// 此处是获取ContentProvider中 user表的所有记录 +Cursor cursor = resolver.query(uri, null, null, null, "userid desc"); +``` + +##### ContentUris + +用来操作 URI 的,常用有两个方法: + +```java +// withAppendedId()作用:向URI追加一个id +Uri uri = Uri.parse("content://cn.scu.myprovider/user") +Uri resultUri = ContentUris.withAppendedId(uri, 7); +// 最终生成后的Uri为:content://cn.scu.myprovider/user/7 + +// parseId()作用:从URL中获取ID +Uri uri = Uri.parse("content://cn.scu.myprovider/user/7") +long personid = ContentUris.parseId(uri); +//获取的结果为:7 +``` + +##### UriMatcher + +在 ContentProvider 中注册 URI,根据 URI 匹配 ContentProvider 中对应的数据表。 + +```java + // 步骤1:初始化UriMatcher对象 + UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); + //常量UriMatcher.NO_MATCH = 不匹配任何路径的返回码 + // 即初始化时不匹配任何东西 + + // 步骤2:在ContentProvider 中注册URI(addURI()) + int URI_CODE_a = 1; + int URI_CODE_b = 2; + matcher.addURI("cn.scu.myprovider", "user1", URI_CODE_a); + matcher.addURI("cn.scu.myprovider", "user2", URI_CODE_b); + // 若URI资源路径 = content://cn.scu.myprovider/user1 ,则返回注册码URI_CODE_a + // 若URI资源路径 = content://cn.scu.myprovider/user2 ,则返回注册码URI_CODE_b + + // 步骤3:根据URI 匹配 URI_CODE,从而匹配ContentProvider中相应的资源(match()) + +@Override + public String getType(Uri uri) { + Uri uri = Uri.parse(" content://cn.scu.myprovider/user1"); + + switch(matcher.match(uri)){ + // 根据URI匹配的返回码是URI_CODE_a + // 即matcher.match(uri) == URI_CODE_a + case URI_CODE_a: + return tableNameUser1; + // 如果根据URI匹配的返回码是URI_CODE_a,则返回ContentProvider中的名为tableNameUser1的表 + case URI_CODE_b: + return tableNameUser2; + // 如果根据URI匹配的返回码是URI_CODE_b,则返回ContentProvider中的名为tableNameUser2的表 + } +} +``` + +##### ContentObserver + +内容观察者,当 ContentProvider 中的数据发生变化时,就会触发 ContentObserver 类。 + +```java + // 步骤1:注册内容观察者ContentObserver + getContentResolver().registerContentObserver(uri); + // 通过ContentResolver类进行注册,并指定需要观察的URI + + // 步骤2:当该URI的ContentProvider数据发生变化时,通知外界(即访问该ContentProvider数据的访问者) + public class UserContentProvider extends ContentProvider { + public Uri insert(Uri uri, ContentValues values) { + db.insert("user", "userid", values); + getContext().getContentResolver().notifyChange(uri, null); + // 通知访问者 + } +} + + // 步骤3:解除观察者 + getContentResolver().unregisterContentObserver(uri); + // 同样需要通过ContentResolver类进行解除 +``` + +#### 实例 + +##### 获取通讯录信息 + +这里就不需要自己写 ContentProvider 的实现了,用系统已经给的 URI。 + +```java + /** + * 获取通讯录信息 + */ + private void getContactsInfo() { + Cursor cursor = getContentResolver().query( + ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null + ); + if (cursor != null) { + while (cursor.moveToNext()) { + //联系人姓名 + String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); + //联系人手机号 + String phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); + Log.i(TAG, "getContactsInfo: name: " + name + " phone: " + phoneNumber); + } + cursor.close(); + } + } +``` + +##### 结合 SQLite + +1. 创建数据库 +2. 自定义 ContentProvider 并注册 +3. 进程内访问数据 + +创建数据库: + +```java +public class MySQLiteOpenHelper extends SQLiteOpenHelper { + + public MySQLiteOpenHelper(Context context) { + super(context, "user.info", null, 1); + } + + @Override + public void onCreate(SQLiteDatabase db) { + db.setPageSize(1024 * 4); +// db.enableWriteAheadLogging(); + db.execSQL("CREATE TABLE if not exists user (name text, age string)"); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + + } +} +``` + +自定义 ContentProvider 并注册: + +```java +public class MyProvider extends ContentProvider { + + private static UriMatcher mUriMatcher; + + static { + mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); + mUriMatcher.addURI("com.example.omooo.demoproject.provider", "user", 1); + } + + private MySQLiteOpenHelper mMySQLiteOpenHelper; + private SQLiteDatabase mSQLiteDatabase; + private Context mContext; + + @Override + public boolean onCreate() { + mContext = getContext(); + mMySQLiteOpenHelper = new MySQLiteOpenHelper(mContext); + mSQLiteDatabase = mMySQLiteOpenHelper.getWritableDatabase(); + mSQLiteDatabase.execSQL("insert into user values('Omooo','18');"); + return true; + } + + @Nullable + @Override + public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) { + return mSQLiteDatabase.query("user", projection, selection, selectionArgs, null, null, sortOrder, null); + } + + @Nullable + @Override + public String getType(@NonNull Uri uri) { + return null; + } + + @Nullable + @Override + public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) { + mSQLiteDatabase.insert("user", null, values); + mContext.getContentResolver().notifyChange(uri, null); + return uri; + } + + + @Override + public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) { + return 0; + } + + @Override + public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) { + return 0; + } + +} +``` + +```xml + +``` + +进程内访问数据: + +```java + private void insertTable() { + Uri uri = Uri.parse("content://com.example.omooo.demoproject.provider/user"); + ContentValues values = new ContentValues(); + values.put("name", "Test"); + values.put("age", "21"); + ContentResolver resolver = getContentResolver(); + resolver.insert(uri, values); + Cursor cursor = resolver.query(uri, new String[]{"name", "age"}, null, null, null); + if (cursor != null) { + while (cursor.moveToNext()) { + String name = cursor.getString(cursor.getColumnIndex("name")); + String age = cursor.getString(cursor.getColumnIndex("age")); + Log.i(TAG, "insertTable: name: " + name + " age: " + age); + } + cursor.close(); + } + } +``` + + + +#### 参考 + +[Android:关于ContentProvider的知识都在这里了!](https://www.jianshu.com/p/ea8bc4aaf057) + +[ContentProvider 从入门到精通](https://juejin.im/entry/5726d30e49830c0053562f1a) + +[系统自带ContentProvider的常用Uri地址](https://www.cnblogs.com/tangs/articles/5756320.html) \ No newline at end of file diff --git "a/blogs/Dalvik \\ ART.md" "b/blogs/Android/Dalvik \\ ART.md" similarity index 100% rename from "blogs/Dalvik \\ ART.md" rename to "blogs/Android/Dalvik \\ ART.md" diff --git a/blogs/Android/HandlerThread.md b/blogs/Android/HandlerThread.md new file mode 100644 index 0000000..c224645 --- /dev/null +++ b/blogs/Android/HandlerThread.md @@ -0,0 +1,172 @@ +--- +HandlerThread +--- + +#### 目录 + +1. 思维导图 +2. 概述 +3. 具体使用 +4. 源码分析 +5. 参考 + +#### 思维导图 + +#### 概述 + +HandlerThread 继承于 Thread,所以它本质就是个 Thread。与普通 Thread 的区别在于,它不仅建立了一个线程,并且创建了消息队列,有自己的 Looper,可以让我们在自己的线程中分发和处理消息,并对外提供自己的 Looper 的 get 方法。 + +HandlerThread 自带 Looper 使它可以通过消息队列来重复使用当前线程,节省系统资源开销。这是它的优点也是缺点,每个任务都将以队列的方式逐个被执行到,一旦队列中有某个任务执行时间过长,那么就会导致后续的任务都会被延迟处理。 + +#### 具体使用 + +```java +public class HandlerThreadActivity extends AppCompatActivity { + + private Button mButton; + private HandlerThread mHandlerThread; + private Handler mUiHandler; + private Handler mChildHandler; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_handler); + initView(); + + mHandlerThread = new HandlerThread("HandlerThread"); + mHandlerThread.start(); + mUiHandler = new Handler(new Handler.Callback() { + @Override + public boolean handleMessage(Message msg) { + if (msg.what == 2) { + mButton.setText("子线程更新"); + } + return false; + } + }); + mChildHandler = new Handler(mHandlerThread.getLooper(), new Handler.Callback() { + @Override + public boolean handleMessage(Message msg) { + if (msg.what == 1) { + try { + //子线程模拟延迟处理 + Thread.sleep(2000); + mUiHandler.sendEmptyMessage(2); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + return false; + } + }); + + } + + public void initView() { + mButton = findViewById(R.id.btn_show); + mButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mChildHandler.sendEmptyMessage(1); + } + }); + } +} +``` + +#### 源码分析 + +```java +public class HandlerThread extends Thread { + int mPriority; + int mTid = -1; + Looper mLooper; + private @Nullable Handler mHandler; + + public HandlerThread(String name) { + super(name); + mPriority = Process.THREAD_PRIORITY_DEFAULT; + } + + public HandlerThread(String name, int priority) { + super(name); + mPriority = priority; + } + + protected void onLooperPrepared() { + } + + @Override + public void run() { + mTid = Process.myTid(); + Looper.prepare(); + synchronized (this) { + mLooper = Looper.myLooper(); + notifyAll(); + } + Process.setThreadPriority(mPriority); + onLooperPrepared(); + Looper.loop(); + mTid = -1; + } + + public Looper getLooper() { + if (!isAlive()) { + return null; + } + + synchronized (this) { + while (isAlive() && mLooper == null) { + try { + wait(); + } catch (InterruptedException e) { + } + } + } + return mLooper; + } + + @NonNull + public Handler getThreadHandler() { + if (mHandler == null) { + mHandler = new Handler(getLooper()); + } + return mHandler; + } + + public boolean quit() { + Looper looper = getLooper(); + if (looper != null) { + looper.quit(); + return true; + } + return false; + } + + public boolean quitSafely() { + Looper looper = getLooper(); + if (looper != null) { + looper.quitSafely(); + return true; + } + return false; + } + + public int getThreadId() { + return mTid; + } +} +``` + +源码很简单,就是在 run 方法中执行 Looper.prepare()、Looper.loop() 构造消息循环系统。外界可以通过 getLooper() 这个方法拿到这个 Looper。 + +总结为下: + +1. HandlerThread 是一个自带 Looper 的线程,因此只能作为子线程使用 +2. HandlerThread 必须配合 Handler 使用,HandlerThread 线程中具体做什么事,需要在 Handler 的 callback 中进行,因为它自己的 run 方法被写死了 +3. 子线程的 Handler 与 HandlerThread 关系建立是通过构造子线程的Handler 传入 HandlerThread 的 Looper 。所以在此之前,必须先调用 mHandlerThread.start 让 run 方法跑起来 Looper 才能创建。 + +#### 参考 + +[Android中的线程形态(二)(HandlerThread/IntentService)](https://www.jianshu.com/p/4ca760e5040b) \ No newline at end of file diff --git a/blogs/Android/IntentService.md b/blogs/Android/IntentService.md new file mode 100644 index 0000000..7cf7244 --- /dev/null +++ b/blogs/Android/IntentService.md @@ -0,0 +1,194 @@ +--- +IntentService +--- + +#### 目录 + +1. 思维导图 +2. 概述 +3. 具体使用 +4. 源码分析 +5. 参考 + +#### 思维导图 + +#### 概述 + +IntentService 是继承于 Service 并处理异步请求的一个类,内部实现是 HandlerThread,处理完子线程的事后自动 stopService。 + +#### 具体使用 + +首先创建: + +```java +public class MyIntentService extends IntentService { + + private static final String TAG = "MyIntentService"; + + public MyIntentService() { + //IntentService 工作线程的名字 + super("MyIntentService"); + } + + @Override + public void onCreate() { + super.onCreate(); + Log.i(TAG, "onCreate: "); + } + + @Override + public int onStartCommand(@Nullable Intent intent, int flags, int startId) { + Log.i(TAG, "onStartCommand: "); + return super.onStartCommand(intent, flags, startId); + } + + @Override + public void onDestroy() { + super.onDestroy(); + Log.i(TAG, "onDestroy: "); + } + + @Override + protected void onHandleIntent(@Nullable Intent intent) { + if (intent != null) { + String taskName = intent.getStringExtra("taskName"); + Log.i(TAG, "onHandleIntent: " + taskName); + switch (taskName) { + case "task1": + //任务一 + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + break; + case "task2": + //任务二 + break; + default: + break; + } + } + } +} +``` + +Activity 中: + +```java + public void onClick(View v) { + Intent intent = new Intent(this, MyIntentService.class); + switch (v.getId()) { + case R.id.btn1: + intent.putExtra("taskName", "task1"); + startService(intent); + break; + case R.id.btn2: + intent.putExtra("taskName", "task2"); + startService(intent); + break; + default: + break; + } + } +``` + +这里如果点击按钮一后立马点击按钮二,日志打印如下: + +``` +onCreate、onStartCommand、onHandleIntent: task1、 +onStartCommand、onHandleIntent: task2、onDestroy +``` + +如果是等三秒后再点击按钮二,就是: + +``` +onCreate、onStartCommand、onHandleIntent: task1、onDestroy、 +onCreate、onStartCommand、onHandleIntent: task2、onDestroy +``` + +这下就清楚了吧。 + +#### 源码分析 + +```java +public abstract class IntentService extends Service { + private volatile Looper mServiceLooper; + private volatile ServiceHandler mServiceHandler; + private String mName; + private boolean mRedelivery; + + private final class ServiceHandler extends Handler { + public ServiceHandler(Looper looper) { + super(looper); + } + + @Override + public void handleMessage(Message msg) { + //重写的方法,子线程需要做的事情 + onHandleIntent((Intent)msg.obj); + //做完事,自动停止 + stopSelf(msg.arg1); + } + } + + public IntentService(String name) { + super(); + //IntentService 的线程名 + mName = name; + } + + public void setIntentRedelivery(boolean enabled) { + mRedelivery = enabled; + } + + @Override + public void onCreate() { + super.onCreate(); + HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); + thread.start(); + + //构造子线程 Handler + mServiceLooper = thread.getLooper(); + mServiceHandler = new ServiceHandler(mServiceLooper); + } + + @Override + public void onStart(@Nullable Intent intent, int startId) { + Message msg = mServiceHandler.obtainMessage(); + msg.arg1 = startId; + msg.obj = intent; + //在 Service 启动的时候发送消息,子线程开始工作 + mServiceHandler.sendMessage(msg); + } + + @Override + public int onStartCommand(@Nullable Intent intent, int flags, int startId) { + //调用上面的那个方法,促使子线程开始工作 + onStart(intent, startId); + return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY; + } + + @Override + public void onDestroy() { + mServiceLooper.quit(); + } + + @Override + @Nullable + public IBinder onBind(Intent intent) { + return null; + } + + @WorkerThread + protected abstract void onHandleIntent(@Nullable Intent intent); +} +``` + +总结如下: + +1. Service onCreate 的时候通过 HandlerThread 构建子线程的 Handler +2. Service onStartCommand 中通过子线程 Handler 发送消息 +3. 子线程 handlerMessage 中调用我们重写的 onHandlerIntent 执行异步任务,执行完之后 Service 销毁 + +#### 参考 \ No newline at end of file diff --git a/blogs/RecyclerView.md b/blogs/Android/RecyclerView.md similarity index 100% rename from blogs/RecyclerView.md rename to blogs/Android/RecyclerView.md diff --git a/blogs/SQLite.md b/blogs/Android/SQLite.md similarity index 100% rename from blogs/SQLite.md rename to blogs/Android/SQLite.md diff --git a/blogs/SharedPreferences.md b/blogs/Android/SharedPreferences.md similarity index 100% rename from blogs/SharedPreferences.md rename to blogs/Android/SharedPreferences.md diff --git a/blogs/WebView.md b/blogs/Android/WebView.md similarity index 100% rename from blogs/WebView.md rename to blogs/Android/WebView.md diff --git a/blogs/AOP_AspectJ.md b/blogs/Android/埋点/AOP_AspectJ.md similarity index 100% rename from blogs/AOP_AspectJ.md rename to blogs/Android/埋点/AOP_AspectJ.md diff --git a/blogs/埋点.md b/blogs/Android/埋点/埋点.md similarity index 100% rename from blogs/埋点.md rename to blogs/Android/埋点/埋点.md diff --git a/blogs/埋点之代理 View.OnClickListener.md b/blogs/Android/埋点/埋点之代理 View.OnClickListener.md similarity index 100% rename from blogs/埋点之代理 View.OnClickListener.md rename to blogs/Android/埋点/埋点之代理 View.OnClickListener.md diff --git a/blogs/埋点之应用前后台判断.md b/blogs/Android/埋点/埋点之应用前后台判断.md similarity index 100% rename from blogs/埋点之应用前后台判断.md rename to blogs/Android/埋点/埋点之应用前后台判断.md diff --git a/blogs/Android/屏幕适配.md b/blogs/Android/屏幕适配.md new file mode 100644 index 0000000..59753f4 --- /dev/null +++ b/blogs/Android/屏幕适配.md @@ -0,0 +1,18 @@ +--- +屏幕适配 +--- + +#### 目录 + +1. 思维导图 +2. 适配方案 +3. 参考 + +#### 思维导图 + +#### 适配方案 + +#### 参考 + +[一种极低成本的Android屏幕适配方式](https://mp.weixin.qq.com/s/d9QCoBP6kV9VSWvVldVVwA) + diff --git "a/blogs/I\\O 优化.md" "b/blogs/Android/性能优化/I\\O 优化.md" similarity index 100% rename from "blogs/I\\O 优化.md" rename to "blogs/Android/性能优化/I\\O 优化.md" diff --git a/blogs/Android/热修复.md b/blogs/Android/热修复.md index de1390b..a06f021 100644 --- a/blogs/Android/热修复.md +++ b/blogs/Android/热修复.md @@ -6,13 +6,19 @@ 1. 思维导图 2. 概述 -3. 原理浅析 +3. ClassLoader + - BaseDexClassLoader + - PathClassLoader + - DexClassLoader + - SecureClassLoader + - URLClassLoader +4. 原理浅析 - BaseDexClassLoader - PathClassLoader - DexClassLoader - DexPathList -4. 实战 -5. 参考 +5. 实战 +6. 参考 #### 思维导图 @@ -24,6 +30,22 @@ 在加载 dex 文件的时候,是放在一个 Element[] 数组里的,我们只要把修复好的 classes.dex 文件放在数组最前面被优先加载,那在加载有 bug 的 dex 文件里的 class 类的时候已经被加载过了,系统就不会加载,这时候带有 bug 的 class 就算被 “修复” 了。 +#### ClassLoader + +ClassLoader 是个抽象类,其具体的实现的子类有 BaseDexClassLoader 和 SecureClassLoader。 + +##### BaseDexClassLoader + +它也有两个子类,分别是 PathClassLoader 和 DexClassLoader。 + +其中 PathClassLoader 只能加载安装在 Android 系统内 APK 文件(/data/app 目录下),其他位置的文件加载时都会报 ClassNotFoundException。因为 PathClassLoader 会读取 /data/dalvik-cache 目录下的经过 Dalvik 优化过的 dex 文件,这个目录的 dex 文件是在安装 apk 包的时候由 Dalvik 生成的,没有安装的时候,自然没有生成这个文件。 + +DexClassLoader 可从任意目录加载 jar/apk/dex。 + +##### URLClassLoader + +只能用来加载 jar 文件,这在 Android 的 Dalvik/ART 上没法使用。 + #### 原理浅析 热修复涉及的就是 dex 的加载流程。涉及的类有 BaseDexClassLoader、DexClassLoader、PathClassLoader、DexPathList 等等。 @@ -73,8 +95,6 @@ public class BaseDexClassLoader extends ClassLoader { 其实 BaseDexClassLoader 的 findClass 是调用 DexPathList 的 findClass 方法,如果为 null 就抛出 ClassNotFoundException。 -##### DexClassLoader - ##### PathClassLoader ```java @@ -104,9 +124,11 @@ public class DexClassLoader extends BaseDexClassLoader { 可以看到,其实 DexClassLoader 和 PathClassLoader 都没有做什么,都是调用父类方法,只不过 DexClassLoader 多传了一个optimizedDirectory,它们的使用场景不一样: -PathClassLoader:只能加载已经安装到 Android 系统中的 apk 文件,是 Android 默认使用的类加载器。 +PathClassLoader:用于加载 Android 系统类和开发编写应用的类,只能加载已经安装应用的 dex 或 apk 文件,是 Android 默认使用的类加载器,也是 getSystemClassLoader 的返回对象。 + +DexClassLoader:可以加载任意目录下的 dex/jar/apk/zip 文件,是实现热修复的重点。 -DexClassLoader:可以加载任意目录下的 dex/jar/apk/zip 文件,比 PathClassLoader,是实现热修复的重点。 +BootClassLoader:主要用于加载系统的类,包括 java 和 android 系统的类库,和 JVM 中不同,BootClassLoader 是 ClassLoader 内部类,是由 Java 实现,它也是所有系统 ClassLoader 的 父 ClassLoader。 ##### DexPathList @@ -265,4 +287,6 @@ final class DexPathList { [网易云课堂]( https://study.163.com/course/courseLearn.htm?courseId=1208968811#/learn/live?lessonId=1278455246&courseId=1208968811) -[热修复——Tinker 的集成与使用](https://mp.weixin.qq.com/s/xpB_ipYv9cN8k8fdr_7wCw) \ No newline at end of file +[热修复——Tinker 的集成与使用](https://mp.weixin.qq.com/s/xpB_ipYv9cN8k8fdr_7wCw) + +[剖析ClassLoader深入热修复原理](https://www.jianshu.com/p/95387cc07e3c) \ No newline at end of file diff --git a/blogs/String.md b/blogs/Java/String.md similarity index 100% rename from blogs/String.md rename to blogs/Java/String.md diff --git a/blogs/final.md b/blogs/Java/final.md similarity index 100% rename from blogs/final.md rename to blogs/Java/final.md diff --git a/blogs/反射.md b/blogs/Java/反射.md similarity index 100% rename from blogs/反射.md rename to blogs/Java/反射.md diff --git a/blogs/泛型.md b/blogs/Java/泛型.md similarity index 100% rename from blogs/泛型.md rename to blogs/Java/泛型.md diff --git a/blogs/注解.md b/blogs/Java/注解.md similarity index 98% rename from blogs/注解.md rename to blogs/Java/注解.md index ea0a08d..3fddeca 100644 --- a/blogs/注解.md +++ b/blogs/Java/注解.md @@ -241,8 +241,6 @@ Java 源代码的编译流程分为三个步骤: [浅谈Android下的注解](https://juejin.im/post/5b292b736fb9a00e8c4435f7) -[Android Annotation扫盲笔记](https://juejin.im/post/5a771b8b6fb9a0633c65e947) - [注解处理器](https://time.geekbang.org/column/article/40189) -[注解浅析](https://www.jianshu.com/p/937a15e18eac) \ No newline at end of file +[Java 注解及其在 Android 中的应用](https://juejin.im/post/5b824b8751882542f105447d) \ No newline at end of file diff --git a/images/AOP_AspectJ.png b/images/Android/AOP_AspectJ.png similarity index 100% rename from images/AOP_AspectJ.png rename to images/Android/AOP_AspectJ.png diff --git a/images/Android 虚拟机.png b/images/Android/Android 虚拟机.png similarity index 100% rename from images/Android 虚拟机.png rename to images/Android/Android 虚拟机.png diff --git a/images/Animator.png b/images/Android/Animator.png similarity index 100% rename from images/Animator.png rename to images/Android/Animator.png diff --git a/images/Android/ContentProvider.png b/images/Android/ContentProvider.png new file mode 100644 index 0000000000000000000000000000000000000000..7be4bf791120b9f0e2df1a9fb87fe24173463060 GIT binary patch literal 78208 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

59VTd8_?`-1RJ`*U6mDO7-?P}%Sz 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 N_APCdY^4W}{|Bo{xDNmT literal 0 HcmV?d00001 diff --git a/images/Context 类层次.png b/images/Android/Context 类层次.png similarity index 100% rename from images/Context 类层次.png rename to images/Android/Context 类层次.png diff --git a/images/Context.png b/images/Android/Context.png similarity index 100% rename from images/Context.png rename to images/Android/Context.png diff --git a/images/DeceAcceInterpolator.gif b/images/Android/DeceAcceInterpolator.gif similarity index 100% rename from images/DeceAcceInterpolator.gif rename to images/Android/DeceAcceInterpolator.gif diff --git "a/images/I\\O 流程.png" "b/images/Android/I\\O 流程.png" similarity index 100% rename from "images/I\\O 流程.png" rename to "images/Android/I\\O 流程.png" diff --git "a/images/I\\O 请求流程.png" "b/images/Android/I\\O 请求流程.png" similarity index 100% rename from "images/I\\O 请求流程.png" rename to "images/Android/I\\O 请求流程.png" diff --git "a/images/Linux I\\O 模型.png" "b/images/Android/Linux I\\O 模型.png" similarity index 100% rename from "images/Linux I\\O 模型.png" rename to "images/Android/Linux I\\O 模型.png" diff --git a/images/RecyclerView.png b/images/Android/RecyclerView.png similarity index 100% rename from images/RecyclerView.png rename to images/Android/RecyclerView.png diff --git a/images/SharedPreferences.png b/images/Android/SharedPreferences.png similarity index 100% rename from images/SharedPreferences.png rename to images/Android/SharedPreferences.png diff --git a/images/SnapView.png b/images/Android/SnapView.png similarity index 100% rename from images/SnapView.png rename to images/Android/SnapView.png diff --git a/images/TypeEvaluator.gif b/images/Android/TypeEvaluator.gif similarity index 100% rename from images/TypeEvaluator.gif rename to images/Android/TypeEvaluator.gif diff --git a/images/WebView.png b/images/Android/WebView.png similarity index 100% rename from images/WebView.png rename to images/Android/WebView.png diff --git a/images/String.png b/images/Java/String.png similarity index 100% rename from images/String.png rename to images/Java/String.png diff --git a/images/compact_after.png b/images/Java/compact_after.png similarity index 100% rename from images/compact_after.png rename to images/Java/compact_after.png diff --git a/images/compact_before.png b/images/Java/compact_before.png similarity index 100% rename from images/compact_before.png rename to images/Java/compact_before.png diff --git a/images/反射.png b/images/Java/反射.png similarity index 100% rename from images/反射.png rename to images/Java/反射.png diff --git a/images/泛型.png b/images/Java/泛型.png similarity index 100% rename from images/泛型.png rename to images/Java/泛型.png