最后
文章不易,如果大家喜欢这篇文章,或者对你有帮助希望大家多多点赞转发关注哦。文章会持续更新的。绝对干货!!!
- Android进阶学习全套手册
关于实战,我想每一个做开发的都有话要说,对于小白而言,缺乏实战经验是通病,那么除了在实际工作过程当中,我们如何去更了解实战方面的内容呢?实际上,我们很有必要去看一些实战相关的电子书。目前,我手头上整理到的电子书还算比较全面,HTTP、自定义view、c++、MVP、Android源码设计模式、Android开发艺术探索、Java并发编程的艺术、Android基于Glide的二次封装、Android内存优化——常见内存泄露及优化方案、.Java编程思想 (第4版)等高级技术都囊括其中。
-
Android高级架构师进阶知识体系图
关于视频这块,我也是自己搜集了一些,都按照Android学习路线做了一个分类。按照Android学习路线一共有八个模块,其中视频都有对应,就是为了帮助大家系统的学习。接下来看一下导图和对应系统视频吧!!!
-
Android对标阿里P7学习视频
- BATJ大厂Android高频面试题
这个题库内容是比较多的,除了一些流行的热门技术面试题,如Kotlin,数据库,Java虚拟机面试题,数组,Framework ,混合跨平台开发,等
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
// 接收客户端发过来的消息
switch (msg.what) {
case 1000:
Toast.makeText(getBaseContext(), “” + msg.arg1, Toast.LENGTH_SHORT).show();
Message cMsg = Message.obtain();
cMsg.what = msg.what;
Bundle bundle = new Bundle();
bundle.putString(“name”, “Jim”);
cMsg.obj = bundle;
// 获取客户端的Messenger对象,需要客户端在发送消息时设置
Messenger cMsger = msg.replyTo;
try {
// 给客户端发送消息
cMsger.send(cMsg);
} catch (RemoteException e) {
e.printStackTrace();
}
break;
}
}
});
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mServerMessenger.getBinder();
}
}
public class ClientActivity extends Activity {
private TextView mNameTxt;
/**
- 客户端Messenger对象,用来接收服务端数据
*/
private Messenger mClientMessenger = new Messenger(new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1000:
// 接收服务端数据
Bundle bundle = (Bundle) msg.obj;
mNameTxt.setText(bundle.getString(“name”));
break;
}
}
});
/**
- 服务端Messenger对象,建立连接时获取,用来给服务端发消息
*/
private Messenger mServerMessenger;
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 获取服务端Messenger对象
mServerMessenger = new Messenger(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
mServerMessenger = null;
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_common);
mNameTxt = (TextView) findViewById(R.id.name);
// 绑定远端服务
Intent intent = new Intent(this, MsgerService.class);
bindService(intent, mConnection, BIND_AUTO_CREATE);
findViewById(R.id.bind).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int number = (int) (Math.random() * 100);
Message msg = Message.obtain();
msg.what = 1000;
msg.arg1 = number;
msg.replyTo = mClientMessenger;
// 给服务端发送消息
if (mServerMessenger != null) {
try {
mServerMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
}
}
AIDL
AIDL(Android Interface Definition Language)指的就是接口定义语言,通过它可以让客户端与服务端在进程间使用共同认可的编程接口来进行通信AIDL使用的步骤相对较多,主要总结为三个基本步骤:
-
创建AIDL接口
-
根据AIDL创建远程Service服务
-
绑定远程Service服务
(1)创建AIDL接口
定义aidl接口文件
在Android Studio中已经集成好了这个文件的创建方式,直接右击工程,点击New -> AIDL -> AIDL File,然后输入接口的名称就好,将会在src/main目录下创建一个与java目录平级,且里面的包名与java目录里的包名一致,后缀为.aidl的文件
// Declare any non-default types here with import statements
interface IMyAidlTest {
/**
- Demonstrates some basic types that you can use as parameters
- and return values in AIDL.
*/
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
double aDouble, String aString);
}
上面这个文件是Android Studio自动创建的模版文件,里面的basicTypes方法不需要使用到可以删掉。
AIDL对数据类型的支持包括Java中的所有基本数据类型,还有String、CharSequence、List、Map。
自定义AIDL的数据类型
在AIDL提供的默认数据类型无法满足需求的情况下,就需要自定义数据类型了,比如我们有个Product类,需要用来传递数据,那么这个类必须要实现Parcelable接口,并在AIDL中新建一个相同类名的aidl文件进行声明,并且这个aidl文件所在的路径必须要和java文件里的实体类路径保持一致,如以下文件Product.aidl
package demo.csdn.zhuwentao.bean;
parcelable Product;
然后在IMyAidlTest.aidl中使用import导入进来,除了AIDL默认支持的数据类型外,其它自定义的类型都需要通过此方法导入进来,包名路径需要精确到类名。
interface IMyAidlTest {
void addProduct(in Product person);
List getProductList();
}
这里的方法只作为接口声明的作用,以上定义的接口最终会在Service服务里实现具体的操作逻辑。
根据aidl文件生成java接口文件
这个步骤Android Studio已经帮我们集成好了,只需要点击 Build -> Make Project,或者点击AS上的那个小锤子图标就可以,构建完后将会自动根据我们定义的IMyAidlTest.aidl文件生成IMyAidlTest.java接口类,可以在build/generated/source/aidl/debug/路径下找到这个类。
(2)根据AIDL创建远程Service服务
上一步中创建好的IMyAidlTest.java接口文件,需要使用Service来进行绑定,这里就需要我们新建一个Service服务。
/**
- 根据AIDL创建远程Service服务端
*/
public class MyAidlService extends Service {
private List mProducts;
public MyAidlService() {
}
private IBinder mIBinder = new IMyAidlTest.Stub() {
@Override
public void addProduct(Product product) throws RemoteException {
mProducts.add(product);
}
@Override
public List getProductList() throws RemoteException {
return mProducts;
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
mProducts = new ArrayList<>();
return mIBinder;
}
}
最后
代码真的是重质不重量,质量高的代码,是当前代码界提倡的,当然写出高质量的代码肯定需要一个相当高的专业素养,这需要在日常的代码书写中逐渐去吸收掌握,谁不是每天都在学习呀,目的还不是为了一个,为实现某个功能写出高质量的代码。
所以,长征路还长,大家还是好好地做个务实的程序员吧。
最后,小编这里有一系列Android提升学习资料,有兴趣的小伙伴们可以来看下哦~
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!