Android Architecture Components 只看这一篇就够了

1.3、主要架构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.4、使用组件

在项目根目录 build.gradle 文件添加仓库依赖:

allprojects {
repositories {
jcenter()
google()
}
}

如果遇到如下因 gradle 版本导致的编译失败问题:

Error:(6, 1) A problem occurred evaluating root project ‘TestArc’.>
Could not find method google() for arguments [] on repository container;

可修改为:

maven {
url ‘https://maven.google.com’
}

然后在主 module 的 build.gradle 文件添加需要依赖的组件:

dependencies {
compile fileTree(dir: ‘libs’, include: [‘*.jar’])
androidTestCompile(‘com.android.support.test.espresso:espresso-core:2.2.2’, {
exclude group: ‘com.android.support’, module: ‘support-annotations’
})
compile ‘com.android.support:appcompat-v7:26.+’

def lifecycle_version = “1.1.1”

// ViewModel and LiveData
compile “android.arch.lifecycle:extensions: l i f e c y c l e v e r s i o n " / / a l t e r n a t i v e l y − j u s t V i e w M o d e l c o m p i l e " a n d r o i d . a r c h . l i f e c y c l e : v i e w m o d e l : lifecycle_version" // alternatively - just ViewModel compile "android.arch.lifecycle:viewmodel: lifecycleversion"//alternativelyjustViewModelcompile"android.arch.lifecycle:viewmodel:lifecycle_version” // use -ktx for Kotlin
// alternatively - just LiveData
compile “android.arch.lifecycle:livedata: l i f e c y c l e v e r s i o n " / / a l t e r n a t i v e l y − L i f e c y c l e s o n l y ( n o V i e w M o d e l o r L i v e D a t a ) . / / S u p p o r t l i b r a r y d e p e n d s o n t h i s l i g h t w e i g h t i m p o r t c o m p i l e " a n d r o i d . a r c h . l i f e c y c l e : r u n t i m e : lifecycle_version" // alternatively - Lifecycles only (no ViewModel or LiveData). // Support library depends on this lightweight import compile "android.arch.lifecycle:runtime: lifecycleversion"//alternativelyLifecyclesonly(noViewModelorLiveData).//Supportlibrarydependsonthislightweightimportcompile"android.arch.lifecycle:runtime:lifecycle_version”

annotationProcessor “android.arch.lifecycle:compiler: l i f e c y c l e v e r s i o n " / / a l t e r n a t e l y − i f u s i n g J a v a 8 , u s e t h e f o l l o w i n g i n s t e a d o f c o m p i l e r c o m p i l e " a n d r o i d . a r c h . l i f e c y c l e : c o m m o n − j a v a 8 : lifecycle_version" // alternately - if using Java8, use the following instead of compiler compile "android.arch.lifecycle:common-java8: lifecycleversion"//alternatelyifusingJava8,usethefollowinginsteadofcompilercompile"android.arch.lifecycle:commonjava8:lifecycle_version”

// optional - ReactiveStreams support for LiveData
compile “android.arch.lifecycle:reactivestreams:$lifecycle_version”

// optional - Test helpers for LiveData
// compile “android.arch.core:core-testing:$lifecycle_version”
compile ‘com.squareup.retrofit2:retrofit:2.1.0’

compile ‘com.squareup.retrofit2:converter-gson:2.1.0’
compile ‘com.facebook.stetho:stetho:1.3.1’

// room
compile ‘android.arch.persistence.room:runtime:1.1.0’
annotationProcessor ‘android.arch.persistence.room:compiler:1.1.0’
compile “android.arch.persistence.room:rxjava2:1.1.0”
}

二、Lifecycle 管理生命周期


2.1、Lifecycle 介绍

Lifecycle 组件指的是 android.arch.lifecycle 包下提供的各种类与接口,可以让开发者构建能感知其他组件(主要指Activity 、Fragment)生命周期(lifecycle-aware)的类。

2.2、常规 MVP Presenter 使用

比如我们需要监听某个 Activity 生命周期的变化,在生命周期改变的时候打印日志,一般做法构造回调的方式,先定义基础 BaseActivityPresenter 接口:

public interface BaseActivityPresenter extends BasePresenter{

void onCreate();

void onStart();

void onResume();

void onPause();

void onStop();

void onDestroy();

}

在实现类中增加自定义操作(打印日志):

public class ActivityPresenter implements BaseActivityPresenter {

private static String TAG = ActivityPresenter.class.getSimpleName();

@Override
public void onCreate() {
LogUtil.i(TAG, “onCreate()”);
}

@Override
public void onStart() {
LogUtil.i(TAG, “onStart()”);
}

@Override
public void onResume() {
LogUtil.i(TAG, “onResume()”);
}

@Override
public void onPause() {
LogUtil.i(TAG, “onPause()”);
}

@Override
public void onStop() {
LogUtil.i(TAG, “onStop()”);
}

@Override
public void onDestroy() {
LogUtil.i(TAG, “onDestroy()”);
}

}

然后在需要监听的 Activity 中依次回调方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBasePresenter = new ActivityPresenter();
}

@Override
protected void onStart() {
super.onStart();
mBasePresenter.onStart();
}

@Override
protected void onResume() {
super.onResume();
mBasePresenter.onResume();
}

@Override
protected void onPause() {
super.onPause();
mBasePresenter.onPause();
}

@Override
protected void onStop() {
super.onStop();
mBasePresenter.onStop();
}

@Override
protected void onDestroy() {
super.onDestroy();
mBasePresenter.onDestroy();
}

在 Activity 的 onCreate() 方法中创建 BasePresenter,监听 Activity 的生命周期方法。

2.3、使用 Lifecycle

上述写可以实现基础的功能,但是不够灵活,假如除了 ActivityPresenter 类,还有别的类要监听 Activity 生命周期变化,那也需要添加许多生命周期的回调方法,比较繁琐。那我们是否可以当 Activity 生命周期发生变化的时候主动通知需求方呢?答案就是使用 Lifecycle 提供的 LifecycleObserver:

public class ActivityLifeObserver implements BaseActivityPresenter,
LifecycleObserver {

private String TAG = ActivityLifeObserver.class.getSimpleName();

@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
@Override
public void onCreate() {
LogUtil.i(TAG, “onCreate()”);
}

@OnLifecycleEvent(Lifecycle.Event.ON_START)
@Override
public void onStart() {
LogUtil.i(TAG, “onStart()”);
}

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
@Override
public void onResume() {
LogUtil.i(TAG, “onResume()”);
}

@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
@Override
public void onPause() {
LogUtil.i(TAG, “onPause()”);
}

@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
@Override
public void onStop() {
LogUtil.i(TAG, “onStop()”);
}

@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
@Override
public void onDestroy() {
LogUtil.i(TAG, “onDestroy()”);
}

}

让我们的业务类实现 ActivityLifeObserver 接口,同时在每一个方法实现上增加 @OnLifecycleEvent(Lifecycle.Event.XXXX)注解,OnLifecycleEvent 对应了 Activity 的生命周期方法。被监听的 Actiivty 实现 LifecycleOwner 接口,然后在需要监听的 Activity 中注册:

public class DetailActivity extends AppCompatActivity implements LifecycleOwner{

private static String TAG = DetailActivity.class.getSimpleName();
private LifecycleRegistry mLifecycleRegistry;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
mLifecycleRegistry = new LifecycleRegistry(this);
// 注册需要监听的 Observer
mLifecycleRegistry.addObserver(new ActivityLifeObserver());
mLifecycleRegistry.addObserver(new LocationLifeObserver());
}

@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}

运行如下:

com.troy.androidrc I/ActivityLifeObserver: onCreate()
com.troy.androidrc I/ActivityLifeObserver: onStart()
com.troy.androidrc I/ActivityLifeObserver: onResume()
com.troy.androidrc I/ActivityLifeObserver: onPause()
com.troy.androidrc I/ActivityLifeObserver: onStop()
com.troy.androidrc I/ActivityLifeObserver: onDestroy()

其中 Lifecycle 使用两个主要的枚举类来表示其所关联组件的生命周期:

  • Event 事件 从组件或者Lifecycle类分发出来的生命周期,它们和Activity/Fragment生命周期的事件一一对应。(ON_CREATE, ON_START, ON_RESUME, ON_PAUSE, ON_STOP, ON_DESTROY);
  • State 状态 当前组件的生命周期状态(INITIALIZED, DESTROYED, CREATED, STARTED, RESUMED)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

LifecycleRegistry 类用于注册和反注册需要观察当前组件生命周期的 Observer,用法如下:

// 初始化
mLifecycleRegistry = new LifecycleRegistry(this);
mActivityLifeObserver = new ActivityLifeObserver();
// 注册观察者
mLifecycleRegistry.addObserver(mActivityLifeObserver);
mLifecycleRegistry.addObserver(new LocationLifeObserver());
// 移除观察者
mLifecycleRegistry.removeObserver(mActivityLifeObserver);

三、LiveData && ViewModel


3.1、LiveData && ViewModel 介绍

LiveData 是一种持有可被观察数据的类(an observable data holder class)。和其他可被观察的类不同的是,LiveData是有生命周期感知能力的(lifecycle-aware,),这意味着它可以在 activities, fragments, 或者 services 生命周期是活跃状态时更新这些组件。

ViewModel 与 LiveData 之间的关系图如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.2、LiveData && ViewModel 使用

在 Activity 页面有一 TextView,需要展示用户 User 的信息,User 类定义:

public class User {

public String userId;

public String name;

public String phone;

@Override
public String toString() {
return “User{” +
“userId='” + userId + ‘’’ +
“, name='” + name + ‘’’ +
“, phone='” + phone + ‘’’ +
‘}’;
}
}

常规的做法:

// 获取 User 的数据后
mTvUser.setText(user.toString());

这样做的一个问题,如果获取或者修改 User 的来源不止一处,那么需要在多个地方更新 TextView,并且如果在多处 UI 用到了 User,那么也需要在多处更新。

使用 LiveData 与 ViewModel 的组合,将LiveData 持有 User 实体,作为一个被观察者,当 User 改变时,所有使用 User 的地方自动 change。构建一个 UserViewModel 如下:

public class UserViewModel extends ViewModel
implements BaseViewModel {

private String TAG = UserViewModel.class.getSimpleName();

private MutableLiveData liveUser;

public MutableLiveData getData(){
if(liveUser == null){
liveUser = new MutableLiveData();
}

liveUser.setValue(loadData());
return this.liveUser;
}

public void changeData(){
if(liveUser != null){
liveUser.setValue(loadData());
}
}

@Override
public User loadData() {
User user = new User();
user.userId = RandomUtil.getRandomNumber();
user.name = RandomUtil.getChineseName();
user.phone = RandomUtil.getRandomPhone();
LogUtil.i(TAG, "loadData(): " + user.toString());
return user;
}

@Override
public void clearData() {

}
}

自定义的UserViewModel 继承系统的 ViewModel,将 User 封装成 MutableLiveData: if(liveUser == null){ liveUser = new MutableLiveData<User>(); }

在使用User 的地方增加观察:

// view model.observe
mUserViewModel = ViewModelProviders.of(this).get(UserViewModel.class);
mUserViewModel.getData().observe(this, new Observer() {
@Override
public void onChanged(@Nullable User user) {
if(user != null){
mTvUser.setText(user.toString());
}
}
});

数据源发送改变的时候:

// 改变 User 内容
mButtonUser.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mUserViewModel != null && mUserViewModel.getData() != null){
mUserViewModel.changeData();
}
}
});

// setValue
public void changeData(){
if(liveUser != null){
liveUser.setValue(loadData());
}
}

这样使用到 User 的地方,UI 会自动更新,日志如下:

com.troy.androidrc I/DetailActivity:
User{userId=‘9372622’, name=‘邓楠’, phone=‘15607043749’}

com.troy.androidrc I/DetailActivity:
User{userId=‘6099877’, name=‘文瑾慧’, phone=‘13005794027’}

四、Room


4.1、Room 介绍

Room 持久层库提供了一个方便我们访问 SQLite 数据库的抽象层(an abstraction layer ),帮助我们更好的在 APP 上创建我们的数据缓存,能够让 APP 即使在没有网络的情况也能正常使用。

Room 的架构如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.2、Room 使用与主要注解

创建包含订单表的数据库如下步骤:

1、创建 Order.java:

@Entity(tableName = “orders”)
public class Order {

@PrimaryKey
@ColumnInfo(name = “order_id”)
public long orderId;

@ColumnInfo(name = “address”)
public String address;

@ColumnInfo(name = “owner_name”)
public String ownerName;

@ColumnInfo(name = “owner_phone”)
public String ownerPhone;

// 指示 Room 需要忽略的字段或方法
@Ignore
public String ignoreText;

@Embedded
public OwnerAddress ownerAddress;
}

2、创建 OrderDao:

@Dao
public interface OrderDao {

@Query(“SELECT * FROM orders”)
List loadAllOrders();

@Insert
void insertAll(Order… orders);

@Query(“SELECT * FROM orders WHERE order_id IN (:orderIds)”)
List queryOrderById(long[] orderIds);

@Delete
void deleteOrder(Order… orders);

@Update
void updateOrder(Order… orders);
}

3、创建数据库

@Database(entities = {Order.class, AddressInfo.class}, version = 2)
public abstract class AppDatabase extends RoomDatabase{

public abstract OrderDao getOrderDao();

}

// 实现类
public static void buildDb(){
DB_INSTANCE = Room.
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

总结

写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于Flutter的学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。
由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的
还有高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。

跨平台开发:Flutter.png

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

帮助,可以扫码获取!!(备注:Android)**

总结

写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于Flutter的学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。
由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的
还有高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。

[外链图片转存中…(img-xIxg6O6q-1712137804334)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
The software architecture of Android is based on a layered approach, with each layer providing specific functionalities and services. Here are the key layers of the Android software architecture: 1. Linux Kernel: The Linux kernel is the foundation of the Android operating system. It provides core system services such as memory management, process management, security, and device drivers. 2. Hardware Abstraction Layer (HAL): The HAL provides a standardized interface between the Android platform and the underlying hardware. It allows developers to write hardware-specific code without needing to know the details of the hardware. 3. Native C/C++ Libraries: The native libraries include a set of libraries that provide core system functionalities such as graphics rendering, media playback, and networking. 4. Android Runtime: The Android runtime includes the Dalvik Virtual Machine (DVM) and the Android Runtime (ART). The DVM is used to execute Android applications, while ART is a more recent runtime that provides improved performance and other optimizations. 5. Framework Layer: The Framework layer provides a set of APIs and services that application developers can use to build their applications. This layer includes a wide range of functionalities such as UI rendering, data storage, location services, and more. 6. Applications: Finally, the top layer of the Android software architecture is the applications layer. This layer includes all the user-facing applications that users interact with, such as messaging apps, social media apps, games, and more. Overall, the Android software architecture is designed to be modular and flexible, allowing developers to build applications that take advantage of the underlying system functionalities while remaining independent of the specific hardware and software configuration of the device.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值