android Backstack和Task详解

Activity
Activity launchMode taskAffinity allowTaskReparenting
A standard com.timesfire.backstacktest false
A1 standard com.timesfire.backstacktest false
A2 standard com.timesfire.backstacktest false
B singleTop com.timesfire.backstacktest false
C singleTask com.timesfire.backstacktest false
D singleInstance com.timesfire.backstacktest false
E standard com.sujian false
F singleTop com.sujian false
G singleTask com.sujian false
H singleInstance com.sujian false
测试数据
初始Activity栈 启动目标Activity addFlags 结果
A A1 、 A2 、B、C、E、F A与目标Activity在同一个Task中
A D、G、H 会启动新的Task,A与目标Activity在不同Task中
A->C->A1->A2 C 不会开启新的Activity C,首先A1会销毁,接着C中调用onNewIntent()方法,最后A2销毁
A->G C 新启动一个C放在和A同一个Task中,G在另一个Task中
A E FLAG_ACTIVITY_NEW_TASK E 在一个新的Task中启动,与A所在的Task不同
A A1 FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_MULTIPLE_TASK A1 在一个新的Task中启动,与A所在的Task不同。这个始终会开启一个新的Task
A C FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_MULTIPLE_TASK

FLAG_ACTIVITY_MULTIPLE_TASK
A、C在同一个Task中,Flags标签对singleTask不起作用
  • FLAG_ACTIVITY_CLEAR_TOP
    如果正在启动的 Activity 已在当前任务中运行,则会销毁当前任务顶部的所有 Activity,并通过 onNewIntent() 将此 Intent 传递给 Activity 已恢复的实例(现在位于顶部),而不是启动该 Activity 的新实例。
    产生这种行为的 launchMode 属性没有值。
    默认情况 launchMode 的值为 “standard” ,所以这种情况下,当目标Activity已经存在的时,使用这个标记不会调用目标Activity的 onNewIntent()方法,会将目标Activity销毁重建。
    如果将FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_SINGLE_TOP组合使用则会调用目标Activity的onNewIntent()事件,这种情况下类似于使用launchMode=“singleTask”
  • “singleTask”
    并不会始终创建新的Task,如果taskAffinity与启动它的activity不同才会重新创建。FLAG_ACTIVITY_NEW_TASK也需要配置taskAffinity才会生效。
    使用singleTask去开启一个刚启动过的Activity,会掉用onNewIntent()方法,而使用FLAG_ACTIVITY_NEW_TASK去启动一个刚用FLAG_ACTIVITY_NEW_TASK启动过的Activity不会用任何操作,如果Activity位于其它的Task中会切换Task,除此之外不会有其它操作了,着重点在Task上。

  • FLAG_ACTIVITY_FORWARD_RESULT
    这个标示可以用在多个activity交互过程中,比如A startActivityForResult B,这个时候如果 B startActivity C ,并且传人这个标示,则在C中setResult,A会收到结果,同时不管C中是否调用setResult方法,B中的setResult都会失效

android事件分发机制

一、android事件分发首先从 MotionEvent.ACTION_DOWN 事件开始,ACTION_DOWN 事件的分发流程如下图:

图1

二、MotionEvent.ACTION_UP事件分发会受到ACTION_DOWN事件分发结果的影响。我们把ACTION_DOWN事件中止向下分发处当作一个节点,如上图,可能的节点有6个。android事件分发具有消费机制,在这6个节点中按照消费对象来分又可以分为三类:
  • 16对应消费者为Activity,
  • 25对应消费者为ViewGroup,
  • 34对应消费者为View。

通常情况下,如果一个对象消费了ACTION_DOWN事件,android系统会认为这个对象可能也会消费ACTION_UP事件。相对的如果一个对象没有消费ACTION_DOWN事件,那么android系统会认为这个对象也不会消费ACTION_UP事件,在ACTION_UP事件传递过程中就会跳过这个对象。
以下根据这3类情况来探讨ACTION_UP事件的分发流程。

1、ACTION_DOWN事件被Activity消费时,ACTION_UP的分发流程如下:

图2

2、ACTION_DOWN事件被ViewGroup消费时,ACTION_UP的分发流程如下:

图3

3、ACTION_DOWN事件被View消费时,ACTION_UP的分发流程如下:

图4

测试工程稍后会放到Github上,欢迎follow

android逆向工程

目标
  • 分析apk的文件结构,获取apk相关资源
  • 对apk进行调式
  • 修改重新编译apk
工具

1、Android Studio自带的Apk Analyze可以
2、在Android studio上安装smalidea插件
3、安装Apktool,可以通过brew来安装

发布开源库到Jcenter和Maven Central

前言:

在开发中,经常会使用第三方库,一般是通过maven或gradle的方式引用。很方便,整个引用过程也就几行配置代码(gradle只用一行)。

下面就是记录将将自己的的库开源出去的整个流程:

参照https://inthecheesefactory.com/blog/how-to-upload-library-to-jcenter-maven-central-as-dependency/en 【翻译在此】
这里已经很详细了,接下来是实际操作过程中应注意的地方:

1、在Mac终端中,gradle的相关命令应 ./gradlew xxx这样写,以下都默认在Mac中

2、在运行./gradew install时,会报

Caused by: java.lang.NoClassDefFoundError: org/gradle/api/publication/maven/internal/DefaultMavenFactory

当使用的Gradle版本是2.4以上,Android插件版本是1.3.0以上的时候就会出现这个问题,这时候我们需在project的 build.gradle 文件中的插件版本添加一行
classpath ‘com.github.dcendents:android-maven-gradle-plugin:1.3’

3、在运行./gradlew bintrayUpload时,报

What went wrong:
Execution failed for task ‘:library:bintrayUpload’.
Could not create package ‘sujian27@163.com/maven/simplify’: HTTP/1.1 401 Unauthorized [message:This resource requires authentication]

这是local.properites中的bintray.user配置错误导致的。在注册bintray时,直接用github的账号注册的,这时候bintray.user应为主页显示的那个名称,而不是邮箱。

4、在运行./gradlew bintrayUpload时,报

What went wrong:
Execution failed for task ‘:library:bintrayUpload’.
Could not upload to ‘https://api.bintray.com/content/timesfire/maven/simplify/0.1.0/com/github/timesfire/library/0.1.0/library-0.1.0.pom‘: HTTP/1.1 400 Bad Request [message:Unable to upload files: Maven group, artifact or version defined in the pom file do not match the file path ‘com/github/timesfire/library/0.1.0/library-0.1.0.pom’]

这个时候我们的库已经上传到bintray上了,在对应的maven目录下也有对应的tag生成,但是不能正常引用,这是因为需要上传的库工程对应的module名称和我们配置的不一致,默认的库module名称是library,只需重命名为我们配置的名称即可,我这里是重命名为simplify。让后先将bintray上已经生成的TAG删除,重新运行上传命令即可。

有用的网站整理

1、查看jar包的方法数

http://www.methodscount.com

2、查看apk的方法数

http://inloop.github.io/apk-method-count

3、TinyPng

https://tinypng.com

TinyPng 是一个图片压缩工具,可能有些人感觉这个工具应该给设计师使用,我觉得也是。不过有些时候,设计师给你出了个1920* 1080 的启动页,一张图片,1M 左右,我也是泪奔了,感觉设计师说话的时间,估计我们都压缩完了,自己动手,丰衣足食。而且它还提供了API,对不同语言都还有提供了插件,比如Java 就提供了Maven 的支持。

Read More