../img/avatar.png

This Tinggeng

Ubuntu下SublimeText3中文输入法修复

概述 本文记录在 ubuntu 如何修复 Sublime Text 不能输入中文的问题. 问题 在 ubuntu 下安装完 Sublime Text之后,发现不能输入中文,也不能正常的切换成中文输入法.google 了一圈之后,看到网上的解决方案,记录下来,方便日后使用. 解决方案 1. 编译一段C代码.保存以下的代码,并将文件命名为 sublime-imfix.c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 /* sublime-imfix.

AndroidStudio引入AAR依赖

概述 本文介绍 AndroidStudio 项目如何如何进行 aar 包依赖. AndroidStudio如何引用aar依赖 未成功方案 google 了一圈,网上的方法基本都是以下这种,在 module/build.gradle 文件中添加如下代码.同时将 aar 文件 copy 到 libs 文件夹下. 1 2 3 4 5 repositories { flatDir { dirs 'libs' } } compile(name:'aarName', ext:'aar') 我尝试了很多次,没有成功. 亲测有效方案 采用了以下方法成功了,和上面的内容一致,只是位置不一样. project 目录下新建一个目录 aars(名字应该随意),新建的 aars 文件夹是用来存放需要 aar 包的. 在 project 下的 build.gradle 中添加代码. 1 2 3 4 5 6 7 8 9 allprojects { repositories { jcenter() //为了添加aar依赖 flatDir { dirs '../aars' } } } 注意: 是在根目录下的 build.

DDMS_Threads的简单使用

概述 本文记录在 DDMS 如何查看线程的状态,以及状态表达的含义. 使用 DDMS 查看进程中的线程状态 简介 DDMS(Dalvik Debug Monitor Service),是 Android 开发的调试工具。 如何工作 在 Android 系统中每个应用都是在单独的一个进程中运行,DDMS 可以将一个进程通过 adb 和 IDE 连接,进行调试。 面板讲解 Threads 在左侧选中想要监控的进程,点击上方左起第五个图标(Update Threads) ,在对应的右侧打开 Threads 面板,就可以看到当前进程中的 线程状态。 字段讲解 ID: 线程ID,是当前进程分配的唯一的线程ID.在 Dalvik 虚拟机中,这些值是从奇数3开始计数。 Tid: Linux 线程 ID, 对于一个进程的主线程而言,这个 ID 对应了进程 ID 。 Status: 该线程在进程中的状态,守护进程(Daemon thread)前面被标记了一个星号 ( * ) 。状态可取的值: running: 正在运行的线程。 sleeping: 休眠的,等待被唤醒的线程。 monitor: 监视,正在等待获取一个监控锁。 wait: 执行了wait方法,释放了对象锁。 native: 正在执行 native 代码。 vmwait: 正在等待虚拟机的资源。 zombie: 僵尸线程,即将销往的进程的线程。 init : 初始化中的线程(理论上不应该看得到) starting : 即将启动的线程(理论上不应该看得到) utime: 花费在用户代码所花的累计时间,一小会儿(通常是10ms)。只有在linux环境下,才能看到。PS:windows 下。 DDMS 看得到,不知道他这里有啥特别的含义。 stime : 花费在系统代码上的累计时间,一小会儿(通常是10ms)。 Name: 线程名。 “ID” 和 “Name” 是在线程启动的时候被设置的。其他的字段是每过一段时间就更新一下(默认是4秒)

Notification_之利用TaskStackBuilder返回App主页

概述 本文记录点击 Notification ,然后停留在 APP 内,而不是返回主页. 背景: 一个App会通过通知(Notification)的形式推广自己产品的内容,点击通知,想要看到推送的详情页,点击返回的时候,我们想让用户返回的是App的主页,而不是桌面。这样可以提高转化率等。以前的实现方式是通过重写了每个activity的返回键的响应,现在可以通过TaskStackBuilder 来实现。在网上查看了很多资料,真正正确的倒是没找到。 TaskStackBuilder 简介 Utility class for constructing synthetic back stacks for cross-task navigation on Android 3.0 and newer.是一个能够构造返回栈,来实现跨task导航的一个工具类。因为可以构造任务栈,所以,我们可以轻松的实现一个activity返回的上一个任务是什么。 实现步骤 1.首先创建一个点击了notification之后跳转到的详情页的intent对象。 1 Intent resultIntent = new Intent(this, ResultActivity.class); 2.在manifest中声明详情页ResultActivity的栈中前一个activity,声明的这个activity就是详情页点击返回键所要跳转的activity。 1 2 3 4 5 6 7 <activity android:name="cn.steve.notification.ResultActivity" android:parentActivityName="cn.steve.notification.NotificationHandlerActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="cn.steve.notification.NotificationHandlerActivity"/> </activity> 创建一个PendingIntent对象,这个是创建notification的必备。 1 2 3 PendingIntent pendingIntent = TaskStackBuilder.create(this) .addNextIntentWithParentStack(resultIntent) .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 剩下的就是正常的启动一个notification了。 1 2 3 4 5 6 7 8 9 // new notification NotificationCompat.

Service之IntentService

概述 本文记录 IntentService 的使用方式,以及可能产生的问题. IntentService 关于IntentService本身的使用很简单,官方的解释也说的很清楚。IntentService是Service类的子类,用来处理异步请求。和正常启动一个Service一样,可以通过startService(Intent)方法启动一个IntentService,同时通过Intent传递数据。IntentService在onCreate()函数中通过HandlerThread开启一个线程来处理Intent请求对象,这样就可以在非主线程执行任务。这里处理消息的时候,也是通过为新创建的线程新建了Handler和Looper对象从消息队列中取出消息进行执行。处理每个Intent所对应的事务都需要调用 onHandleIntent 这个抽象方法。所以,将对不同任务的不同操作通过实现 onHandleIntent 方法就可完成。 执行完这个任务(Intent)就会自动停止 Service 。这里有一点需要注意,如果这个任务的执行本身就是异步的,所以,假如添加的任务也是异步的,很难保证能正常执行结束。 1 2 3 4 5 6 7 8 9 10 11 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); } } 从代码可以看出,每执行一次onHandleIntent 都会调用执行 stopSelf 来停止当前的service。也就是假如子类实现的 onHandleIntent 中执行的是异步任务,异步任务可能得不到预期的结果。 举个例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 public static void startActionBaz(Context context, String param1, String param2) { Intent intent = new Intent(context, MyIntentService.

一个例子说明如何使用 RxJava 进行线程切换

概述 本文仅作记录如何在上层使用代码进行 RxJava 的线程切换. RxJava 线程管理 RxJava 中通过两个关键的方法 subscribeOn 和 observeOn 实现线程的切换,都说 RxJava 是可以任性的随意切换线程,到底可以多任性呢,在哪任性呢,代码上怎么体现呢?下面通过一个非常简单的例子 演示一下如何使用,源码讨论请移步另一篇文章。 ### 测试代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 //验证多线程切换的情况 private void multiThreadSwitch() { Observable.