建议
当我们出去找工作,或者准备找工作的时候,我们一定要想,我面试的目标是什么,我自己的技术栈有哪些,近期能掌握的有哪些,我的哪些短板 ,列出来,有计划的去完成,别看前两天掘金一些大佬在驳来驳去 ,他们的观点是他们的,不要因为他们的观点,膨胀了自己,影响自己的学习节奏。基础很大程度决定你自己技术层次的厚度,你再熟练框架也好,也会比你便宜的,性价比高的替代,很现实的问题但也要有危机意识,当我们年级大了,有哪些亮点,与比我们经历更旺盛的年轻小工程师,竞争。
-
无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!!!!!!!
-
准备想说怎么样写简历,想象算了,我觉得,技术就是你最好的简历
-
我希望每一个努力生活的it工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。
-
有什么问题想交流,欢迎给我私信,欢迎评论
【附】相关架构及资料
内含往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
使用registerForActivityResult
方法注册一个启动项,第一个参数是内置的协定StartActivityForResult
,用来启动Activity
并返回结果。第二个参数是ActivityResultCallback
,处理结果的回调,相当于以前onActivityResult
方法。该方法返回结果是一个ActivityResultLauncher
,在需要的地方调用它的launch
方法即可。
var start=registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
if(it.resultCode==Activity.RESULT_OK){
var result=it.data?.getStringExtra(“result”)
binding.tv.text=“result:${result}”
}
}
binding.btn.setOnClickListener {
val intent=Intent(this,MainActivity14::class.java).apply {
putExtra(“text”,“hello MainActivity14”)
}
start.launch(intent)
}
3.权限申请
它还可以用来做权限申请,使用RequestPermission
协定,在launch
方法中传入需要申请的权限,如果用户授权则会在回调中返回ture
。还可以使用RequestMultiplePermissions
来申请多个权限,相比以前的权限申请真的简单很多。
val requestPermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) {
log(“permission:$it”)
}
binding.btn.setOnClickListener {
requestPermission.launch(android.Manifest.permission.ACCESS_FINE_LOCATION)
}
4.其它内置ActivityResultContract
在ActivityResultContracts
中内置了一些基本的协定。比如启动Activity,拍照返回结果,选联系人,请求权限等。用法类似,只是请求的参数和返回的结果不同。
5.自定义ActivityResultContract
如果系统内置协定不满足需求,可以通过继承ActivityResultContract
类来自定义协定,ActivityResultContract
有两个范型参数,Input
和Output
。然后现实它的两个方法,createIntent
方法来创建你的意图Intent
,parseResult
方法通过resultCode
和intent
来解析结果并返回Output
类型。 类似StartActivityForResult
源码
public static final class StartActivityForResult
extends ActivityResultContract<Intent, ActivityResult> {
public Intent createIntent(@NonNull Context context, @NonNull Intent input) {
return input;
}
public ActivityResult parseResult(
int resultCode, @Nullable Intent intent) {
return new ActivityResult(resultCode, intent);
}
}
6.在其它类中接收Activity的结果
需要通过实现LifecycleObserver来实现协定的注册和启动器启动。
Activity注册这个观察者
var myLifecycleObserver=MyLifecycleObserver(registry = activityResultRegistry)
lifecycle.addObserver(myLifecycleObserver)
调用
myLifecycleObserver.selectImage()
实现DefaultLifecycleObserver,在onCreate注册协定
class MyLifecycleObserver(private val registry : ActivityResultRegistry) :DefaultLifecycleObserver{
lateinit var getContent : ActivityResultLauncher
override fun onCreate(owner: LifecycleOwner) {
getContent = registry.register(“key”, owner, ActivityResultContracts.GetContent(),
ActivityResultCallback { log(it) })
}
fun selectImage(){
getContent.launch(“image/*”)
}
}
使用版本activity-ktx:1.2.2,fragment-ktx:1.3.3
1.register
registerForActivityResult
方法最终会调用ActivityResultRegistry
的 register
方法,通过不同的key生成一个唯一的requestCode
,把这个requestCode
保存下来,在结果返回时使用。通过Lifecycle
添加一个观察者,监听Activity的ON_START,ON_STOP,ON_DESTROY
事件。在ON_START
事件到来时,会从mPendingResults
这个bundle
对象中通过key获取结果,如果有结果,则将结果回调到调用者处。ON_STOP
事件则是移除这个key对应的CallbackAndContract
对象,ON_DESTROY
事件移除这个key对应的所有信息。最后返回ActivityResultLauncher
对象给调用者使用。
public final <I, O> ActivityResultLauncher register(
@NonNull final String key,
@NonNull final LifecycleOwner lifecycleOwner,
@NonNull final ActivityResultContract<I, O> contract,
@NonNull final ActivityResultCallback callback) {
Lifecycle lifecycle = lifecycleOwner.getLifecycle();
//每个请求的key也不一样,根据key生成一个唯一的requestCode
final int requestCode = registerKey(key);
//把lifecycle和observer统一封装到LifecycleContainer中
LifecycleContainer lifecycleContainer = mKeyToLifecycleContainers.get(key);
if (lifecycleContainer == null) {
lifecycleContainer = new LifecycleContainer(lifecycle);
}
LifecycleEventObserver observer = new LifecycleEventObserver() {
@Override
public void onStateChanged(
@NonNull LifecycleOwner lifecycleOwner,
@NonNull Lifecycle.Event event) {
if (Lifecycle.Event.ON_START.equals(event)) {//处理回调
mKeyToCallback.put(key, new CallbackAndContract<>(callback, contract));
if (mParsedPendingResults.containsKey(key)) {
@SuppressWarnings(“unchecked”)
final O parsedPendingResult = (O) mParsedPendingResults.get(key);
mParsedPendingResults.remove(key);
callback.onActivityResult(parsedPendingResult);
}
//从bundle中获取结果
final ActivityResult pendingResult = mPendingResults.getParcelable(key);
if (pendingResult != null) {
mPendingResults.remove(key);
//把结果回调给调用者
callback.onActivityResult(contract.parseResult(
pendingResult.getResultCode(),
pendingResult.getData()));
}
} else if (Lifecycle.Event.ON_STOP.equals(event)) {
mKeyToCallback.remove(key);//stop时移除
} else if (Lifecycle.Event.ON_DESTROY.equals(event)) {
unregister(key);//destory时注销
}
}
};
//添加观察者
lifecycleContainer.addObserver(observer);
mKeyToLifecycleContainers.put(key, lifecycleContainer);
//返回ActivityResultLauncher对象
return new ActivityResultLauncher() {
@Override
public void launch(I input, @Nullable ActivityOptionsCompat options) {
mLaunchedKeys.add(key);
//ActivityResultRegistry的onLaunch,抽象方法,在ComponentActivity内实现
onLaunch(requestCode, contract, input, options);
}
public void unregister() {
ActivityResultRegistry.this.unregister(key);
}
public ActivityResultContract<I, ?> getContract() {
return contract;
}
};
}
2.launch
ActivityResultRegistry
的onLaunch
是一个抽象方法,在ComponentActivity
内实现。首先会检查contract
是否能获取同步结果,如果能,则直接分发处理。比如权限申请,我前面已经获取了权限,直接可以通过getSynchronousResult
查询是否有权限。有直接返回true
,不再通过requestPermissions
去做申请权限。
在通过contract
获取Intent
,按Intent分为三种情况处理,第一种,权限申请,通过requestPermissions
去申请权限,第二种处理INTENT_SENDER
,和startIntentSenderForResult
类似。第三种,处理其它问题,通过startActivityForResult
启动Activity
public <I, O> void onLaunch(
final int requestCode,
@NonNull ActivityResultContract<I, O> contract,
I input,
@Nullable ActivityOptionsCompat options) {
ComponentActivity activity = ComponentActivity.this;
//如果能直接拿到结果,直接分发处理了。
final ActivityResultContract.SynchronousResult synchronousResult =
contract.getSynchronousResult(activity, input);
if (synchronousResult != null) {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
dispatchResult(requestCode, synchronousResult.getValue());
}
});
return;
}
// 根据协定创建Intent对象
最后
在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-UjEDfI3d-1715838139740)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!