0%

在刚刚结束的谷歌IO大会上,谷歌推出了Android Jetpack架构组件,里面包含了Navigation组件,这篇文章我们就来看看这个Navigation的使用。

1、安装Android Studio 3.2

目前最新版本是3.2 CANARY 15,前往https://androidstudio.googleblog.com/下载最新版本。

2、添加项目依赖

  • repositories添加google仓库 和classpath
    1
    2
    3
    4
    5
    6
    7
    8
    buildscript {
    repositories {
    google()
    }
    dependencies {
    classpath "android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0-alpha01"
    }
    }
  • 添加navigation库的依赖
    1
    2
    3
    4
    5
    6
    7
    8
    9
    dependencies {
    def nav_version = "1.0.0-alpha01"

    implementation "android.arch.navigation:navigation-fragment:$nav_version" // use -ktx for Kotlin
    implementation "android.arch.navigation:navigation-ui:$nav_version" // use -ktx for Kotlin

    // optional - Test helpers
    androidTestImplementation "android.arch.navigation:navigation-testing:$nav_version" // use -ktx for Kotlin
    }
    阅读全文 »

在做Launcher开发的时候,有时候需要隐藏应用图标的显示或者隐藏某些应用的widget显示,这个时候怎么办呢?

查看Launcher3的源码,发现其实源码里已经提供了相关的实现,发现有一个AppFilter的抽象类,看名字就知道这是一个app过滤器,看看这个接口的源码:

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
package com.codemx.launcher3;

import android.content.ComponentName;
import android.text.TextUtils;
import android.util.Log;

public abstract class AppFilter {

private static final boolean DBG = false;
private static final String TAG = "AppFilter";

public abstract boolean shouldShowApp(ComponentName app);

public static AppFilter loadByName(String className) {
if (TextUtils.isEmpty(className)) return null;
if (DBG) Log.d(TAG, "Loading AppFilter: " + className);
try {
Class<?> cls = Class.forName(className);
return (AppFilter) cls.newInstance();
} catch (ClassNotFoundException e) {
Log.e(TAG, "Bad AppFilter class", e);
return null;
} catch (InstantiationException e) {
Log.e(TAG, "Bad AppFilter class", e);
return null;
} catch (IllegalAccessException e) {
Log.e(TAG, "Bad AppFilter class", e);
return null;
} catch (ClassCastException e) {
Log.e(TAG, "Bad AppFilter class", e);
return null;
}
}

}

提供了一个shouldShowApp的抽象方法,顾名思义就是判断哪些应用需要显示,通过这个方法来过滤。另外还提供了一个loadByName的静态方法,看实现是根据className通过反射实例化一个AppFilter的实现。

阅读全文 »

Kotlin已经出来很久了,最近也开始用kotlin开发android应用了,但是在使用kotlin+dagger2开发android应用的时候遇到了一些问题,在这里记录一下,希望能帮到同样遇到这些问题的同学。

先看一下在java下一个简单的dagger2的例子。
1、在app的build.gradle里加入dagger2的库

1
2
compile 'com.google.dagger:dagger:2.15'
annotationProcessor 'com.google.dagger:dagger-compiler:2.15'

2、编写一个简单的AppModule和AppComponent

1
2
3
4
5
6
7
8
@Module
public class AppModule {

@Provides
public String provideHelloWorld(){
return "Hello World";
}
}
阅读全文 »

  最近在研究Retrofit下载文件,之前也写了两篇关于Retrofit下载上传文件以及下载上传进度的监听的问题.Retrofit上传/下载文件Retrofit上传/下载文件扩展实现进度的监听.使用之中发现还是不是很方便.于是在想能不能想GsonConverterFactory那样自定义一个FileConverterFactory在响应回调中直接返回File呢?

想到就做,于是写了一个FileConverterFactory继承于Converter.Factory,以及FileConverter继承于FileConverter.

阅读全文 »

上一篇文章介绍了用Retrofit实现文件的上传与下载,但是我们发现没办法监听上传下载的进度,毕竟我们在做开发的时候经常是要显示上传或者下载的进度了.虽然Retrofit没有给我们提供现成的api来监听进度,但是Retrofit很灵活,它底层网络访问是用的okhttp实现的,当然我们也可以设置其他第三方网络请求库,因为Retrofit可以设置client,我们可以由此来扩展下载上传的进度监听.

本文使用okhttp作为client来做,其实说白了跟用okhttp做下载上传进度监听几乎一样,参考了这篇文章:Android OkHttp文件上传与下载的进度监听扩展

阅读全文 »

Retrofit是Square公司开源的简化 HTTP 请求的库,这篇文章主要介绍用Retrofit实现文件的上传与下载的功能.

本文使用的是Retrofit 2.0.2版本

1.文件上传

api service接口:

1
2
3
4
5
public interface UpLoadService {
@Multipart
@POST("upload.php")
Call<ResponseBody> upload(@Part MultipartBody.Part file);
}
阅读全文 »

Android Library发布到jcenter

Android开发的时候我们经常会写一些公共的library给其他项目调用,将library上传到jcenter就可以在gradle里很方便的引用.也方便其他人使用.

jcenter是一个托管在bintray.com的资源库.我们要把library放到jcenter上就需要在bintray.com上注册账号然后创建package.这一步我就不详说了网上有很多介绍也很简单,我主要介绍一下在Android studio里library的配置,旨在记录一下怕自己以后忘了.

阅读全文 »

之前事件总线都是用EventBus或者otto来做,现在RxJava越来越火了,用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
/**
* RxBus
*/
public class RxBus {
private static volatile RxBus defaultInstance;
// 主题
private final Subject bus;
// PublishSubject只会把在订阅发生的时间点之后来自原始Observable的数据发射给观察者
public RxBus() {
bus = new SerializedSubject<>(PublishSubject.create());
}
// 单例RxBus
public static RxBus getDefault() {
RxBus rxBus = defaultInstance;
if (defaultInstance == null) {
synchronized (RxBus.class) {
rxBus = defaultInstance;
if (defaultInstance == null) {
rxBus = new RxBus();
defaultInstance = rxBus;
}
}
}
return rxBus;
}
// 提供了一个新的事件
public void post (Object o) {
bus.onNext(o);
}
// 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者
public <T> Observable<T> toObserverable (Class<T> eventType) {
return bus.ofType(eventType);
}
}
阅读全文 »

@Query、@QueryMap

用于Http Get请求传递参数.如:

1
2
@GET("group/users")
Call<List<User>> groupList(@Query("id") int groupId);

等同于:

1
@GET("group/users?id=groupId")

即将@Querykey-value添加到url后面组成get方式的参数,@QueryMap同理

阅读全文 »