项目添加新的模块

点击new module -> Android Library, 模块名称base

修改settings.gradle

include ':app', ':base'

app模块中引用base模块,修改build.gradle

dependencies {
    。。。
    implementation project(':base')
}

Application Module,Android Library,Java Library的区别

android application module以作为一个可以运行的应用,Android Library,Java Library相当于被调用的库。区别是是否带有Android SDK。
一个项目中可以有多个android application module,每一个都可以作为单独的程序运行。 app module 和 library module 以及 java module 主要区别在于生成内容的不同,app module 生成 apk 程序文件。library module 生成 aar 文件,java module 生成 jar 文件。 aar 和 jar 文件都可以作为 app 的依赖库,主要区别在于 aar 除了能携带编译好的程序以外,还能携带资源,是对jar文件的一个提升。


组件之间的通信方式

LocalBoardcast 本地广播

App关闭的时候发送一个本地广播通知所有Activity关闭

EventBus

事件总线。在Activity,Fragment,Service之间传递数据使用,用于代替Handler looper回调

EventBus是基于观察者模式构建的,事件是观察者。

EventBus的概述

三要素

  • Event 事件。它可以是任意类型。
  • Subscriber 事件订阅者。在EventBus3.0之前我们必须定义以onEvent开头的那几个方法,分别是onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,而在3.0之后事件处理的方法名可以随意取,不过需要加上注解@subscribe(),并且指定线程模型,默认是POSTING。
  • Publisher 事件的发布者。我们可以在任意线程里发布事件,一般情况下,使用EventBus.getDefault()就可以得到一个EventBus对象,然后再调用post(Object)方法即可。

四种线程模型

  • POSTING (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。
  • MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
  • BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
  • ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。

使用实例

0.build.gradle导入第三方库

dependencies {
    。。。
    implementation 'org.greenrobot:eventbus:3.1.1'
}

1.定义事件消息类,就是一个普通的POJO类

public class EventMsg {
    public long id;
    public String msg;
}

2.注册订阅者

一般在对象创建的时候注册订阅者,对象销毁的时候注销订阅

public class EventBusTesterActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        。。。
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
}

2.发送事件消息

EventMsg eventMsg = new EventMsg();
eventMsg.id = 1;
eventMsg.msg = "This is event msg";

EventBus.getDefault().post(eventMsg);

3.接收消息

@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(EventMsg eventMsg) {
    resultTextView.setText(eventMsg.msg);
}

完整实例

public class EventBusTesterActivity extends AppCompatActivity {
    Button basicTestBtn;
    TextView resultTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_bus_tester);

        resultTextView = findViewById(R.id.result);

        basicTestBtn = findViewById(R.id.basic_test);
        basicTestBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventMsg eventMsg = new EventMsg();
                eventMsg.id = 1;
                eventMsg.msg = "This is event msg";

                EventBus.getDefault().post(eventMsg);
            }
        });

        EventBus.getDefault().register(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }

    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(EventMsg eventMsg) {
        resultTextView.setText(eventMsg.msg);
    }

}

EventBus的缺点是每一个事件都要定义单独的消息类

参考 http://viator42.github.io/android/2018/03/02/android-eventbus/


Activity导航

跳转使用intent,intent分为显式intent和隐式intent

显式intent

Intent intent = new Intent();
intent.setClass(this,Other.class); //此句表示显式意图,因为明确设置激活对象为Other类
startActivity(intent);

隐式Intent

首先是在AndroidManifest.xml中为某个Activity设置意图过滤器:

action

使用action定义目标activity

<activity
    android:name=".SecondActivity">
    <intent-filter>
        <action android:name="com.viator42,vividandroidexamples.action.SECOND" />
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</activity>

跳转

Intent intent = new Intent();
intent.setAction("com.viator42,vividandroidexamples.action.SECOND");
startActivity(intent);

ARouter


Activity分发技术

一个Activity中可能容纳多个业务,这些业务分布在独立的模块中。比如商品的评论列表。IM模块