乱码三千 – 分享实用IT技术

乱码三千 – 码出一个新世界


  • 首页

  • 归档

  • 搜索

如何将gradle插件发布到插件门户网站

发表于 2019-12-29

Step 1: 创建账户.

点击注册.

注册地址:https://plugins.gradle.org/user/register

Step 2: 生成API key.

Step 3: 将 API key 添加到Gradle 配置中.

拷贝API Key到电脑$USER_HOME/.gradle/gradle.properties文件中,如果电脑没有该文件, 就自行创建一个

$USER_HOME 指的是你的电脑用户名

如果你嫌手动配置api麻烦, 可以使用官方的login task进行自动注册,

image-20210727105738873

执行login task 执行窗口会出现授权链接 点击浏览器打开即可

image-20210727110154697

在此之前需要先应用插件, 往下看:

Step 4: 使用官方插件进行代码的推送.

在你自己的插件工程build.gradle中添加如下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 第一步 应用插件
plugins {
id "com.gradle.plugin-publish" version "0.10.1"

}


pluginBundle {
website = 'http://www.gradle.org/'//你自己的插件官网地址
vcsUrl = 'https://github.com/gradle/gradle'//插件版本同步地址 填写你的github地址即可
description = 'Greetings from here!'//插件描述
tags = ['greetings', 'salutations']//标签 便于搜索

plugins {
greetingsPlugin {
version = "1.2" //插件版本号
group = "com.foo.myplugin"//插件包名
displayName = '这里填写在插件官网中显示的名称'
}
}
}

配置完成后,执行 publishPlugins task即可自动上传代码

Step 5: 等待审核.

审核通过后,即可在官网搜索到你的插件, 上面附有插件的使用方法

Step 6: 完成.

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

强制刷新gradle依赖缓存的方法

发表于 2019-12-28

有时候我们需要在不改变版本号的前提下 同步gradle重新从远程更新依赖包

方案一:

修改项目任意一个依赖库版本号,然后同步gradle,同步完成后再改回来

方案二:

执行以下指令强制刷新

1
2
3
4
5
6
Windows:    
gradlew build --refresh-dependencies


Mac:
./gradlew build --refresh-dependencies

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

给工程打jar包时如何把libs中的jar包一并打入

发表于 2019-12-28

当我们在进行maven打包时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apply plugin: 'maven'


uploadArchives { // 这里只是更新到本地,可以上传到自定义的maven仓库
repositories {
mavenDeployer {
//提交到远程服务器:
// repository(url: "http://www.xxx.com/repos") {
// authentication(userName: "admin", password: "admin")
// }
pom.groupId = 'com.insworks.plugin'
pom.artifactId = 'framework-plugin'
pom.version = '1.0.3'
repository(url: uri("$rootDir/global/repo"))
}
}
}

如果工程在本地引用了第三方jar包, 那么直接使用uploadArchives指令是无法将第三方jar包打进去的

解决方案如下:

方案一: 将jar包源代码拷入工程,然后一并打包(不推荐 )

方案二: 只需加入以下代码

1
2
3
4
5
6
7
8
task makeJar(type: Jar) {
//以下是需要打包进jar包中的内容
from(project.zipTree("libs/dom4j-2.1.1.jar"))
}
//包含第三方jar
artifacts {
archives makeJar
}

附加

  1. 如果我想打包源码, 那么加入以下代码:
1
2
3
4
5
6
7
8
9
10
11
// 源代码一起打包(不需要打包源代码的不要添加这几行)
task androidSourcesJar(type: Jar) {
classifier = 'sources'
//指定源码目录
source = android.sourceSets.main.java.srcDirs
//加入第三方jar 这个是字节码文件
from(project.zipTree("libs/dom4j-2.1.1.jar"))
}
artifacts {
archives androidSourcesJar
}
  1. 如果我想打包文档, 那么加入以下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//生成文档注释
task androidJavadocs(type: Javadoc) {
//如果出现错误 忽略不计
failOnError = false
//指定源码目录
source = android.sourceSets.main.java.srcDirs
ext.androidJar = "${android.sdkDirectory}/platforms/${android.compileSdkVersion}/android.jar"
classpath += files(ext.androidJar)
}
//将文档打包成jar
task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
classifier = 'javadoc'
from androidJavadocs.destinationDir
}
//包含文档
artifacts {
archives androidJavadocsJar
}
  1. 如果我想将两个jar包合并成一个jar包, 那么使用以下代码:
1
2
3
4
5
6
7
8
9
task makeJar(type: Jar) {
//以下是需要打包进jar包中的内容
from(project.zipTree("libs/dom4j-2.1.1.jar"))
from(project.zipTree("build/libs/lib_framework_plugin.jar"))
//合体后的jar包名称
archiveName = "framework-plugin-1.0.1.jar"
//输出目录
destinationDir = file('build/libs')
}

然后执行makeJar指令

成功后,可以在build目录中找到合并后的jar包

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

解决android中EditText设置末尾省略号不生效的情况

发表于 2019-12-28

在Textiew中可以通过设置TextView的属性

1
android:maxEms

和

1
android:ellipseize

来使过多的文字显示为省略号,但在在EditText中设置只这两个属性则不行,

android默认只有在文字不可编辑的状态下才可以显示这些效果,但是EditText重写了这个属性,使得文字默认都是可以编辑的。

所以若想要呈现TextView的效果,必须加上以下属性

1
android:editable= "false"

另外EditText不支持跑马等的效果.咱们来看看android源码

1
2
3
4
5
6
7
override
public void setEllipsize(TextUtils.TruncateAt ellipsis) {
if (ellipsis == TextUtils.TruncateAt.MARQUEE) {
throw new IllegalArgumentException("EditText cannot use the ellipsize mode TextUtils.TruncateAt.MARQUEE");
}
super.setEllipsize(ellipsis);
}

如果设置跑马灯效果,会直接抛出异常

那么有同学会说了,editable设为false, 那岂不是没法进行文本编辑了?

这里呢, 建议大家自定义EditText并重写onTouchEvent方法,从外部进行控制是否获取焦点, 如下:

1
2
3
4
5
6
class FocusEditText(context: Context, attrs: AttributeSet) : EditText(context, attrs){
override fun onTouchEvent(event: MotionEvent?): Boolean {
return isEnabled && super.onTouchEvent(event)
}

}

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

将代码发布至jcenter步骤

发表于 2019-12-24

Step 1

在项目的build.gradle中buildscript中添加如下脚本,使用最新版本号,在https://github.com/novoda/bintray-release查看:

     

buildscript {
repositories {
    jcenter()
}
dependencies {
    //classpath 'com.novoda:bintray-release:<latest-version>'
    classpath 'com.novoda:bintray-release:0.8.1'
}
}

Step 2

在库模块(需要上传的模块)的build.gradle中添加:

apply plugin: 'com.novoda.bintray-release'

publish {
    userOrg = '组织ID' //bintray账户下某个组织id 个人用户填写账户名
    groupId = 'com.insworks.plugin' //maven仓库下库的包名,一般为模块包名
    artifactId = 'framework-plugin' //项目名称
    publishVersion = '1.0.2' //版本号
    desc = '组件化架构插件' //项目介绍,可以不写
    website = '' //项目主页,可以不写
}
tasks.withType(Javadoc) {//防止编码问题
    options.addStringOption('Xdoclint:none', '-quiet')
    options.addStringOption('encoding', 'UTF-8')
    options.addStringOption('charSet', 'UTF-8')
}

Step 3

在bintray中创建仓库并获取仓库key。Bintray网站点击右上角用户名–>Edit Your Profile -> API Key –>输入密码–>Submit–>Show。

Step 4

使用指令上传代码:

在Android Studio的Terminal面板中执行下面命令,其中BINTRAY_USERNAME替换为你的binatray用户名,BINTRAY_KEY替换为上面获取的API Key,-PdryRun=false会上传到仓库中,如果为true,只会执行gradle任务,但不会上传。替换完成后回车执行

示例
gradlew clean build bintrayUpload -PbintrayUser=BINTRAY_USERNAME -PbintrayKey=BINTRAY_KEY -PdryRun=false

我的
gradlew clean build bintrayUpload -PbintrayUser=songjianziana -PbintrayKey=5e7f0ea95e85af4cceca20cb109fb50ad7cba6bc -PdryRun=false

或者使用gradle快捷上传, 需要先编译项目(切记)

Step 5

Android Studio中配置https://bintray.com仓库地址

maven { url 'https://dl.bintray.com/songjianzaina/insoan' }

和然后在app模块build.gradle中添加依赖:

1
implementation 'com.xxx.xxx.xx.:1.0.0'

Step 6

添加到JCenter。点击“Add to JCenter”,填写项目介绍,点击Send发送,然后等待审核,审核成功之后会发送站内通知

上传成功之后将maven { url 'https://dl.bintray.com/songjianzaina/insoan' }替换成jcenter即可

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Android源码下载

发表于 2019-12-24

Android源码下载支持的系统目前只有Ubuntu和Mac OS两种操作系统, 本次以Ubuntu系统为例.

官方网站: http://source.android.com/source/downloading.html

下载单独项目的源码:https://github.com/android

  1. 下载Git(版本控制工具). 调出命令行: ctrl + alt + T

    1
    sudo apt-get install git   (下载地址在源中,"系统设置/软件和更新",路径:/etc/apt/sources.list)
  2. 安装curl(上传和下载数据的工具).

    1
    sudo apt-get install curl
  3. 安装repo(一个基于git的版本库管理工具, 这里用于自动批量下载android整个项目.).

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // 创建目录
    mkdir ~/bin

    // 下载repo脚本到本地bin文件夹下
    curl http://android.git.kernel.org/repo >~/bin/repo (官网:curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo)
    // 如果上面下载失败, 采用下面这种方式
    curl "http://php.webtutor.pl/en/wp-content/uploads/2011/09/repo" >~/bin/repo

    // 给所有用户追加可执行的权限
    chmod a+x ~/bin/repo

    // 临时把repo添加到环境变量中, 方便后面执行.
    // 注意: 每次重启ubuntu之后此环境变量失效, 重新配置就可以了.
    export PATH=~/bin:$PATH
  4. 创建文件夹, 用于存放下载的Android源码.

    1
    2
    3
    4
    5
    6
    7
    // 创建目录
    mkdir ~/android_source

    // 修改权限
    chmod 777 ~/android_source

    cd ~/android_source
  5. 初始化库.

    1
    2
    3
    4
    5
    6
    7
    8
    // 需要先配置git的用户信息
    git config --global user.email "dai_zhenliang@163.com"
    git config --global user.name "haha"

    repo init -u https://android.googlesource.com/platform/manifest -b android-2.3_r1

    // 如果上面初始化失败, 用下面的代码
    repo init -u git://codeaurora.org/platform/manifest.git -b gingerbread
    当屏幕出现以下信息表示成功初始化
    1
    repo initialized in /home/haha/android_source
  6. 开始同步下载.

    1
    repo sync

    注意: 下载过程中, 因为网络问题, 可能会中断下载. 当中断下载时, 继续使用repo sync命令继续下载.

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Android源码编译

发表于 2019-12-24

在编译源码之前需要做一些准备操作, 详细步骤如下:

1. 安装JDK, google官方要求编译2.3源码需要JDK1.6.

  • 1). 下载JDK1.6, 下载地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html、http://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-linux-x64.bin

  • 2). 创建目录.

    1
    sudo mkdir /usr/java
  • 3). 在文件系统中右击上面的创建的文件夹,选择“以管理员权限打开”,然后把下载好的jdk-6u45-linux-x64.bin拖动到/usr/java目录中

  • 4). 添加可执行权限.

    1
    sudo chmod 755 /usr/java/jdk-6u45-linux-x64.bin
  • 5). 解压.

    1
    2
    cd /usr/java
    sudo ./jdk-6u45-linux-x64.bin
  • 6). 配置环境变量.

    1
    2
    3
    export JAVA_HOME=/usr/java/jdk1.6.0_45
    export PATH=$PATH:$JAVA_HOME/bin
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
  • 7). 验证是否成功.

    1
    java -version

2. 安装其他编译时依赖的软件.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo apt-get install gnupg
sudo apt-get install flex
sudo apt-get install bison
sudo apt-get install gperf
sudo apt-get install zip
sudo apt-get install curl
sudo apt-get install build-essential
sudo apt-get install libesd0-dev
sudo apt-get install libwxgtk2.8-dev
sudo apt-get install libsdl-dev
sudo apt-get install lsb-core
sudo apt-get install lib32readline-gplv2-dev
sudo apt-get install g++-multilib
sudo apt-get install lib32z1-dev
sudo apt-get install libswitch-perl

安装注意事项:

3. 开始编译, 在源码的目录下, 执行一下命令:

1
2
3
cd ~/android_source
make clean(如果之前有编译过,则需要调用这个命令)
make

注意: ubuntu自带的源中速度比较慢, 有些软件找不到, 所以需要修改为国内的源, 修改源步骤如下:

  • 1). 备份ubuntu自带的源.

    1
    sudo cp /etc/apt/sources.list /etc/apt/sources.list.old
  • 2). 修改源文件.

    1
    sudo gedit /etc/apt/sources.list
  • 3). 这时会弹出一个文本编辑框, 先删除所有内容, 然后把以下内容拷贝进去, 并保存.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb-src http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse

    deb http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse
    deb http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse
    deb http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse
    deb-src http://mirrors.sohu.com/ubuntu/ trusty main restricted universe multiverse
    deb-src http://mirrors.sohu.com/ubuntu/ trusty-security main restricted universe multiverse
    deb-src http://mirrors.sohu.com/ubuntu/ trusty-updates main restricted universe multiverse
    deb-src http://mirrors.sohu.com/ubuntu/ trusty-proposed main restricted universe multiverse
    deb-src http://mirrors.sohu.com/ubuntu/ trusty-backports main restricted universe multiverse
  • 4). 保存之后, 更新数据源.

    1
    sudo apt-get update

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

git stash 详解

发表于 2019-12-24

应用场景

  1. 当正在dev分支上开发某个项目,这时项目中出现一个bug,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用git stash命令将修改的内容保存至堆栈区,然后顺利切换到hotfix分支进行bug修复,修复完成后,再次切回到dev分支,从堆栈中恢复刚刚保存的内容。
  2. 由于疏忽,本应该在dev分支开发的内容,却在master上进行了开发,需要重新切回到dev分支上进行开发,可以用git stash将内容保存至堆栈中,切回到dev分支后,再次恢复内容即可。

总的来说,git stash命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。

这也就是说,stash中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。git stash作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。

注: stash只对被追踪的文件才有效, 也就是说 是针对被add的文件 。

命令详解

1. git stash

能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: src/main/java/com/wy/CacheTest.java
modified: src/main/java/com/wy/StringTest.java

no changes added to commit (use "git add" and/or "git commit -a")

$ git stash
Saved working directory and index state WIP on master: b2f489c second

$ git status
On branch master
nothing to commit, working tree clean

2. git stash save

作用等同于git stash,区别是可以加一些注释,git stash save “test1”的效果 如下:

1
stash@{0}: On master: test1

3. git stash list

查看当前stash中的内容

4. git stash pop

将当前stash中的内容弹出,并应用到当前分支对应的工作目录上。
注:该命令将堆栈中最近保存的内容删除(栈是先进后出)
顺序执行git stash save “test1”和git stash save “test2”命令,效果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ git stash list
stash@{0}: On master: test2
stash@{1}: On master: test1

$ git stash pop
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: src/main/java/com/wy/StringTest.java

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (afc530377eacd4e80552d7ab1dad7234edf0145d)

$ git stash list
stash@{0}: On master: test1

可见,test2的stash是首先pop出来的。
如果从stash中恢复的内容和当前目录中的内容发生了冲突,也就是说,恢复的内容和当前目录修改了同一行的数据,那么会提示报错,需要解决冲突,可以通过创建新的分支来解决冲突。

5. git stash apply

将堆栈中的内容应用到当前目录,不同于git stash pop,该命令不会将内容从堆栈中删除,也就说该命令能够将堆栈的内容多次应用到工作目录中,适应于多个分支的情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git stash apply
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: src/main/java/com/wy/StringTest.java

no changes added to commit (use "git add" and/or "git commit -a")

$ git stash list
stash@{0}: On master: test2
stash@{1}: On master: test1

堆栈中的内容并没有删除。
可以使用git stash apply + stash名字(如stash@{1})指定恢复哪个stash到当前的工作目录。

6. git stash drop + 名称

从堆栈中移除某个指定的stash

7. git stash clear

清除堆栈中的所有 内容

8. git stash show

查看堆栈中最新保存的stash和当前目录的差异。

1
2
3
$ git stash show
src/main/java/com/wy/StringTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

git stash show stash@{1}查看指定的stash和当前目录差异。
通过 git stash show -p 查看详细的不同:

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
$ git stash show -p
diff --git a/src/main/java/com/wy/CacheTest.java b/src/main/java/com/wy/CacheTest.java
index 6e90837..de0e47b 100644
--- a/src/main/java/com/wy/CacheTest.java
+++ b/src/main/java/com/wy/CacheTest.java
@@ -7,6 +7,6 @@ package com.wy;
*/
public class CacheTest {
public static void main(String[] args) {
- System.out.println("git stash test");
+ System.out.println("git stash test1");
}
}
diff --git a/src/main/java/com/wy/StringTest.java b/src/main/java/com/wy/StringTest.java
index a7e146c..711d63f 100644
--- a/src/main/java/com/wy/StringTest.java
+++ b/src/main/java/com/wy/StringTest.java
@@ -12,7 +12,7 @@ public class StringTest {

@Test
public void test1() {
- System.out.println("=================");
+ System.out.println("git stash test1");
System.out.println(Strings.isNullOrEmpty(""));//true
System.out.println(Strings.isNullOrEmpty(" "));//false
System.out.println(Strings.nullToEmpty(null));//""

同样,通过git stash show stash@{1} -p查看指定的stash的差异内容

9. git stash branch

从最新的stash创建分支。

应用场景:当储藏了部分工作,暂时不去理会,继续在当前分支进行开发,后续想将stash中的内容恢复到当前工作目录时,如果是针对同一个文件的修改(即便不是同行数据),那么可能会发生冲突,恢复失败,这里通过创建新的分支来解决。可以用于解决stash中的内容和当前目录的内容发生冲突的情景。
发生冲突时,需手动解决冲突。

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Handler机制详解

发表于 2019-12-22

Handler机制主要涉及到五个类

  • Handler (用于处理消息)
  • Message (消息对象)
  • MessageQueue (按一定顺序储存消息对象)
  • looper (内部是死循环, 不断从MessageQueue 中取消息)
  • HandlerThead

首先咱们来看一张Handler消息机制图

些许懵逼?

那咱们从源码开始入手,先从Handler.java开始

得出结论:

  • handler利用MessageQueue对象,调用其enquequeMessage方法将消息塞给MessageQueue
  • msg.target为handler自身对象

那么enquequeMessage具体是怎么个塞法呢?

得出结论:

  • enquequeMessage将传入的消息根据延时时间进行排序,0毫秒在前,非0毫秒在后

咱们接着看Lopper.java

得出结论

  • loop方法内部实际是一个死循环

  • 通过queque.next()从消息队列中取消息,如果没有消息就阻塞住,有消息就往下执行

  • 如果有消息, 通过dispatchMessage进行消息分发, 注意 这个dispatchMessage方法是Handler对象的

进入到Message.java中


得出结论:

  • 到最后调用了handleMessage交由用户去处理
  • 之所以系统创建多个Handler处理成百上千的消息而不会乱套,主要靠的就是target变量,相当于给每个消息绑定了一个Handler, 指定该Handler进行处理
  • 从sendMessage到handleMessage大致就是这么一个流程

那么到此为止, 问题来了:

  • 前面说到, loop方法内部是一个死循环, 那这个循环是如果实在UI线程,岂不是会造成线程阻塞?

android肯定不会允许这种情况发生的, 为了解决这个问题, HandlerThread上场了,单独开启了一个子线程用于handler

HandlerThread继承自Thread进入到HandlerThread.java中我们先找到关键方法run

得出结论:

  • perpare()主要用于初始化创建looper对象, 并将该对象存放到线程变量中,供线程对象使用
  • 初始化完成后调用loop方法开始死循环
  • 如果自己使用looper需要开启一个线程, 否则会阻塞UI线程, 并且调用perpare和loop方法
  • 平常我们在使用的handler的时候不需要开启线程, 是因为系统已经替我们开启了ActivityThread线程

Handler消息分发流程

附加

ActivityThread中也有一个loop方法

实际上, Android应用的启动运行靠的也是handler, 不断地处理系统消息, 这样四大组件才能正常运转起来

本帖附件

点击下载

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Activity跳转之scheme跳转法

发表于 2019-12-19

Activity的跳转可以说是非常简单的了、从一个页面跳转至另一个页面,我们最常用的也就是下面这种:

1
2
Intent intent = new Intent(this, xxx.class);
startActivity(intent);

当然还有我们的隐式跳转,为Intent指定一个action即可

1
2
Intent intent = new Intent("this is an action");
startActivity(intent);

这篇文章上面提到的两个都不讲,这里来说使用scheme协议来进行页面跳转

  • manifest / data 配置
  • 如果需要让我们的Activity能被其他应用或者网页所打开,需要在AndroidManifest中进行配置(浏览网页的时候点击一些广告可以进对应的app大概就是这个原理)
1
2
3
4
5
6
7
8
9
10
11

<activity android:name=".TestOneActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!--配置scheme-->
<data
android:scheme="azhon.scheme" />
</intent-filter>
</activity>
  • 如上代码我们只是简单的配置了一个android:scheme属性,那要打开这个Activity也是so easy的
1
startActivity(new Intent(Intent.ACTION_VIEW,                        Uri.parse("azhon.scheme://")));
  • 当然< data/>中还可以配置更多的属性(截取自官方中文文档,可以点击上面的manifest / data 配置)
1
2
3
4
5
6
7
<data android:scheme="string"
android:host="string"
android:port="string"
android:path="string"
android:pathPattern="string"
android:pathPrefix="string"
android:mimeType="string" />

scheme 路径的规则

1
<scheme> :// <host> : <port> [<path>|<pathPrefix>|<pathPattern>]

scheme开头 :// 主机名 : 端口号 / [路径/参数] 路径后面拼接参数也是可以的下面会用到。
这个地址和我们经常使用的网页地址差不多是一样滴
eg:https://loaclhost:8080/index.jsp

在网页中打开我们对应的页面

  • 我们修改Manifest中Activity的配置在多加点料,我这里创建了两个页面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
activity android:name=".TestOneActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="azhon"
android:port="1011"
android:scheme="azhon.scheme" />
</intent-filter>
</activity>

<activity android:name=".TestTwoActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="azhon"
android:port="1012"
android:scheme="azhon.scheme" />
</intent-filter>
</activity>
  • 在主页面布局添加一个WebView控件,并让它加载assets文件夹中的html文件
  • 布局文件代码:
1
2
3
4
5
<WebView
android:id="@+id/web"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp" /
  • assets文件夹中的Html代码:
1
2
3
<a href="azhon.scheme://azhon:1011/我是路径?user=958460248&psd=123456">跳转至TestOneActivity</a>
<p>
<a href="azhon.scheme://azhon:1012/i am path?toId=25&tmId=888">跳转至TestTwoActivity</a>

效果图:

在网页中只需要使用一个超链接便可以轻松的跳转至我们的app,是不是很开心。
当你将这个html文件使用手机的浏览器查看时,点击也是一样可以跳转进app的
跳转页面的时候还可以通过 ?key=value&key1=value2 键值对的方式往地址后面拼接参数

  • 在跳转过去的页面接收传递过来的参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Intent intent = getIntent();
Uri uri = intent.getData();

assert uri != null;
sb.append("scheme: ").append(intent.getScheme()).append("<p>");
sb.append("host: ").append(uri.getHost()).append("<p>");
sb.append("port: ").append(uri.getPort()).append("<p>");
sb.append("path: ").append(uri.getPath()).append("<p>");
sb.append("params: ").append(uri.getQuery()).append("<p>");

//获取跳转过来携带所有参数的 键名
Set<String> names = uri.getQueryParameterNames();
Iterator<String> iterator = names.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
sb.append(key).append(": ").append(uri.getQueryParameter(key)).append("<p>");
}
tv.setText(Html.fromHtml(sb.toString()));

有了这种跳转方式 你只要知道其他app的scheme你就可以随意的跳过去了想想都刺激,比如下面代码打开微信和QQ程序。

1
2
<a href="weixin://">打开微信</a><p>  
<a href="mqqzone://">打开QQ</a>

效果图:

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

1…444546…50

乱码三千

android程序员一枚,擅长java,kotlin,python,金融投资,欢迎交流~

493 日志
143 标签
RSS
© 2025 乱码三千
本站总访问量次
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4
0%