Android传递对象的三种方式,2024年最新华为面试题难倒900考生的题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

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

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

import android.os.Parcel;

import android.os.Parcelable;

//可序列化对象

public class Author implements Parcelable {

String name;

int age;

public Author(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

protected Author(Parcel in) {

name = in.readString();

age = in.readInt();

}

//实现方法

@Override

public void writeToParcel(Parcel dest, int flags) {

dest.writeString(name);

dest.writeInt(age);

}

//实现方法

@Override

public int describeContents() {

return 0;

}

//创建Creator接口实例

public static final Creator CREATOR = new Creator() {

@Override

public Author createFromParcel(Parcel in) {

return new Author(in);

}

@Override

public Author[] newArray(int size) {

return new Author[size];

}

};

}

  • 进行序列化,利用Intent进行传递

  • 进行反序列化,利用key获取对象

  • MainActivity代码不变,SecondActivity代码只要把获取对象的方法由getSerializableExtra改为getParcelableExtra即可。

Json字符串
  • 首先引入gson依赖,使其可以使用gson转换对象为json格式

compile ‘com.google.code.gson:gson:2.6.2’

  • 创建对象,成员变量可以并推荐private

  • Book.class

package com.hnucm.androiddemo.Model;

//对象

public class Book {

private String name;

private Author author;

public Book(String name, Author author) {

this.name = name;

this.author = author;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Author getAuthor() {

return author;

}

public void setAuthor(Author author) {

this.author = author;

}

}

  • Author.class

package com.hnucm.androiddemo.Model;

//对象

public class Author {

private String name;

private int age;

public Author(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

  • 将对象转换为json格式,使用Intent传递(序列化)

  • MainActivity

package com.hnucm.androiddemo.Controller;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import com.google.gson.Gson;

import com.hnucm.androiddemo.Model.Author;

import com.hnucm.androiddemo.Model.Book;

import com.hnucm.androiddemo.R;

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button button = findViewById(R.id.button);

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

//创建传递的对象

Author author = new Author(“刘伟”,35);

Book book = new Book(“Java设计模式”,author);

//采用Intent传递数据

//从当前界面传递到另一个界面,确定传递方向

Intent intent = new Intent(MainActivity.this,SecondActivity.class);

//利用标志String传递对象,采用json格式传递

intent.putExtra(“book”,new Gson().toJson(book));

//执行,打开下一个界面

startActivity(intent);

}

});

}

}

  • 将对象从json格式转换回对象(反序列化)

  • SecondActivity

package com.hnucm.androiddemo.Controller;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

import com.google.gson.Gson;

import com.hnucm.androiddemo.Model.Book;

import com.hnucm.androiddemo.R;

public class SecondActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_second);

//初始化显示控件

TextView textView = findViewById(R.id.textView);

Button button = findViewById(R.id.button2);

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

//接收另一个界面传过来的对象

//根据key值保存传递过来的json字符串

String bookJson = getIntent().getStringExtra(“book”);

//将json字符串按照对象格式转换回对象

Book book = new Gson().fromJson(bookJson,Book.class);

textView.setText(“书名:” + book.getName());

Log.d(“作者”,book.getAuthor().getName());

}

});

}

}

三种方式的性能对比
  • 转换为字符串的方式是最慢的。
  • Serializable次之,Parcelable比Serializable快十倍,所以按照性能都是用Parcelable。
  • 但是Parcelable中有大量重复代码,那么就要简化Parcelable的使用。
简化Parcelable
  • 引入第三方库进行简化操作

  • 常见的有Parcelerauto-parcelParcelableCodeGeneratorParcelableGenerator等等。

Parceler

注意事项:

  • 对象类一定要有构造函数。
  • 类的成员变量权限不为private。
  • 添加依赖

implementation ‘org.parceler:parceler-api:1.1.12’

annotationProcessor ‘org.parceler:parceler:1.1.12’

  • 添加注解,表示对象实现Parcelable接口,简化操作

  • Book.class

package com.hnucm.androiddemo.Model;

import org.parceler.Parcel;

//注解

@Parcel

//对象

public class Book {

//成员变量权限不能为private

String name;

Author author;

//一定要有构造方法

public Book(){

}

public Book(String name, Author author) {

this.name = name;

this.author = author;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Author getAuthor() {

return author;

}

public void setAuthor(Author author) {

this.author = author;

}

}

  • Author.class

package com.hnucm.androiddemo.Model;

import org.parceler.Parcel;

//注解

@Parcel

//对象

public class Author {

//成员变量权限不为private

String name;

int age;

//一定要有构造方法

public Author(){

}

public Author(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

  • 使用Parcels.wrap包装对象进行传递

  • MainActivity

package com.hnucm.androiddemo.Controller;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;

import android.os.Bundle;

import android.os.Parcel;

import android.view.View;

import android.widget.Button;

import com.hnucm.androiddemo.Model.Author;

import com.hnucm.androiddemo.Model.Book;

import com.hnucm.androiddemo.R;

import org.parceler.Parcels;

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button button = findViewById(R.id.button);

button.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

//创建传递的对象

Author author = new Author(“刘伟”,35);

Book book = new Book(“Java设计模式”,author);

//采用Intent传递数据

//从当前界面传递到另一个界面,确定传递方向

Intent intent = new Intent(MainActivity.this,SecondActivity.class);

//使用Parcels.wrap包装一个Parcelable对象,进行传递

intent.putExtra(“book”, Parcels.wrap(book));

//执行,打开下一个界面

startActivity(intent);

}

});

}

}

  • 使用Parcels.unwrap恢复对象

  • SecondActivity

package com.hnucm.androiddemo.Controller;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

import com.hnucm.androiddemo.Model.Book;

import com.hnucm.androiddemo.R;

import org.parceler.Parcels;

public class SecondActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_second);

//初始化显示控件

TextView textView = findViewById(R.id.textView);

Button button = findViewById(R.id.button2);

button.setOnClickListener(new View.OnClickListener() {

@Override

最后说一下我的学习路线

其实很简单就下面这张图,含概了Android所有需要学的知识点,一共8大板块:

  1. 架构师筑基必备技能
  2. Android框架体系架构(高级UI+FrameWork源码)
  3. 360°Androidapp全方位性能调优
  4. 设计思想解读开源框架
  5. NDK模块开发
  6. 移动架构师专题项目实战环节
  7. 移动架构师不可不学习微信小程序
  8. 混合开发的flutter

Android学习的资料

我呢,把上面八大板块的分支都系统的做了一份学习系统的资料和视频,大概就下面这些,我就不全部写出来了,不然太长了影响大家的阅读。

330页PDF Android学习核心笔记(内含上面8大板块)

Android学习的系统对应视频

总结

我希望通过我自己的学习方法来帮助大家去提升技术:

  • 1、多看书、看源码和做项目,平时多种总结

  • 2、不能停留在一些基本api的使用上,应该往更深层次的方向去研究,比如activity、view的内部运行机制,比如Android内存优化,比如aidl,比如JNI等,并不仅仅停留在会用,而要通过阅读源码,理解其实现原理

  • 3、同时对架构是有一定要求的,架构是抽象的,但是设计模式是具体的,所以一定要加强下设计模式的学习

  • 4、android的方向也很多,高级UI,移动架构师,数据结构与算法和音视频FFMpeg解码,如果你对其中一项比较感兴趣,就大胆的进阶吧!

希望大家多多点赞,转发,评论加关注,你们的支持就是我继续下去的动力!加油!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  1. NDK模块开发
  2. 移动架构师专题项目实战环节
  3. 移动架构师不可不学习微信小程序
  4. 混合开发的flutter

[外链图片转存中…(img-DzpNGnW6-1713709233676)]

Android学习的资料

我呢,把上面八大板块的分支都系统的做了一份学习系统的资料和视频,大概就下面这些,我就不全部写出来了,不然太长了影响大家的阅读。

330页PDF Android学习核心笔记(内含上面8大板块)

[外链图片转存中…(img-jdMxQVao-1713709233677)]

Android学习的系统对应视频

总结

我希望通过我自己的学习方法来帮助大家去提升技术:

  • 1、多看书、看源码和做项目,平时多种总结

  • 2、不能停留在一些基本api的使用上,应该往更深层次的方向去研究,比如activity、view的内部运行机制,比如Android内存优化,比如aidl,比如JNI等,并不仅仅停留在会用,而要通过阅读源码,理解其实现原理

  • 3、同时对架构是有一定要求的,架构是抽象的,但是设计模式是具体的,所以一定要加强下设计模式的学习

  • 4、android的方向也很多,高级UI,移动架构师,数据结构与算法和音视频FFMpeg解码,如果你对其中一项比较感兴趣,就大胆的进阶吧!

希望大家多多点赞,转发,评论加关注,你们的支持就是我继续下去的动力!加油!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-KJonujjS-1713709233677)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 22
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴您提到了2023年华为本科应届生嵌入式面试。虽然我无法预测具体的面试目,但我可以给您提供一些可能涉及的主和问,以供参考: 1. 嵌入式系统基础知识: - 解释嵌入式系统的概念和特点。 - 了解常见的嵌入式处理器架构和微控制器。 - 解释中断、中断向量表和中断处理程序的概念。 - 讨论实时操作系统(RTOS)的作用和常见特性。 2. 嵌入式软件开发: - 了解C/C++语言在嵌入式开发中的应用。 - 解释嵌入式系统的启动过程和初始化流程。 - 掌握裸机编程和驱动程序开发的基本原理。 - 熟悉嵌入式系统的调试和测试方法。 3. 嵌入式硬件设计: - 了解数字电路和模拟电路的基本知识。 - 掌握常见的总线协议(如I2C、SPI、UART)和接口标准(如GPIO)。 - 理解嵌入式系统的时钟和定时器设计。 - 熟悉硬件调试工具和仪器的使用。 4. 嵌入式系统应用: - 探讨嵌入式系统在物联网、智能家居、汽车电子等领域的应用。 - 分析嵌入式系统在电源管理、通信、图像处理等方面的解决方案。 - 讨论嵌入式系统的功耗优化和性能调优方法。 以上只是一些可能的面试和问,具体的面试内容可能因岗位要求和面试官的选择而有所不同。我建议您在准备面试时,深入学习嵌入式系统的相关知识,并结合实际项目经验进行练习和复习。祝您面试顺利!如有更多问,我随时为您解答。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值